3、SPI数据帧格式:CPOL与CPHA详解,4种工作模式(Mode 0/1/2/3)的波形分析
说到SPI,很多人觉得不就是四根线嘛,简单。但真到了项目里,两个芯片死活对不上话,示波器一抓波形全乱套——十有八九是CPOL和CPHA没配好。
我个人习惯,拿到一个新器件,第一件事就是翻数据手册,找到时序图,确认它工作在哪个Mode。这一步省了,后面全是坑。
3.1 CPOL和CPHA到底是什么?
先看两个概念,其实不复杂。
- CPOL(Clock Polarity):时钟极性。它决定SCLK空闲时是高电平还是低电平。
- CPOL = 0:空闲时SCLK为低电平
- CPOL = 1:空闲时SCLK为高电平
- CPHA(Clock Phase):时钟相位。它决定数据是在SCLK的上升沿采样,还是下降沿采样。
- CPHA = 0:在第一个时钟边沿采样(上升沿或下降沿取决于CPOL)
- CPHA = 1:在第二个时钟边沿采样
说白了,CPOL决定了时钟的“起始姿势”,CPHA决定了数据在哪个“动作”时刻被读取。
核心记忆法:
CPOL = 0,时钟空闲低;CPOL = 1,时钟空闲高。
CPHA = 0,第一个边沿采样;CPHA = 1,第二个边沿采样。
3.2 四种工作模式(Mode 0/1/2/3)
把CPOL和CPHA组合一下,就得到了四种模式。我直接给你列个表,一目了然。
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 |
|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿(第一个边沿) |
| Mode 1 | 0 | 1 | 低电平 | 下降沿(第二个边沿) |
| Mode 2 | 1 | 0 | 高电平 | 下降沿(第一个边沿) |
| Mode 3 | 1 | 1 | 高电平 | 上升沿(第二个边沿) |
嗯,这里要注意:Mode 0和Mode 3是最常用的。我做过的大部分传感器、ADC、LCD驱动,默认都是Mode 0。但有些奇葩芯片偏要用Mode 2,你不看手册就等着抓瞎吧。
3.3 波形分析:手把手看时序
光说理论没用,咱们直接看波形。我假设你发送一个字节 0x55(二进制 0101 0101),MSB先行。
Mode 0(CPOL=0, CPHA=0)
- 空闲时SCLK为低
- 第一个边沿(上升沿)采样数据
- 第二个边沿(下降沿)数据变化
波形逻辑:CS拉低后,SCLK从低变高,此时MOSI上的数据必须已经稳定。主设备在上升沿把数据读进去。下降沿时,从设备切换下一位数据。
我在项目中遇到过,有些MCU的SPI外设默认就是Mode 0,但如果你用GPIO模拟SPI,忘了在上升沿之前把数据准备好,读到的全是错的。
Mode 1(CPOL=0, CPHA=1)
- 空闲时SCLK为低
- 第一个边沿(上升沿)数据变化
- 第二个边沿(下降沿)采样数据
和Mode 0正好反过来。数据在上升沿切换,在下降沿被采样。你想想看,如果主设备在下降沿采样,那从设备必须在上升沿之后把数据准备好。
Mode 2(CPOL=1, CPHA=0)
- 空闲时SCLK为高
- 第一个边沿(下降沿)采样数据
- 第二个边沿(上升沿)数据变化
这个模式容易让人晕。空闲时时钟是高,第一个边沿是下降沿,数据在此时被采样。我刚开始做SPI驱动时,有一次把Mode 2配成了Mode 0,结果读回来的数据全是0xFF,折腾了一下午才发现是极性反了。
Mode 3(CPOL=1, CPHA=1)
- 空闲时SCLK为高
- 第一个边沿(下降沿)数据变化
- 第二个边沿(上升沿)采样数据
Mode 3和Mode 0一样常见。很多Flash芯片、SD卡都支持Mode 0和Mode 3。为什么?因为这两种模式下,数据采样都在上升沿,很多MCU的SPI外设对上升沿采样更友好。
避坑指南:
我曾经在一个项目里,主控用STM32,从设备是一颗国产ADC。手册上写支持Mode 0,结果死活不通。后来用示波器一看,ADC实际工作在Mode 1。国产芯片手册有时候写得不够严谨,遇到这种情况,直接抓波形最靠谱。
3.4 如何快速判断当前模式?
给你一个实用技巧。用示波器抓SCLK和MOSI/MISO,看空闲时SCLK的电平,再看数据变化和时钟边沿的关系。
- 先看空闲电平:低就是CPOL=0,高就是CPOL=1。
- 再看数据变化发生在哪个边沿:
- 如果数据在第一个边沿变化,那就是CPHA=0
- 如果数据在第二个边沿变化,那就是CPHA=1
举个例子:你看到空闲时SCLK是低,数据在上升沿之后变化,在下降沿被采样。那就是CPOL=0,CPHA=1,Mode 1。
重要提醒:
主设备和从设备的模式必须一致。一个工作在Mode 0,另一个工作在Mode 1,数据根本对不上。我见过有人把两个芯片都配成Mode 0,但一个CPOL配反了,结果通信时好时坏,这种问题最难排查。
3.5 实际项目中的选择建议
我个人建议,如果从设备支持多种模式,优先选Mode 0或Mode 3。原因很简单:
- Mode 0:大多数MCU的默认配置,兼容性最好
- Mode 3:和Mode 0一样在上升沿采样,但空闲时时钟为高,抗干扰能力稍强一些
至于Mode 1和Mode 2,除非从设备只支持这些模式,否则尽量避开。不是不能用,而是调试起来麻烦,容易出错。
最后说一句:不管用哪种模式,先看手册,再抓波形,最后写代码。这个顺序别搞反了。