STM32入门——SPI
嵌入式工程师成长日记 2025-01-09

(一)简介

  • 四根通信线:SCK、MOSI、MISO、SS(片选信号)
  • 同步(同步通信是一种通信模式,在这种模式下,发送方和接收方在同一时刻进行数据传输),全双工
  • 支持总线挂载多设备(仅一主多从),会有多根SS线

限制通讯速度100、400KHz


相对于I2C,SPI的优缺点:

①SPI协议并没有严格规定最大传输速度,其取决于芯片厂商需求。

②全双工,SPI硬件开销大,通讯过程中经常会有资源库浪费现象。

(二)硬件电路

  • 所有SPI设备的SCK、MOSI、MISO分别连在一起
    • SCK:时钟线完全由主机掌控
    • MOSI:主机输出,从机输入
    • MISO:主机输入,从机输出
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

SPI的输入输出引脚是固定的,基本不会出现冲突,因此可以使用推挽输出。但SPI仍有可能在MISO线上多个从机推挽输出造成冲突,因此SPI规定从机未被选中时候的MISO引脚必须为高阻态

(三)移位示意图

移位寄存器随着SCK的频率触发移位,会将箭头方向移出去的一位放到引脚上。在SCK频率触发的间隔,主机和从机都进行数据采集,获取移除位所在的引脚的电平存放到各自箭头方向连接的寄存器上。

多次后就完成了一个字节的数据交换只收或只发的情况下,只需要忽略掉发送或者接收信号即可。

(四)SPI时序基本单元

  • 起始条件:SS从高电平切换到低电平
  • 终止条件:SS从低电平切换到高电平
如果CPOL被清'0',SCK引脚在空闲状态保持低电平;如果CPOL被置'1',SCK引脚在空闲状态保持高电平。如果CPHA(时钟相位)位被置'1'SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为'1'时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。如果CPHA位被清'0',SCK时钟的第一边沿(CPOL位为'0'时就是上升沿,CPOL位为'1'时就是下降沿)进行数据位采样,数据在第一个时钟边沿被锁存。

【交换一个字节(模式0)】

  • (时钟极性)CPOL=0:空闲状态时,SCK为低电平
  • (时钟相位)CPHA=0:SCK第一个下降沿移入数据,第二个下降沿移出数据

MISO不发送数据时候为高阻态(中间线),只要SS不置高,可以一致重复交换数据。

【交换一个字节(模式1)】(常用、高速)

  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=1:SCK第一个下降沿移出数据,第二个下降沿移入数据

【交换一个字节(模式2)】

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=0:SCK第一个上升沿移入数据,第二个上升沿移出数据

【交换一个字节(模式3)】

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=1:SCK第一个上升沿移出数据,第二个上升沿移入数据

(五)SPI配置代码

1.初始化

SPI_InitTypeDef SPI_InitStructure;SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主 SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI 发送接收 8 位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式SPI_Init(SPI2, &SPI_InitStructure); //根据指定的参数初始化外设 SPIx 寄存器

2.使能SPI

SPI_Cmd(SPI2, ENABLE); //使能 SPI 外设SPI2_ReadWriteByte(0xff); //启动传输,主机发一个字节,进行一次传输,可以启动传输

3.SPI传输数据

//发送数据函数 void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); //接收数据函数 uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

4.查看 SPI 传输状态函数

判断数据是否传输完成,发送区是否为空

SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE);

判断接收是否完成,接收区是否空

SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) 


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
1
评论
同步通信要有一根时钟线,主从都有时钟控制,在主从握手时,时钟是如何变化到同步信号的?
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 8位32位MCU如何选择?如何选择合适的MCU?

    MCU,对于普通人而言,是一个高大上的存在。但是,在工业中,MCU确实常见产品。为增进大家对MCU的认识,本文将基于两点介绍MCU:1.8位MCU和32位MCU如何选择?2.如何选择合适的MCU。如果你对MCU具有兴趣,不妨继续往...

    昨天
  • ARM开发:一 ARM微处理器概述

    1.1ARM-Advanced RISC Machines ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术...

    前天
  • 分析C51单片机的一些误区和注意事项

    简介:常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。 1) C...

    前天
  • 51单片机几个延时程序

    简介:51单片机几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序(晶振12MHz,一个机器周期1us.) 程...

    前天
  • 总结单片机软件抗干扰的几种办法

    简介:在提高硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活、节省硬件资源、可靠性好越来越受到重视。下面以MCS-51单片机系统为例,对微机系统软件抗干扰方法进行研究。 1、软件抗干扰方法的研究 在工程实践中...

    前天
  • 基于C51单片机实现汽车座椅自动控制系统的软硬件设计

    引言 随着人们生活水平的提高,对汽车座椅的舒适性要求也越来越高,要求对汽车座椅地调节能够更加简单、方便、快捷。目前,汽车座椅位置的调节多采用基于手动调节方式的机械和电动控制两种方式。汽车座椅位置的调节...

    07-02
  • MCS51单片机程序设计时堆栈的计算方法解析

    用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己...

    07-02
  • 51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。...

    07-02
  • 51单片机学习单片机之路总结

    学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...

    07-02
  • hot51增强型单片机开发板原理图

    功能要求: 一):绿灯25s倒计时,绿灯过度红灯有5s黄灯时间,红灯25s后直接跳绿灯。 二):按键按下模拟闯红灯输入,产生5s蜂鸣器鸣叫。 开发环境: 软件:Keil uVision4 硬件:HOT51增强型单片机开发板 程序代码:...

    07-01
  • 51单片机的延时子程序

    延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系...

    07-01
  • 什么是Flash盘?Flash盘的结构是什么样的?

    Flash是大家常使用的存储之一,对于Flash,大家或多或少有所了解。上篇文章中,小编对Flash闪存的类型有所介绍。为继续增进大家对Flash的认识,本文将对Flash盘、Flash盘结构以及Flash读写操作予以介绍。如果你对本...

    07-01
下载排行榜
更多
评测报告
更多
广告