2. SPI传输模式:模式0/1/2/3的时序图分析

说到SPI的四种模式,我估计很多刚入行的朋友都在这上面栽过跟头。说白了,模式0到模式3的区别,就是时钟极性(CPOL)和时钟相位(CPHA)的排列组合。CPOL决定时钟空闲时的电平,CPHA决定数据是在时钟的上升沿还是下降沿被采样。

我个人习惯把这四种模式画在一张时序图上对比着看。你想想看,如果只记文字描述,很容易搞混。但一旦把波形画出来,逻辑就清晰了。

2.1 模式0 (CPOL=0, CPHA=0)

这是最常用的模式,也是我项目中用得最多的。CPOL=0意味着SCK空闲时是低电平,CPHA=0表示数据在SCK的第一个边沿被采样——也就是上升沿。

模式0的关键特征:

  • SCK空闲状态:低电平
  • 数据采样边沿:上升沿(第一个边沿)
  • 数据变化边沿:下降沿

嗯,这里要注意:数据其实是在SCK上升沿之前就已经准备好了。也就是说,从机在SCK下降沿更新数据,主机在下一个上升沿去采样。这个建立时间的关系,我在调试一块ADC芯片时吃过亏——当时没注意从机的输出延迟,导致采样窗口不够。

2.2 模式1 (CPOL=0, CPHA=1)

模式1和模式0的CPOL一样,SCK空闲也是低电平。但CPHA=1,数据在SCK的第二个边沿被采样——也就是下降沿。

我曾经在一个项目中,主控芯片只支持模式0,但外设Flash只支持模式1。当时我硬着头皮用GPIO模拟SPI时序,才把数据读出来。所以我的建议是:选型时尽量让主从设备的模式匹配,否则就得自己写软件模拟,麻烦得很。

小技巧:如果你不确定外设支持哪种模式,可以看数据手册里的时序图。一般会明确标出CPOL和CPHA的值,或者直接写"Mode 0/1/2/3"。我习惯先看空闲时SCK是高还是低,再看数据是在哪个边沿被锁存,两步就能确定模式。

2.3 模式2 (CPOL=1, CPHA=0)

模式2的SCK空闲时是高电平,CPHA=0表示数据在第一个边沿采样——也就是下降沿(因为SCK从高变低)。

说实话,模式2和模式3在实际项目中用得相对少一些。但我记得有一次调试一个工业级的温度传感器,它偏偏就只支持模式2。当时我翻遍了主控的SPI配置寄存器,才找到对应的设置项。

2.4 模式3 (CPOL=1, CPHA=1)

模式3的SCK空闲是高电平,CPHA=1表示数据在第二个边沿采样——也就是上升沿。

这四种模式,其实没有谁好谁坏之分。关键是要和外设的时序要求匹配上。我见过不少工程师,一上来就默认用模式0,结果外设怎么都不工作,折腾半天才发现是模式没配对。

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

搞SPI设计,光知道模式还不够。你得理解建立时间(tSU)和保持时间(tH)这两个概念。说白了,建立时间就是数据在采样时钟沿之前必须稳定的最短时间,保持时间就是采样时钟沿之后数据必须继续稳定的最短时间。

为什么会这样?因为从机内部的寄存器需要一定的时间来锁存数据。如果数据变化太快,寄存器可能采到错误的值。

避坑指南:我曾经在一个高速SPI设计中(时钟频率50MHz),发现数据偶尔出错。排查了很久,最后用示波器一看,原来是PCB走线太长导致信号反射,建立时间不够了。解决办法是降低SPI时钟频率,或者缩短走线长度。

一般来说,SPI从机的建立时间和保持时间都在数据手册里有明确标注。比如常见的W25Q系列Flash,建立时间要求通常是5ns左右,保持时间要求是2ns左右。如果你的SPI时钟是20MHz(周期50ns),那这个裕量是足够的。但如果跑到100MHz(周期10ns),就得仔细算了。

2.6 LSB/MSB传输顺序

SPI支持两种位传输顺序:MSB First(高位在前)和LSB First(低位在前)。

我个人习惯用MSB First,因为大多数SPI外设都默认这个顺序。但要注意,有些外设(比如某些音频编解码器)会要求LSB First。如果你配反了,读出来的数据就是反的——比如你发0x80,对方收到的是0x01。

我记得有一次调试一个加速度计,读出来的数据总是怪怪的。后来发现是传输顺序没配对,把MSB和LSB搞反了。改过来之后,数据就正常了。

总结一下:

  • 模式0:CPOL=0, CPHA=0,上升沿采样,最常用
  • 模式1:CPOL=0, CPHA=1,下降沿采样
  • 模式2:CPOL=1, CPHA=0,下降沿采样
  • 模式3:CPOL=1, CPHA=1,上升沿采样
  • 建立时间:数据在采样沿前必须稳定的时间
  • 保持时间:数据在采样沿后必须稳定的时间
  • MSB First:高位在前,默认方式
  • LSB First:低位在前,特殊外设使用

2.7 四种模式对比图

下面这张SVG图,把四种模式的时序关系画在了一起。你可以直观地看到SCK波形和采样点的位置差异。

SPI四种模式时序对比图 模式0 (CPOL=0, CPHA=0) ↑采样 ↑采样 ↑采样 模式1 (CPOL=0, CPHA=1) ↓采样 ↓采样 ↓采样 模式2 (CPOL=1, CPHA=0) ↓采样 ↓采样 ↓采样 模式3 (CPOL=1, CPHA=1) ↑采样 ↑采样 ↑采样 图例: SCK时钟线 采样点位置 注:SCK空闲时,模式0/1为低电平,模式2/3为高电平

2.8 实际设计中的注意事项

最后,我分享几个实际设计中的经验:

  • 时钟频率选择:不要一味追求高速。SPI时钟频率受限于从机的最快响应速度,也受限于PCB走线的信号完整性。我一般会留20%的裕量。
  • 模式匹配:主从设备的SPI模式必须一致。如果不一致,要么改配置,要么用GPIO模拟。
  • 数据顺序:确认外设是MSB First还是LSB First。大多数MCU的SPI外设都支持配置,但有些低端芯片可能只支持一种。
  • 建立/保持时间:高速设计时一定要算。如果时序裕量不够,可以降低时钟频率,或者在数据线上加RC滤波。

我的习惯做法:拿到一个新外设,先看数据手册里的时序图,确认CPOL和CPHA。然后写一个简单的回环测试程序,发0x55(二进制01010101)和0xAA(二进制10101010),看读回来的数据对不对。这样能快速验证SPI配置是否正确。

好了,关于SPI的四种模式、时序分析、建立保持时间以及传输顺序,就讲到这里。这些内容虽然基础,但确实是SPI设计的核心。搞懂了这些,后面设计状态机的时候就会顺手很多。