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为例:
- CS拉低,通信开始。
- SCLK第一个边沿(上升沿)到来,此时不采样,只是把数据从移位寄存器推到数据线上。
- 数据线开始变化,从机或主机更新数据。
- 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的核心逻辑:
4.7 小结
CPHA=1不是什么高深的东西,但理解它和CPHA=0的差异,能帮你省下不少调试时间。记住三点:
- 采样在第二个边沿,更新在第一个边沿。
- 适合数据输出延迟大的外设,比如ADC。
- 调试时一定抓波形确认,别信手册上的文字描述。