3. SPI时序参数详解:CPOL、CPHA与四种工作模式

SPI通信能不能跑稳,说到底就两个东西:时钟极性(CPOL)和时钟相位(CPHA)。这两个参数决定了数据在时钟的哪个边沿被采样、哪个边沿被切换。我见过不少工程师在这上面栽跟头——主设备配的是模式0,从设备默认是模式3,结果数据全乱套。

咱们先把这两个概念拆开看。

3.1 时钟极性(CPOL)

CPOL决定的是时钟空闲时的电平。说白了就是SCLK线上没数据传输时,是高电平还是低电平。

  • CPOL = 0:空闲时SCLK为低电平。时钟的第一个边沿是上升沿。
  • CPOL = 1:空闲时SCLK为高电平。时钟的第一个边沿是下降沿。

我个人习惯把CPOL想象成“时钟的起始姿势”。你想想看,如果空闲时是低电平,那第一个有效边沿必然是上升沿;反过来,空闲时是高电平,第一个有效边沿就是下降沿。这个逻辑很直观。

小技巧: 用逻辑分析仪抓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。我建议你拿到一个新器件时,先看数据手册里的时序图,确认它支持哪种模式。

避坑指南: 主设备和从设备的模式必须一致。不一致时,数据采样点会错位,导致通信失败。我曾经遇到过主设备配了模式0,从设备只支持模式3,结果花了半天才找到原因。

3.4 数据建立时间与保持时间

这两个参数是时序分析的核心。很多工程师只关注时钟频率,忽略了建立时间和保持时间,结果高速通信时数据出错。

  • 建立时间(tSU):数据在时钟采样边沿之前必须保持稳定的最短时间。
  • 保持时间(tH):数据在时钟采样边沿之后必须保持稳定的最长时间。

说白了,数据不能“卡点”到达采样边沿,必须提前稳定下来,并且稳定一段时间。你想想看,如果数据刚好在时钟边沿跳变,那采样到的值可能是0也可能是1,完全随机。

注意: 建立时间和保持时间是从设备数据手册里给出的参数。主控必须保证自己的时序满足这些要求。如果主控的时钟频率太高,或者走线太长导致信号延迟,就可能违反建立时间或保持时间。

我在项目中遇到过一个问题:SPI时钟频率从10MHz提高到20MHz后,数据偶尔出错。用逻辑分析仪抓波形才发现,数据线的建立时间不够了——从设备要求至少5ns的建立时间,但实际只有3ns。解决办法是降低时钟频率,或者优化PCB走线减少信号延迟。

3.5 最高时钟频率限制

SPI的最高时钟频率不是由主控单方面决定的,而是受限于整个通信链路中最慢的环节。

主要限制因素有三个:

  1. 从设备的最大时钟频率:数据手册里会明确给出。超过这个频率,从设备无法正确采样。
  2. PCB走线的信号完整性:频率越高,信号反射、串扰、衰减越严重。长走线会限制最高频率。
  3. 主控的驱动能力:主控的IO口驱动电流有限,频率太高时信号边沿会变缓。

我个人的经验是:实际使用的时钟频率不要超过从设备最大频率的80%。留点余量,系统更稳定。比如从设备标称最大20MHz,我一般跑到16MHz左右。

调试建议: 用逻辑分析仪抓取SCLK和MOSI/MISO的波形,观察数据是否在采样边沿附近稳定。如果数据跳变点离采样边沿太近,说明频率太高或走线延迟太大。

3.6 知识结构图

下面这张图把SPI时序参数的核心关系梳理清楚了。你可以把它当作调试时的快速参考。

SPI时序参数知识结构图 SPI时序参数核心结构 SPI时序参数 时钟极性 (CPOL) 时钟相位 (CPHA) 建立/保持时间 CPOL=0:空闲低电平 CPOL=1:空闲高电平 CPHA=0:第一个边沿采样 CPHA=1:第二个边沿采样 建立时间:采样前稳定 保持时间:采样后稳定 四种工作模式 (CPOL+CPHA组合) 模式0 (0,0) 模式1 (0,1) 模式2 (1,0) 模式3 (1,1)

3.7 实际调试中的时序检查清单

每次调试SPI接口时,我都会按这个清单检查一遍。你可以直接拿来用。

  1. 确认主从设备的模式一致:检查CPOL和CPHA配置是否匹配。
  2. 用逻辑分析仪抓取SCLK和CS信号:确认时钟空闲电平是否正确,CS的建立时间是否足够。
  3. 观察数据线的跳变点:数据是否在正确的时钟边沿切换?采样点是否在数据稳定区域?
  4. 测量建立时间和保持时间:用逻辑分析仪的测量工具,直接量数据边沿到采样边沿的时间差。
  5. 逐步提高时钟频率:从低速开始,每次翻倍,观察通信是否稳定。出现错误时,回退到上一个稳定频率。
核心原则: 数据必须在采样边沿之前稳定,并且在采样边沿之后保持稳定。只要抓住这个原则,SPI时序问题就解决了一大半。