SPI总线
1、SPI是一种同步串行全双工总线
2、SPI采用主从方式工作,提供时钟的设备为主设备,一般可以挂载多个从设备,主从关系不可以切换
3、每个从设备需要四根线完成通讯,分别是时钟线SCLK,片选信号线CS,主机输出从机输入MOSI,主机输入从机输出MISO。
4、SPI通讯根据片选信号选择当下需要通信的设备,因此主设备如果需要控制多个从设备则需要有多条片选。
5、SPI速率无固定标准,取决于主控芯片和从设备支持的最高频率。因为SPI没有像UART那样的起始/停止位,SPI每个时钟周期直接传输一位数据,接收一位数据。所以,SPI的时钟频率(也叫波特率)直接决定了传输速度。理论上,SPI的时钟频率可以很高,甚至达到数百兆赫兹。但实际中,从设备的处理能力往往是瓶颈。比如,ADXL355加速度计的SPI接口最大支持10MHz,超过这个频率它就“跟不上”了。
SPI拓扑
1、芯片与芯片之间如果支持SPI且电平标准一致,直连即可通讯,否则需要电平转换(专用电平转换芯片)。由于SPI的速度比较快,所以需要使用专用的电平转换芯片,不能使用MOS或三极管。
2、每个从机需要单独的片选信号,一般为低有效。需要和某个从机通讯时,主机将对应从机的CS拉低,而其他从机的CS保持高电平。
3、由于片选信号的存在,未被选中的设备(CS为高)的MISO信号将保持为高阻态,因此SPI可以采用推挽结构获得更强的驱动能力
所以SPI在电路设计上,直连即可
SPI串联电阻
在高速电路设计中,需要考虑到阻抗匹配问题(单端线控制阻抗50ohm,驱动器输入阻抗一般为30ohm左右),所以常会在SPI信号源端串连20~30ohm的电阻。
另走线上总会有寄生电容,若没有端接电阻的存在,上电瞬间的电压变化可能会非常陡峭,造成一系列的震荡,所以需要添加串阻来抑制震荡
源端串联22R电阻作用:
1、阻抗匹配,抑制反射
2、增加阻抗,抑制震荡
SPI时序
1、SPI在时钟的跳变沿采样
2、通过配置软件寄存器可以配置时钟空闲电平和具体采样方式:
时钟极性CKP(CPOL):CKP=0时,时钟空闲为低电平;CKP=1时,时钟空闲为高电平。
时钟相位CKE(CPHA):CKE=0时,时钟第一个跳变沿采样;CKE=1时,时钟第二个跳变沿采样。
说说SPI存在4种模式的由来:
SPI的4种模式(Mode 0、1、2、3)并不是协议强制要求的“规定”,而是为了兼容不同厂商芯片的时序习惯而衍生出来的时钟极性和相位组合。
简单说:SPI没有统一的“标准”时钟,所以通过CPOL(时钟极性)和CPHA(时钟相位)这两个参数,定义了4种“采样-移位”的时序组合,以确保主从机在正确的时刻锁存数据。
核心概念:时钟极性和相位
SPI通信由主机的SCLK(时钟)驱动,数据在MOSI/MISO上传输。关键问题是:数据到底是在时钟的上升沿还是下降沿被采样?空闲时时钟是高还是低?
- CPOL(时钟极性):决定SCLK空闲时(CS拉低前)是高电平还是低电平。
- CPOL = 0:空闲低电平
- CPOL = 1:空闲高电平
- CPHA(时钟相位):决定数据是在SCLK的第一个边沿还是第二个边沿被采样。
- CPHA = 0:在第一个边沿采样(前沿采样)
- CPHA = 1:在第二个边沿采样(后沿采样)
这两个参数组合,就产生了4种模式。
为什么需要这4种模式?
原因一:历史原因——芯片厂商的“自由发挥”
SPI协议最初由摩托罗拉提出,但并不是一个严格的标准。早期的Flash、EEPROM、ADC、传感器等芯片,各自定义了自己的SPI接口时序。有的芯片喜欢在上升沿发送数据,有的喜欢在下降沿发送,有的空闲电平要求高,有的要求低。
如果SPI只支持一种固定模式,那么很多老芯片就无法与新主机兼容。因此,协议设计者(实际上是各厂商的共识)定义了这4种组合,让主机可以通过软件配置来适配任意从机。
原因二:物理层面的时序容错
- 建立时间(Setup Time):数据必须在时钟边沿到来前稳定。
- 保持时间(Hold Time):数据必须在时钟边沿后保持一段时间。
不同的芯片对建立/保持时间的要求不同。通过选择不同的CPHA,可以让数据在更安全的窗口被采样。比如,如果主机的时钟边沿太陡峭,或者线路过长,你可能需要选择在第二个边沿采样(CPHA=1),给数据多留一点稳定时间。
原因三:与极性的匹配——避免毛刺
有些芯片内部逻辑是“低电平有效”或“高电平有效”的。如果时钟极性与芯片的内部逻辑不匹配,可能会导致在CS拉低后,SCLK的第一个边沿产生毛刺(glitch),被误认为是有效时钟。通过调整CPOL,可以让SCLK在CS有效期间保持稳定,避免误触发。
4种模式的具体表现(以8位数据为例)
| 模式 | CPOL | CPHA | 空闲时钟 | 数据采样边沿 | 典型应用 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 上升沿 | 最常用,绝大多数芯片默认 |
| Mode 1 | 0 | 1 | 低 | 下降沿 | 部分TI芯片 |
| Mode 2 | 1 | 0 | 高 | 下降沿 | 部分Motorola芯片 |
| Mode 3 | 1 | 1 | 高 | 上升沿 | 与Mode 0一样常见,兼容性最好 |
直观理解:
- Mode 0:时钟空闲为低,数据在时钟上升沿被锁存。
- Mode 3:时钟空闲为高,数据在时钟上升沿被锁存(和Mode 0的采样沿相同,但极性相反)。
为什么Mode 0和Mode 3最常用?
- Mode 0:因为空闲低电平,与大多数CMOS逻辑的默认状态一致,且上升沿采样符合“边沿触发”习惯,所以默认首选。
- Mode 3:因为空闲高电平,在CS拉低后,时钟先有一个下降沿,然后再上升沿采样,这给了从机一个“准备”时间,且兼容性极好(很多芯片手册直接写“SPI Mode 3”)。
实际工程中的建议
- 查数据手册:每个SPI外设芯片都会在手册中明确标注“Clock Polarity (CPOL) = ...,Clock Phase (CPHA) = ...”,或者直接写“Support SPI Mode 0/3”。
- 用示波器验证:如果手册不清晰,可以在调试时用示波器抓取CS、SCLK、MOSI的波形,看数据是在哪个边沿被锁存,然后反向配置主机的模式。
- 不要随意切换:一旦确定模式,不要随意改,否则会导致数据错位或通信失败。