3、SPI 四种工作模式(Mode0~Mode3)详解归纳总结

SPI 的四种工作模式,说白了就是时钟极性(CPOL)和时钟相位(CPHA)的排列组合。刚接触 SPI 时,我也被这几个模式绕晕过。后来调了一个传感器,死活读不到数据,抓波形才发现是模式没对上——嗯,从那以后我把这四种模式彻底搞清楚了。

3.1 CPOL 与 CPHA:两个关键参数

  • CPOL(Clock Polarity):空闲时时钟线的电平。
    CPOL=0 → 空闲低电平;CPOL=1 → 空闲高电平。
  • CPHA(Clock Phase):数据采样发生在哪个边沿。
    CPHA=0 → 第一个边沿采样;CPHA=1 → 第二个边沿采样。

你想想看,两个参数各有两种取值,组合起来正好是 2×2=4 种模式。我个人习惯用一张表格记下它们:

工作模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据输出边沿
Mode 0 0 0 低电平 上升沿 下降沿
Mode 1 0 1 低电平 下降沿 上升沿
Mode 2 1 0 高电平 下降沿 上升沿
Mode 3 1 1 高电平 上升沿 下降沿

3.2 Mode 0(CPOL=0, CPHA=0)——最常用

空闲时时钟为低。第一个边沿(上升沿)采样数据,第二个边沿(下降沿)输出数据。其实大部分 SPI 器件默认都是 Mode 0。我在项目中遇到过好几款 Flash 和 SD 卡,直接用 Mode 0 就能通。所以如果你不确定从设备支持哪种模式,可以先试试 Mode 0。

3.3 Mode 1(CPOL=0, CPHA=1)

空闲也是低电平,但数据是在第二个边沿(下降沿)采样的。这种模式不太常见,但有些 ADC 会用。我第一次调一个 16 位 ADC 时,数据老是错位,后来查手册发现它要求 Mode 1。印象很深。

小技巧: 如果从设备手册没明确写模式,一般会给出“时钟空闲电平”和“数据在哪个边沿有效”。对应上 CPOL 和 CPHA 就能推出模式。千万别猜,抓个逻辑分析仪波形最保险。

3.4 Mode 2(CPOL=1, CPHA=0)

空闲高电平,在第一个边沿(下降沿)采样。Mode 2 和 Mode 0 正好是“空闲电平颠倒”的关系。有些电机驱动芯片用这种模式,我调一款步进电机驱动时就遇到过,当时一看波形就明白:空闲高,下降沿采数。

3.5 Mode 3(CPOL=1, CPHA=1)

空闲高电平,在第二个边沿(上升沿)采样。Mode 3 也很常见,跟 Mode 0 一样是“亲民模式”。我曾经同时挂两个传感器,一个要求 Mode 0,一个要求 Mode 3,结果 MCU 只能配一种模式……最后不得已上了软件 SPI 才搞定。

重要提醒: 同一 SPI 总线上挂多个从设备时,所有从设备必须工作在同一种模式。如果模式不兼容,必须使用不同的 SPI 外设或软件模拟。千万注意!

3.6 四种模式速查指南

调板子时怎么快速确定模式?我的办法就三步:

  1. 翻从设备数据手册,找 “SPI Timing” 章节。
  2. 看波形图:空闲时 CLK 是低还是高(确定 CPOL)?数据采样是第一个边沿还是第二个边沿(确定 CPHA)?
  3. 对照上表匹配模式。

举个例子: 一段典型 SPI 时序代码的配置(以 STM32 HAL 为例):

// Mode 0: CPOL=0, CPHA=0
SPI_InitTypeDef spi;
spi.CLKPhase       = SPI_PHASE_1EDGE;    // 第一个边沿采样
spi.CLKPolarity    = SPI_POLARITY_LOW;   // 空闲低电平

// Mode 3: CPOL=1, CPHA=1
spi.CLKPhase       = SPI_PHASE_2EDGE;    // 第二个边沿采样
spi.CLKPolarity    = SPI_POLARITY_HIGH;  // 空闲高电平

现实中我还发现一个问题:有些国产芯片手册写得不规范,比如只写“在时钟上升沿采样”,却不写空闲电平。这时候你就得看时序图里 CLK 起始的电平,或者直接用逻辑分析仪实测。我吃过一次亏——一个温湿度传感器手册漏写了 CPHA 值,抓波形才发现它其实用的是 Mode 2。

核心记忆方法:
  • Mode 0:空闲低,上升沿采 → 最常用。
  • Mode 1:空闲低,下降沿采 → 少用。
  • Mode 2:空闲高,下降沿采 → 跟 Mode 0 电平反。
  • Mode 3:空闲高,上升沿采 → 跟 Mode 1 电平反。

说白了就是:CPOL 定空闲电平,CPHA 定采样发生在第几个边沿。记住这个,就不会迷糊。

最后放一张我常用的模式选择逻辑图,帮你理清思路:

SPI 四种工作模式选择逻辑 空闲时钟电平? CPOL = 0 (空闲低) 采样边沿? Mode 0 Mode 1 CPOL = 1 (空闲高) 采样边沿? Mode 2 Mode 3 先确定 CPOL(空闲电平),再确定 CPHA(采样边沿),即可锁定 Mode

调 SPI 说白了就是四个参数——CPOL 和 CPHA。分清它们,再看设备手册或者抓个波形,基本不会走偏。我个人习惯把所有 SPI 器件都优先用 Mode 0 试,不行再切。不过千万别偷懒省掉逻辑分析仪那一步,否则可能踩坑。嗯,这四种模式,你应该已经心里有数了。