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就是张着嘴。很简单吧?
2.2 CPHA:时钟相位——数据在哪个边沿采样?
CPHA,全称Clock Phase,决定的是数据在时钟的哪个边沿被采样(也就是被读取)。
- CPHA = 0:在时钟的第一个边沿采样数据。
- CPHA = 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的数据变化边沿是上升沿)。这就导致主设备读到的数据正好是从设备正在切换的瞬间——数据可能是不稳定的,甚至可能是错误的。
那怎么知道从设备支持哪种模式呢?看数据手册。手册里通常会有一个时序图,或者一个表格,明确标出设备支持的SPI模式。我建议你养成一个习惯:拿到一个新器件,第一件事就是翻到SPI时序那一页,确认它的工作模式。
2.5 知识结构图:SPI时钟配置核心逻辑
下面这张图,把CPOL、CPHA和四种模式的关系梳理清楚了。你可以把它当作一个快速参考。
2.6 实战建议:如何快速确认模式?
在实际调试中,我一般按这个步骤来确认SPI模式:
- 查手册:找到从设备数据手册的SPI时序章节,看它支持哪些模式。
- 看时序图:重点关注空闲时SCLK的电平(确定CPOL),以及数据是在哪个边沿被采样的(确定CPHA)。
- 配置主设备:把主设备的SPI控制器配置成和从设备一样的模式。
- 用示波器抓波形:这是最直接的方法。抓一下SCLK和MOSI/MISO的波形,对照时序图,看看采样边沿对不对。
好了,关于CPOL和CPHA,以及四种工作模式,就讲到这里。记住那个核心原则:主从模式必须匹配。下次调试SPI的时候,如果通信不正常,第一个要检查的就是这个。