2. SPI时钟极性(CPOL)与相位(CPHA):四种工作模式详解

SPI通信里最容易让人迷糊的,就是时钟极性(CPOL)和时钟相位(CPHA)这两个参数。我见过不少工程师,硬件连好了,代码也写了,就是通信死活不对——最后发现是模式没对上。说白了,这就是主设备和从设备对时钟的“理解”不一致。

咱们今天就把这事彻底讲清楚。

2.1 CPOL:时钟极性——空闲时时钟是高还是低?

CPOL,全称Clock Polarity,决定的是SCLK在空闲状态(也就是没有数据传输时)的电平。

  • CPOL = 0:空闲时SCLK为低电平(0)。
  • CPOL = 1:空闲时SCLK为高电平(1)。

你想想看,这就像两个人约定“不说话的时候嘴巴是闭着还是张着”。CPOL=0就是闭着嘴,CPOL=1就是张着嘴。很简单吧?

我的习惯:我个人习惯先把CPOL定下来,再看CPHA。因为CPOL决定了时钟的“基准线”,这个搞错了,后面的采样边沿全都会乱套。

2.2 CPHA:时钟相位——数据在哪个边沿采样?

CPHA,全称Clock Phase,决定的是数据在时钟的哪个边沿被采样(也就是被读取)。

  • CPHA = 0:在时钟的第一个边沿采样数据。
  • CPHA = 1:在时钟的第二个边沿采样数据。

这里要注意,“第一个边沿”和“第二个边沿”是相对于每个数据位传输周期来说的。一个完整的数据位周期,包含一个上升沿和一个下降沿。

容易踩的坑:我曾经在一个项目里,把CPHA搞反了。从设备手册上写的是“data sampled on rising edge”,我以为是上升沿采样,就把CPHA设成了0。结果通信全是乱码。后来仔细看时序图才发现,手册里说的“rising edge”其实是第二个边沿——因为CPOL=1时,第一个边沿是下降沿。所以,千万别只看文字描述,一定要对照时序图!

2.3 四种工作模式详解

把CPOL和CPHA组合起来,就得到了SPI的四种工作模式。我整理了一个表格,方便你对照查看:

模式 CPOL CPHA 空闲时钟电平 采样边沿 数据变化边沿
模式0 0 0 低电平 上升沿(第一个边沿) 下降沿(第二个边沿)
模式1 0 1 低电平 下降沿(第二个边沿) 上升沿(第一个边沿)
模式2 1 0 高电平 下降沿(第一个边沿) 上升沿(第二个边沿)
模式3 1 1 高电平 上升沿(第二个边沿) 下降沿(第一个边沿)

咱们来逐个拆解一下:

  • 模式0(CPOL=0, CPHA=0):最常用的模式。空闲时时钟为低,数据在上升沿被采样,在下降沿变化。很多Flash、ADC都默认用这个模式。
  • 模式1(CPOL=0, CPHA=1):空闲时时钟为低,数据在下降沿采样,在上升沿变化。这个模式用得相对少一些。
  • 模式2(CPOL=1, CPHA=0):空闲时时钟为高,数据在下降沿采样,在上升沿变化。有些传感器会用这个模式。
  • 模式3(CPOL=1, CPHA=1):空闲时时钟为高,数据在上升沿采样,在下降沿变化。这个模式也比较常见,尤其是在一些高速SPI设备中。

你发现规律了吗?CPHA=0时,采样边沿总是时钟的第一个边沿;CPHA=1时,采样边沿总是时钟的第二个边沿。 记住这个规律,比死记硬背表格要管用得多。

2.4 模式匹配的重要性

为什么模式匹配这么重要?因为主设备和从设备必须在同一个“节拍”上工作。如果主设备在上升沿采样,而从设备在下降沿输出数据,那主设备采到的就是“旧”数据,或者是不稳定的数据。

我举个例子你就明白了:

假设主设备配置成模式0(上升沿采样),从设备配置成模式2(下降沿采样)。主设备在上升沿去读数据线,但从设备的数据变化发生在上升沿(因为模式2的数据变化边沿是上升沿)。这就导致主设备读到的数据正好是从设备正在切换的瞬间——数据可能是不稳定的,甚至可能是错误的。

核心原则:主设备和从设备的CPOL和CPHA必须完全一致。一个用模式0,另一个也必须用模式0。否则,通信必然失败。

那怎么知道从设备支持哪种模式呢?看数据手册。手册里通常会有一个时序图,或者一个表格,明确标出设备支持的SPI模式。我建议你养成一个习惯:拿到一个新器件,第一件事就是翻到SPI时序那一页,确认它的工作模式。

2.5 知识结构图:SPI时钟配置核心逻辑

下面这张图,把CPOL、CPHA和四种模式的关系梳理清楚了。你可以把它当作一个快速参考。

SPI时钟配置核心逻辑 CPOL(时钟极性) CPHA(时钟相位) CPOL=0:空闲低电平 CPOL=1:空闲高电平 CPHA=0:第一个边沿采样 CPHA=1:第二个边沿采样 CPOL + CPHA → 四种工作模式 模式0 CPOL=0, CPHA=0 模式1 CPOL=0, CPHA=1 模式2 CPOL=1, CPHA=0 模式3 CPOL=1, CPHA=1 关键结论:主设备和从设备的CPOL、CPHA必须完全一致 否则数据采样边沿错位,通信必然失败

2.6 实战建议:如何快速确认模式?

在实际调试中,我一般按这个步骤来确认SPI模式:

  1. 查手册:找到从设备数据手册的SPI时序章节,看它支持哪些模式。
  2. 看时序图:重点关注空闲时SCLK的电平(确定CPOL),以及数据是在哪个边沿被采样的(确定CPHA)。
  3. 配置主设备:把主设备的SPI控制器配置成和从设备一样的模式。
  4. 用示波器抓波形:这是最直接的方法。抓一下SCLK和MOSI/MISO的波形,对照时序图,看看采样边沿对不对。
一个小技巧:如果你不确定从设备到底用哪个模式,可以试试模式0。因为大多数SPI设备默认都支持模式0,而且很多设备的数据手册里,时序图就是按模式0画的。当然,这只是一个“试错”的起点,最终还是要以手册为准。

好了,关于CPOL和CPHA,以及四种工作模式,就讲到这里。记住那个核心原则:主从模式必须匹配。下次调试SPI的时候,如果通信不正常,第一个要检查的就是这个。