3、CPHA=0模式详解:数据在第一个时钟边沿采样

CPHA=0,说白了就是 SPI 最常用的模式。我做了这么多年嵌入式,遇到的项目里,大概有七成用的都是这个模式。它简单、直观,但坑也不少。

咱们先把这个模式的核心逻辑说清楚:在 CPHA=0 时,数据在第一个时钟边沿被采样。至于是上升沿还是下降沿采样,那得看 CPOL 怎么配。CPOL=0 时,时钟空闲为低,第一个边沿是上升沿,数据就在上升沿被采样;CPOL=1 时,时钟空闲为高,第一个边沿是下降沿,数据就在下降沿被采样。

核心口诀:CPHA=0,第一个边沿采样;CPHA=1,第二个边沿采样。记住这个,调试时能省一半时间。

3.1 数据采样时刻与建立/保持时间

咱们先看 CPHA=0 的典型时序图。我画了一张图,把关键节点都标出来了,你一看就明白。

CPHA=0 时序图(CPOL=0 为例) SCLK T1 T2 T3 T4 T5 T6 T7 T8 MOSI Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 CS 采样点 tSU tSU tSU tHD tHD tHD 建立时间窗口 保持时间窗口

从图上你能看到,CPHA=0 时,数据在时钟的第一个边沿被采样。但这里有个关键点:数据其实在时钟边沿到来之前就已经准备好了。也就是说,从机在时钟边沿之前的某个时刻,就已经把数据输出到 MOSI/MISO 线上了。

3.2 建立时间与保持时间要求

说到采样,就绕不开建立时间(tSU)和保持时间(tHD)。这两个参数,是 SPI 通信能否稳定的关键。

参数 定义 CPHA=0 时的要求 典型值(@10MHz)
建立时间 tSU 数据在时钟边沿前必须稳定的最短时间 数据需在第一个边沿前 tSU 到达 ≥ 5ns
保持时间 tHD 数据在时钟边沿后必须稳定的最长时间 数据需在第一个边沿后保持 tHD ≥ 2ns

你想想看,如果数据在时钟边沿到来时还没稳定,那采到的值可能就是错的。我在项目中遇到过好几次这种问题,最后发现都是因为 PCB 走线太长,导致数据延迟太大,建立时间不够。

注意:CPHA=0 模式下,数据在第一个时钟边沿之前就已经被从机输出了。这意味着从机必须在时钟边沿到来前把数据准备好。如果从机响应慢,或者时钟频率太高,建立时间就可能不满足。

3.3 数据输出时刻与时钟边沿的关系

CPHA=0 还有一个特点:数据在时钟边沿之后的下一个半周期被更新。也就是说,第一个边沿采样完当前位的数据后,从机就开始准备下一位的数据,并在第二个边沿(即下一个半周期)之前把数据输出到线上。

我习惯把这个过程拆成三步理解:

  1. CS 拉低:从机检测到 CS 拉低,开始准备第一个数据位。
  2. 第一个时钟边沿:主机采样当前数据位(此时数据已稳定)。
  3. 第二个时钟边沿:从机更新数据线,输出下一位数据。

说白了,CPHA=0 就是「先准备数据,再采样,再准备下一个数据」的循环。这个节奏很自然,所以大多数 SPI 设备都默认用这个模式。

3.4 典型应用场景

CPHA=0 模式的应用场景非常广泛。我列几个常见的:

应用场景 典型设备 为什么用 CPHA=0
ADC 数据采集 AD7685、MCP3201 ADC 通常在时钟边沿输出数据,CPHA=0 正好匹配
DAC 输出控制 DAC8562、MCP4921 DAC 在第一个边沿锁存数据,CPHA=0 时序简单
传感器读取 MPU6050、BMP280 大多数传感器默认 CPHA=0,兼容性好
存储器访问 W25Q64、AT25SF041 Flash 在 CPHA=0 下读写效率高
我的经验:如果你不确定一个 SPI 设备用的是什么模式,先试试 CPHA=0、CPOL=0。这个组合兼容性最好,八成以上的设备都能正常工作。

3.5 避坑指南:CPHA=0 的常见问题

做项目这么多年,我在 CPHA=0 上踩过的坑不少。挑几个典型的说说:

  • 时钟频率过高导致建立时间不足:我曾经在一个项目里把 SPI 时钟配到了 20MHz,结果从机老是读到错误数据。后来用示波器一看,数据线的建立时间只有 2ns,而从机要求至少 5ns。降频到 10MHz 后问题解决。
  • CS 拉低后数据未准备好:有些从机在 CS 拉低后需要一段时间才能输出第一个数据位。如果主机在 CS 拉低后立即发时钟,第一个采样点可能采到无效数据。我建议在 CS 拉低后加一个小的延迟(比如 100ns),给从机一点准备时间。
  • 多设备级联时的时序冲突:级联多个设备时,每个设备的延迟会累加。我遇到过级联 4 个 ADC 的情况,最后一个设备的数据延迟太大,导致建立时间不满足。后来在 PCB 布局上做了等长走线,才把问题解决。
调试建议:遇到 SPI 通信问题,先用示波器抓 SCLK 和 MOSI/MISO 的波形。重点看数据在时钟边沿前是否已经稳定。如果数据在时钟边沿附近还在跳变,那就是建立时间不够,需要降频或优化走线。

3.6 CPHA=0 与 CPHA=1 的对比

为了让你更清楚地理解 CPHA=0 的特点,我把它和 CPHA=1 做个对比:

对比项 CPHA=0 CPHA=1
采样边沿 第一个时钟边沿 第二个时钟边沿
数据更新时刻 第二个时钟边沿 第一个时钟边沿
建立时间要求 较高(数据需提前准备好) 较低(数据有更多准备时间)
典型应用 ADC、DAC、传感器 SD 卡、某些存储器
兼容性 最常用,兼容性好 部分设备使用

嗯,这里要注意:虽然 CPHA=0 对建立时间要求更高,但它的时序更直观,调试起来也更容易。我个人更推荐在项目初期先用 CPHA=0,等系统稳定后再根据具体设备调整。

好了,CPHA=0 的核心内容就这些。记住那个口诀:第一个边沿采样,数据提前准备好。下次调试 SPI 时,先确认一下时钟相位,能省不少事。