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。波形看起来都正常,但数据就是不对。最后拿逻辑分析仪一量,发现主机在上升沿发数据,从机却在下降沿采样,永远错开半个周期。嗯,从那以后我每次接新器件都先核对模式。

如何避免?

  1. 认真读从机数据手册,找到 CPOL 和 CPHA 的要求。
  2. 在代码里明确设置 SPI 模式,不要依赖默认值。
  3. 用逻辑分析仪抓实际波形,对照数据手册上的时序图逐边沿检查。

一张图看懂四种模式的关系

下面这张图把 CPOL 和 CPHA 的组合与每种模式的采样/输出边沿画在一起,方便你对照记忆。

SPI 四种模式关系图 CPOL = 0 CPOL = 1 CPHA = 0 CPHA = 1 CPHA = 0 CPHA = 1 Mode 0 采样:上升沿 输出:下降沿 Mode 1 采样:下降沿 输出:上升沿 Mode 2 采样:下降沿 输出:上升沿 Mode 3 采样:上升沿 输出:下降沿 关键点 CPOL 决定空闲电平 → 决定第一个边沿是上升还是下降 CPHA 决定采样发生在第一个还是第二个边沿

这个图把四种模式的由来串了一遍。你从 CPOL 开始选,再选 CPHA,就能定位到具体模式。Mode 0 和 Mode 3 的采样边沿都是上升沿,但空闲电平不同——所以逻辑分析仪抓到的波形,空闲部分一眼就能区分。

实践:如何用逻辑分析仪快速判定模式

假设你手里已经抓到了一段 SPI 波形,但不知道从机配置了什么模式。我的做法是:

  1. 看空闲电平:时钟线在 CS 拉低之前是什么电平?如果是低 → CPOL=0;高 → CPOL=1。
  2. 找第一个数据变化:观察数据线(MOSI 或 MISO)在时钟的哪个边沿变化。如果数据在时钟的第一个边沿之后改变 → 采样发生在第一个边沿(CPHA=0);如果数据在第一个边沿之前就变了 → 采样发生在第二个边沿(CPHA=1)。
  3. 对照表格:用第一步和第二步的结果去查上面那张表,模式就出来了。

我建议你**:在逻辑分析仪软件里加上“采样点”标记或者注释,方便肉眼对。很多软件(比如 Saleae Logic)自带 SPI 分析插件,你只要设好 CPOL 和 CPHA,它会自动解码。不过别完全依赖自动解码——我遇到过自动解码把位序搞反的情况。还是人工过一遍最稳妥。

四个模式,一个避坑原则

说了这么多,其实只要记住一条:从机手册为准。不管主机默认是什么模式,最终以从机支持的为准。我曾经图省事,想着“反正 Mode 0 通用”,结果焊了一块板子上去,从机死活不响应。查了半天,发现那片子只支持 Mode 2。你想想看,如果当时我用逻辑分析仪看一下波形,几秒钟就能发现问题。

注意:** 有些 MCU 的 SPI 外设支持“SPI 模式切换”时会有延时,切换后需要先发送一个 dummy 字节让时钟稳定。我遇到过几次因为没加延时,第一个字节被错误采样的案例。

好了,四种模式就讲到这里。后面调试时,你拿着这张表和图对照波形,基本不会懵。