SPI 模式:CPOL 和 CPHA 四种模式详解
SPI 通信里有个特别容易让人晕的东西——模式选择。CPOL 和 CPHA,就两个位,却能组合出四种截然不同的时序。我刚开始学 SPI 时就被这玩意儿坑过,波形抓回来怎么都对不上,后来才明白是模式没设对。
说白了,CPOL 决定时钟空闲时的电平,CPHA 决定数据是在时钟的哪个边沿被采样。你想想看,两个选择各两种,2×2=4,刚好四种模式。咱们一个一个拆。
CPOL:时钟极性
- CPOL=0:空闲时时钟为低电平。有效信号靠上升沿或下降沿来驱动。
- CPOL=1:空闲时时钟为高电平。有效信号靠下降沿或上升沿来驱动。
我习惯把 CPOL 记成“空闲电平”:0 就是低,1 就是高,好记。
CPHA:时钟相位
- CPHA=0:数据在时钟的第一个跳变沿被采样(第一个边沿)。
- CPHA=1:数据在时钟的第二个跳变沿被采样(第二个边沿)。
这里有个细节:第一个边沿是哪个?取决于 CPOL。如果 CPOL=0,时钟从低变高,第一个边沿就是上升沿;如果 CPOL=1,时钟从高变低,第一个边沿就是下降沿。嗯,绕了点,但实际用起来就那么几种组合。
核心口诀:先定空闲电平,再定采样在哪一跳。
四种模式一览
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 上升沿(第一个边沿) | 下降沿 |
| Mode 1 | 0 | 1 | 低 | 下降沿(第二个边沿) | 上升沿 |
| Mode 2 | 1 | 0 | 高 | 下降沿(第一个边沿) | 上升沿 |
| Mode 3 | 1 | 1 | 高 | 上升沿(第二个边沿) | 下降沿 |
这张表我建议你存下来,调试时翻出来对照。Mode 0 和 Mode 3 用得最多,很多 SPI 器件默认就是 Mode 0。但千万别想当然——我遇到过一块加速度传感器,手册上写 Mode 2,结果我固件配了 Mode 0,数据全是乱的。
时序波形上的直观感受
用逻辑分析仪抓波形时,你看到的其实是时钟线(SCLK)和数据线(MOSI/MISO)的相对关系。我们拿 Mode 0 和 Mode 2 举例:
我的个人技巧:抓波形时先看空闲电平,一眼就能判断 CPOL。如果空闲是低 → CPOL=0;空闲是高 → CPOL=1。然后再看数据变化发生在哪边沿,就能推出 CPHA。
Mode 0:
- SCLK 空闲低。
- 第一个边沿(上升沿)采样数据,第二个边沿(下降沿)输出数据。
- 数据在时钟上升沿时被主机/从机读取。
Mode 2:
- SCLK 空闲高。
- 第一个边沿(下降沿)采样数据,第二个边沿(上升沿)输出数据。
Mode 1 和 Mode 3 则是采样边沿和输出边沿互换,但本质上还是“第一个边沿 vs 第二个边沿”的区别。
避坑指南:从机模式不匹配
我曾经踩过一个坑:主机用 Mode 0,从机用 Mode 1。波形看起来都正常,但数据就是不对。最后拿逻辑分析仪一量,发现主机在上升沿发数据,从机却在下降沿采样,永远错开半个周期。嗯,从那以后我每次接新器件都先核对模式。
如何避免?
- 认真读从机数据手册,找到 CPOL 和 CPHA 的要求。
- 在代码里明确设置 SPI 模式,不要依赖默认值。
- 用逻辑分析仪抓实际波形,对照数据手册上的时序图逐边沿检查。
一张图看懂四种模式的关系
下面这张图把 CPOL 和 CPHA 的组合与每种模式的采样/输出边沿画在一起,方便你对照记忆。
这个图把四种模式的由来串了一遍。你从 CPOL 开始选,再选 CPHA,就能定位到具体模式。Mode 0 和 Mode 3 的采样边沿都是上升沿,但空闲电平不同——所以逻辑分析仪抓到的波形,空闲部分一眼就能区分。
实践:如何用逻辑分析仪快速判定模式
假设你手里已经抓到了一段 SPI 波形,但不知道从机配置了什么模式。我的做法是:
- 看空闲电平:时钟线在 CS 拉低之前是什么电平?如果是低 → CPOL=0;高 → CPOL=1。
- 找第一个数据变化:观察数据线(MOSI 或 MISO)在时钟的哪个边沿变化。如果数据在时钟的第一个边沿之后改变 → 采样发生在第一个边沿(CPHA=0);如果数据在第一个边沿之前就变了 → 采样发生在第二个边沿(CPHA=1)。
- 对照表格:用第一步和第二步的结果去查上面那张表,模式就出来了。
我建议你**:在逻辑分析仪软件里加上“采样点”标记或者注释,方便肉眼对。很多软件(比如 Saleae Logic)自带 SPI 分析插件,你只要设好 CPOL 和 CPHA,它会自动解码。不过别完全依赖自动解码——我遇到过自动解码把位序搞反的情况。还是人工过一遍最稳妥。
四个模式,一个避坑原则
说了这么多,其实只要记住一条:从机手册为准。不管主机默认是什么模式,最终以从机支持的为准。我曾经图省事,想着“反正 Mode 0 通用”,结果焊了一块板子上去,从机死活不响应。查了半天,发现那片子只支持 Mode 2。你想想看,如果当时我用逻辑分析仪看一下波形,几秒钟就能发现问题。
注意:** 有些 MCU 的 SPI 外设支持“SPI 模式切换”时会有延时,切换后需要先发送一个 dummy 字节让时钟稳定。我遇到过几次因为没加延时,第一个字节被错误采样的案例。
好了,四种模式就讲到这里。后面调试时,你拿着这张表和图对照波形,基本不会懵。