01. SPI通信协议
SPI是一种常用的设备通信方式,它的特别之处在于能连续不断传输数据,可以一直发送或接收任意长度的信息。而I2C和串口(UART)则需要把数据分成小包发送,每包数据的长度是固定的。
一、SPI优缺点
优点:
- 不需要额外的开始和结束信号,数据能连续不断传输
- 不需要像I2C那样复杂的设备地址管理,传输速度大约是I2C的两倍
- 发送和接收线路完全独立,可以同时处理数据收发
缺点:
- 需要四根线(相比I2C和串口各多出两根)
- 没有数据接收成功的反馈机制(I2C有这个功能)
- 缺乏错误检测功能(比如像串口那样通过校验位检查错误)
二、SPI通信工作原理
SPI通信系统分为「主机」和「从机」两部分:
- 主机:负责控制(通常是主控芯片)
- 从机:执行指令(通常是传感器、存储芯片等外设)
SPI通信需要四根信号线:
- MOSI(主机输出/从机输入) 主机发送数据到从机的线路。
- MISO(主机输入/从机输出) 从机发送数据到主机的线路。
- SCLK(时钟信号) 主机产生的同步时钟,控制数据传输节奏。
- SS/CS(片选信号) 主机通过这条线选中某个从机,让它进入工作状态。
2.1、时钟信号
SPI通信的工作原理很简单:每个时钟脉冲传输一个数据位,传输速度直接由主机设定的时钟频率决定。因为时钟信号由主机生成,所以整个通信过程始终由主机发起。
同步通信的定义也很直观:只要设备共享同一个时钟信号进行数据传输,就属于同步方式。SPI就是典型的同步协议。而像UART这样的异步通信则不同,它不依赖共享时钟——双方设备提前约定好波特率(数据传输速度),通过这个共同的参数来协调数据发送和接收的节奏。
简单来说:
- 同步通信(如SPI):用共同时钟精准控制数据传输
- 异步通信(如UART):靠双方预设的波特率来匹配速度
·
2.2、片选信号
主机通过将CS/SS信号线拉低(设为低电平)来启动与从机的通信。当不传输数据时,这条信号线会保持高电平状态。主机通常配备多个CS/SS引脚,这样就能通过不同的信号线同时与多个设备进行通信。
2.3、MOSI和MISO
主机通过MOSI
以串行方式将数据发送给从机,从机也可以通过MISO
将数据发送给主机,两者可以同时进行。所以理论上,SPI
是一种全双工的通讯协议。
传输步骤:以传输模式:CPOL = 0
、CPHA = 0
为例:
主机输出时钟信号
主机拉低SS / CS
引脚,激活从机
主机通过MOSI
将数据发送给从机
如果需要响应,则从机通过MISO
将数据返回给主机
三、数据传输
以下是更简洁直白的改写版本:
在SPI通信开始时,主设备会先设置一个最高约几兆赫兹的时钟频率(从设备支持的最大值)。接着,主设备通过将目标从设备的SS信号线拉低来选中它。如果需要等待某个操作完成(比如数据转换),主设备必须等完成后再继续发送时钟信号。
通信过程中,每个时钟周期都会同时双向传输数据:
- 主设备通过MOSI线发送1位数据给从设备;
- 同时,从设备通过MISO线回传1位数据给主设备。
即使只需要单向传输(比如只发数据给从设备),双方仍会保持这种双向交换的模式(主设备可能发送无效数据,但流程不变)。
具体传输过程如下:
- 主从设备内部各有一个寄存器(类似数据队列),两者首尾相连形成一个“环形通道”。
- 数据通常从最高位开始传输。每个时钟边沿,双方各自移出1位数据并发送给对方。
- 下一时钟边沿,双方接收对方的数据,并存入自己寄存器的最低位。
- 每完成一次“发送-接收”,双方就交换了1位数据。重复这个过程直到所有数据位传输完毕。
- 如果数据长度超过寄存器位数(比如寄存器是8位,但要传16位数据),就分多次循环完成。
最后,通信结束时:
- 主设备停止发送时钟信号;
- 并取消选中从设备(SS线恢复高电平)。
- 未被选中的从设备需完全忽略总线上的时钟和MOSI信号,也不能通过MISO发送任何数据。
:::
核心要点总结:
流程:选中设备→等待(如需要)→时钟同步→双向传输→完成→结束。
数据交换:像接力赛一样,双方同时交换数据位,直到全部完成。
寄存器作用:临时存储待发送/接收的数据,按位逐次传输。
关键规则:未被选中的设备完全“隐身”,不参与任何操作。 :::
四、模式
分别是 CPOL (Clock POlarity)和 CPHA (Clock PHAse)。
- CPOL配置SPI总线的极性
- CPHA配置SPI总线的相位
SPI总线的极性:CPOL
极性,会直接影响SPI总线空闲时的时钟信号是高电平还是低电平。
- CPOL = 1:表示空闲时是高电平
- CPOL = 0:表示空闲时是低电平
SPI总线的相位
一个时钟周期会有2个跳变沿。而相位,直接决定SPI总线从那个跳变沿开始采样数据。
- CPHA = 0:表示从第一个跳变沿开始采样
- CPHA = 1:表示从第二个跳变沿开始采样
4种模式
CPOL 和 CPHA 的不同组合,形成了SPI总线的不同模式。
mode | CPOL | CPHA |
---|---|---|
mode 0 | 0 | 0 |
mode 1 | 0 | 1 |
mode 2 | 1 | 0 |
mode 3 | 1 | 1 |
模式0 (CPOL=0; CPHA=0)
特性:
CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿
CPHA = 0:数据在第1个跳变沿采样
2
模式1 (CPOL=0; CPHA=1)
特性:
CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿
CPHA = 1:数据在第2个跳变沿采样
2
模式2 (CPOL=1; CPHA=0)
特性:
CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿
CPHA = 0:数据在第1个跳变沿采样
2
模式3 (CPOL=1; CPHA=1)
特性:
CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿
CPHA = 1:数据在第2个跳变沿采样
2