【自学嵌入式:stm32单片机】SPI通信协议

SPI通信协议

关于SPI通信,也可参考我这篇文章:https://www.cnblogs.com/qinruiqian/p/19023950

SPI协议基本介绍

  • SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  • 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select,从机选择线,给低电平,高速从机要通信)
  • 同步,全双工
  • 支持总线挂载多设备(一主多从)

由于I2C通信用的上拉电阻+开漏的电路结构,使得通信线高电平的驱动能力比较弱,这就会导致,通信线由低电平变到高电平的时候,上升沿耗时比较长,这会限制I2C的最大通信速度,所以I2C的标准模式,只有100KHz的时钟频率,I2C的快速模式也只有400KHz,I2C后来通过改进电路的模式,可以达到3.4MHz,但是用的少,但是SPI的通信速度比这个就快很多。

image

硬件电路

  • 所有SPI设备的SCK、MOSI、MISO分别连在一起
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出(上升沿和下降沿都很快,不像I2C那样下降沿快但是上升沿缓慢),输入引脚配置为浮空或上拉输入

image

当从机的SS引脚高电平,也就是从机未被选中时,它的MISO引脚,必须切换位高阻态,相当于引脚断开,不输出任何电平,这也就防止,一条线有多个输出,而导致的电平冲突的问题了。

移位示意图

image
每来一个时钟,移位寄存器就会向左移位,从机主机的移位寄存器都是这样,移位寄存器的时钟源,是由主机提供的(波特率发生器),它产生的时钟驱动主机的移位寄存器进行移位,同时,这个时钟也通过SCK引脚进行输出,接到从机的移位寄存器里。
主机移位寄存器左边移出去的数据,通过MOSI引脚,输入到从机移位寄存器的右边,从机移位寄存器左边移出去的数据,通过MISO引脚,输入到主机移位寄存器的右边。
波特率发生器时钟的上升沿,所有移位寄存器向左移动一位,移出去的位放到引脚上,波特率发生器时钟的下降沿,引脚上的位,采样输入到移位寄存器的最低位。
发送和接收的流程:
image
上升沿:
image
下降沿:
image
以此类推...
SPI的基础是交换字节,一般接收的时候,为了交换字节,会统一发送0x00或0xFF

SPI时序基本单元

基本单元什么时候开始移位,是上升沿移位还是下降沿移位,SPI协议没有限定死,我们可以进行配置选择,这样的话,SPI就可以兼容更多的芯片,SPI通信协议有两个可配置的位:CPOL(Clock Polarity)时钟极性和CPHA(Clock Phase)时钟相位,每一位可以配置为1或0,共4种模式。

  • 起始条件:SS从高电平切换到低电平
  • 终止条件:SS从低电平切换到高电平

image

  • 交换一个字节(模式0,此模式应用最多)
  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

image

  • 交换一个字节(模式1,和刚才讲的移位模型是对应的)
  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

image

【注】MISO这里时序图最开始和结尾的线在中间,表示高阻态

  • 交换一个字节(模式2)
  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

image

  • 交换一个字节(模式3)
  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

image

SPI时序

以下指令都以W25Q64为例

发送指令

  • 向SS指定的设备,发送指令(0x06,W25Q64芯片里,0x06是写使能),看从机的指令集

image

指定地址写

  • 向SS指定的设备,发送写指令(0x02),随后在指定地址(Address[23:0],24位地址,先传高位)下,写入指定数据(Data)

image

指定地址读

  • 向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data)

image

posted @ 2025-08-23 11:42  秦瑞迁  阅读(127)  评论(0)    收藏  举报