3、CPHA=0模式详解:数据在第一个时钟边沿采样
CPHA=0,说白了就是 SPI 最常用的模式。我做了这么多年嵌入式,遇到的项目里,大概有七成用的都是这个模式。它简单、直观,但坑也不少。
咱们先把这个模式的核心逻辑说清楚:在 CPHA=0 时,数据在第一个时钟边沿被采样。至于是上升沿还是下降沿采样,那得看 CPOL 怎么配。CPOL=0 时,时钟空闲为低,第一个边沿是上升沿,数据就在上升沿被采样;CPOL=1 时,时钟空闲为高,第一个边沿是下降沿,数据就在下降沿被采样。
3.1 数据采样时刻与建立/保持时间
咱们先看 CPHA=0 的典型时序图。我画了一张图,把关键节点都标出来了,你一看就明白。
从图上你能看到,CPHA=0 时,数据在时钟的第一个边沿被采样。但这里有个关键点:数据其实在时钟边沿到来之前就已经准备好了。也就是说,从机在时钟边沿之前的某个时刻,就已经把数据输出到 MOSI/MISO 线上了。
3.2 建立时间与保持时间要求
说到采样,就绕不开建立时间(tSU)和保持时间(tHD)。这两个参数,是 SPI 通信能否稳定的关键。
| 参数 | 定义 | CPHA=0 时的要求 | 典型值(@10MHz) |
|---|---|---|---|
| 建立时间 tSU | 数据在时钟边沿前必须稳定的最短时间 | 数据需在第一个边沿前 tSU 到达 | ≥ 5ns |
| 保持时间 tHD | 数据在时钟边沿后必须稳定的最长时间 | 数据需在第一个边沿后保持 tHD | ≥ 2ns |
你想想看,如果数据在时钟边沿到来时还没稳定,那采到的值可能就是错的。我在项目中遇到过好几次这种问题,最后发现都是因为 PCB 走线太长,导致数据延迟太大,建立时间不够。
3.3 数据输出时刻与时钟边沿的关系
CPHA=0 还有一个特点:数据在时钟边沿之后的下一个半周期被更新。也就是说,第一个边沿采样完当前位的数据后,从机就开始准备下一位的数据,并在第二个边沿(即下一个半周期)之前把数据输出到线上。
我习惯把这个过程拆成三步理解:
- CS 拉低:从机检测到 CS 拉低,开始准备第一个数据位。
- 第一个时钟边沿:主机采样当前数据位(此时数据已稳定)。
- 第二个时钟边沿:从机更新数据线,输出下一位数据。
说白了,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 下读写效率高 |
3.5 避坑指南:CPHA=0 的常见问题
做项目这么多年,我在 CPHA=0 上踩过的坑不少。挑几个典型的说说:
- 时钟频率过高导致建立时间不足:我曾经在一个项目里把 SPI 时钟配到了 20MHz,结果从机老是读到错误数据。后来用示波器一看,数据线的建立时间只有 2ns,而从机要求至少 5ns。降频到 10MHz 后问题解决。
- CS 拉低后数据未准备好:有些从机在 CS 拉低后需要一段时间才能输出第一个数据位。如果主机在 CS 拉低后立即发时钟,第一个采样点可能采到无效数据。我建议在 CS 拉低后加一个小的延迟(比如 100ns),给从机一点准备时间。
- 多设备级联时的时序冲突:级联多个设备时,每个设备的延迟会累加。我遇到过级联 4 个 ADC 的情况,最后一个设备的数据延迟太大,导致建立时间不满足。后来在 PCB 布局上做了等长走线,才把问题解决。
3.6 CPHA=0 与 CPHA=1 的对比
为了让你更清楚地理解 CPHA=0 的特点,我把它和 CPHA=1 做个对比:
| 对比项 | CPHA=0 | CPHA=1 |
|---|---|---|
| 采样边沿 | 第一个时钟边沿 | 第二个时钟边沿 |
| 数据更新时刻 | 第二个时钟边沿 | 第一个时钟边沿 |
| 建立时间要求 | 较高(数据需提前准备好) | 较低(数据有更多准备时间) |
| 典型应用 | ADC、DAC、传感器 | SD 卡、某些存储器 |
| 兼容性 | 最常用,兼容性好 | 部分设备使用 |
嗯,这里要注意:虽然 CPHA=0 对建立时间要求更高,但它的时序更直观,调试起来也更容易。我个人更推荐在项目初期先用 CPHA=0,等系统稳定后再根据具体设备调整。
好了,CPHA=0 的核心内容就这些。记住那个口诀:第一个边沿采样,数据提前准备好。下次调试 SPI 时,先确认一下时钟相位,能省不少事。