3. SPI时序参数详解:CPOL、CPHA与四种工作模式
SPI通信能不能跑稳,说到底就两个东西:时钟极性(CPOL)和时钟相位(CPHA)。这两个参数决定了数据在时钟的哪个边沿被采样、哪个边沿被切换。我见过不少工程师在这上面栽跟头——主设备配的是模式0,从设备默认是模式3,结果数据全乱套。
咱们先把这两个概念拆开看。
3.1 时钟极性(CPOL)
CPOL决定的是时钟空闲时的电平。说白了就是SCLK线上没数据传输时,是高电平还是低电平。
- CPOL = 0:空闲时SCLK为低电平。时钟的第一个边沿是上升沿。
- CPOL = 1:空闲时SCLK为高电平。时钟的第一个边沿是下降沿。
我个人习惯把CPOL想象成“时钟的起始姿势”。你想想看,如果空闲时是低电平,那第一个有效边沿必然是上升沿;反过来,空闲时是高电平,第一个有效边沿就是下降沿。这个逻辑很直观。
3.2 时钟相位(CPHA)
CPHA决定的是数据在哪个时钟边沿被采样。这个稍微绕一点。
- CPHA = 0:在时钟的第一个边沿采样数据。数据在第一个边沿之前就已经准备好。
- CPHA = 1:在时钟的第二个边沿采样数据。数据在第一个边沿之后才切换。
嗯,这里要注意:CPHA=0时,数据必须在第一个时钟边沿之前就稳定下来。我曾经调试一个温湿度传感器,从设备要求CPHA=0,但主控默认配成了CPHA=1,结果读出来的温度值一直在跳——不是传感器坏了,是采样点错了。
3.3 四种工作模式
CPOL和CPHA组合起来,就是SPI的四种工作模式。我建议你把这个表格存下来,调试时经常要用到。
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 | 数据切换边沿 |
|---|---|---|---|---|---|
| 模式0 | 0 | 0 | 低 | 上升沿 | 下降沿 |
| 模式1 | 0 | 1 | 低 | 下降沿 | 上升沿 |
| 模式2 | 1 | 0 | 高 | 下降沿 | 上升沿 |
| 模式3 | 1 | 1 | 高 | 上升沿 | 下降沿 |
最常用的是模式0和模式3。大部分SPI从设备默认支持模式0,但有些高速器件偏爱模式3。我建议你拿到一个新器件时,先看数据手册里的时序图,确认它支持哪种模式。
3.4 数据建立时间与保持时间
这两个参数是时序分析的核心。很多工程师只关注时钟频率,忽略了建立时间和保持时间,结果高速通信时数据出错。
- 建立时间(tSU):数据在时钟采样边沿之前必须保持稳定的最短时间。
- 保持时间(tH):数据在时钟采样边沿之后必须保持稳定的最长时间。
说白了,数据不能“卡点”到达采样边沿,必须提前稳定下来,并且稳定一段时间。你想想看,如果数据刚好在时钟边沿跳变,那采样到的值可能是0也可能是1,完全随机。
我在项目中遇到过一个问题:SPI时钟频率从10MHz提高到20MHz后,数据偶尔出错。用逻辑分析仪抓波形才发现,数据线的建立时间不够了——从设备要求至少5ns的建立时间,但实际只有3ns。解决办法是降低时钟频率,或者优化PCB走线减少信号延迟。
3.5 最高时钟频率限制
SPI的最高时钟频率不是由主控单方面决定的,而是受限于整个通信链路中最慢的环节。
主要限制因素有三个:
- 从设备的最大时钟频率:数据手册里会明确给出。超过这个频率,从设备无法正确采样。
- PCB走线的信号完整性:频率越高,信号反射、串扰、衰减越严重。长走线会限制最高频率。
- 主控的驱动能力:主控的IO口驱动电流有限,频率太高时信号边沿会变缓。
我个人的经验是:实际使用的时钟频率不要超过从设备最大频率的80%。留点余量,系统更稳定。比如从设备标称最大20MHz,我一般跑到16MHz左右。
3.6 知识结构图
下面这张图把SPI时序参数的核心关系梳理清楚了。你可以把它当作调试时的快速参考。
3.7 实际调试中的时序检查清单
每次调试SPI接口时,我都会按这个清单检查一遍。你可以直接拿来用。
- 确认主从设备的模式一致:检查CPOL和CPHA配置是否匹配。
- 用逻辑分析仪抓取SCLK和CS信号:确认时钟空闲电平是否正确,CS的建立时间是否足够。
- 观察数据线的跳变点:数据是否在正确的时钟边沿切换?采样点是否在数据稳定区域?
- 测量建立时间和保持时间:用逻辑分析仪的测量工具,直接量数据边沿到采样边沿的时间差。
- 逐步提高时钟频率:从低速开始,每次翻倍,观察通信是否稳定。出现错误时,回退到上一个稳定频率。