4、CPHA=1模式详解:数据在第二个时钟边沿采样

好,咱们接着聊CPHA。上一章讲了CPHA=0,这一章重点说CPHA=1。说实话,很多工程师对CPHA=1的理解停留在“第二个边沿采样”这句话上,但实际用起来,坑不少。我最早接触CPHA=1是在一个ADC采集项目里,当时波形怎么都对不上,折腾了两天才发现是相位理解反了。

4.1 CPHA=1的核心时序

CPHA=1的定义很简单:数据在SCLK的第二个边沿被采样。注意,这里的“第二个边沿”是相对于片选CS拉低之后说的。

  • CPOL=0, CPHA=1:空闲时SCLK为低,数据在SCLK的上升沿采样(第二个边沿是上升沿)。
  • CPOL=1, CPHA=1:空闲时SCLK为高,数据在SCLK的下降沿采样(第二个边沿是下降沿)。

你想想看,这和CPHA=0正好反过来。CPHA=0是在第一个边沿采样,CPHA=1是在第二个边沿采样。这个差异直接决定了数据建立时间和保持时间的窗口位置。

核心记忆点:CPHA=1模式下,数据在SCLK的第二个边沿被锁存。第一个边沿只是用来移位数据,不采样。

4.2 与CPHA=0的波形差异

咱们直接对比一下波形,这样最直观。假设CPOL=0,即SCLK空闲为低。

特性 CPHA=0 CPHA=1
采样边沿 第一个边沿(上升沿) 第二个边沿(上升沿)
数据变化时刻 第一个边沿之后 第一个边沿之前
CS拉低后首个数据 必须在第一个边沿前准备好 可以在第一个边沿后变化
建立时间窗口 第一个边沿之前 第二个边沿之前

说白了,CPHA=0要求数据在第一个边沿之前就稳定,而CPHA=1允许数据在第一个边沿之后才变化。这个差异在实际调试中非常明显。

我记得有一次调试一个SPI Flash,用CPHA=0死活读不到正确数据,波形上看数据在第一个边沿时还没稳定。换成CPHA=1之后,一切正常。因为CPHA=1给了数据多半个时钟周期的缓冲时间。

个人经验:如果你的从设备数据输出延迟比较大,试试CPHA=1。它往往能帮你避开建立时间不足的问题。

4.3 数据采样时刻详解

咱们把时序拆开来看。以CPOL=0, CPHA=1为例:

  1. CS拉低,通信开始。
  2. SCLK第一个边沿(上升沿)到来,此时不采样,只是把数据从移位寄存器推到数据线上。
  3. 数据线开始变化,从机或主机更新数据。
  4. SCLK第二个边沿(下一个上升沿)到来,此时采样,锁存数据线上的值。

为什么会这样?因为CPHA=1模式下,第一个边沿是“数据更新边沿”,第二个边沿才是“数据锁存边沿”。这和CPHA=0正好相反。

注意:很多芯片的数据手册会画时序图,但标注可能不清晰。我建议你拿到新芯片时,先用示波器抓一下CS、SCLK和MOSI/MISO的波形,确认采样边沿到底在哪。我曾经因为相信手册上的文字描述,结果被坑了一整天。

4.4 适用外设分析

不是所有外设都适合CPHA=1。根据我的项目经验,以下几类外设比较常见:

  • ADC/DAC转换器:很多高速ADC要求数据在第二个边沿采样,因为转换结果在第一个边沿之后才稳定输出。比如AD7685、ADS1256这些芯片,数据手册里明确写着CPHA=1。
  • SPI Flash存储器:部分SPI Flash支持CPHA=1模式,尤其是那些支持双倍数据速率(DDR)的型号。不过大多数标准SPI Flash默认用CPHA=0。
  • 传感器接口:一些温度传感器、压力传感器,为了降低功耗,会在第一个边沿之后才更新数据,用CPHA=1更合适。
  • 移位寄存器级联:当你用SPI控制多个74HC595或74HC165时,CPHA=1可以简化时序设计,因为数据在第一个边沿更新,第二个边沿锁存,级联时不容易出现竞争。

反过来,不推荐用CPHA=1的场景:

  • 对实时性要求极高的控制信号,比如PWM配置、电机驱动。因为CPHA=1多了一个时钟周期的延迟。
  • 老旧的外设芯片,很多只支持CPHA=0。

4.5 避坑指南:CPHA=1的常见陷阱

我踩过的坑,你最好别踩。

陷阱1:CS拉低后的第一个数据

CPHA=1模式下,CS拉低后,第一个数据可以在第一个SCLK边沿之后才变化。但有些从设备会要求CS拉低后立即输出第一个bit。如果你遇到这种情况,检查一下从设备的时序图,看看它是不是真的支持CPHA=1。

陷阱2:连续传输时的数据间隙

CPHA=1模式下,如果两个字节之间CS保持低电平,SCLK连续输出,那么最后一个bit的采样和下一个字节第一个bit的更新可能会重叠。我建议在字节之间插入一个SCLK周期的空闲时间,或者干脆拉高CS再拉低。

我的调试习惯:每次配置SPI时,我都会在代码里显式设置CPHA和CPOL,而不是依赖默认值。然后抓波形确认。这个习惯帮我避免了很多“莫名其妙”的通信失败。

4.6 知识结构图

下面这张图帮你理清CPHA=1的核心逻辑:

CPHA=1 模式知识结构图 CPHA=1 模式知识结构 CPHA=1 核心定义 第二个边沿采样 与CPHA=0差异 采样边沿相反 适用外设 ADC/Flash/传感器 避坑指南 CS时序/数据间隙 调试建议 示波器抓波形 CPHA=1 本质:第一个边沿更新数据,第二个边沿锁存数据

4.7 小结

CPHA=1不是什么高深的东西,但理解它和CPHA=0的差异,能帮你省下不少调试时间。记住三点:

  • 采样在第二个边沿,更新在第一个边沿。
  • 适合数据输出延迟大的外设,比如ADC。
  • 调试时一定抓波形确认,别信手册上的文字描述。