QSPI 的四种模式(CPOL, CPHA)
做 QSPI 通信,绕不开的两个参数:CPOL(时钟极性)和 CPHA(时钟相位)。
说白了,它们决定了时钟线空闲时是什么电平,以及数据在哪个边沿被采样。为什么重要?我见过太多人在这上面栽跟头——明明波形看起来都对,就是读不出正确数据,最后发现主从设备模式没对上。
CPOL 和 CPHA 到底在定义什么?
你想想看,时钟线 SCK 在没传输数据的时候(片选 CS 无效期间),总要维持一个固定电平。CPOL 就是管这个的:
- CPOL = 0:空闲时 SCK 为低电平
- CPOL = 1:空闲时 SCK 为高电平
那 CPHA 呢?它决定了数据采样发生在时钟的第一个跳变沿还是第二个跳变沿:
- CPHA = 0:在第一个边沿采样
- CPHA = 1:在第二个边沿采样
这两个参数组合起来,正好就是 4 种模式。嗯,这里要注意:第一个边沿指的是从空闲状态开始的第一个跳变。CPOL=0 时空闲是低,第一个边沿就是上升沿;CPOL=1 时空闲是高,第一个边沿就是下降沿。
核心记忆口诀:“CPOL 定空闲,CPHA 定第几沿。CPHA=0 采第一个沿,CPHA=1 采第二个沿。”
四种模式速查表
下面这个表我建议你直接截图存下来,调试的时候对着看,能省不少时间。
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| 模式 0 | 0 | 0 | 低 | 上升沿(第一个) | 下降沿 |
| 模式 1 | 0 | 1 | 低 | 下降沿(第二个) | 上升沿 |
| 模式 2 | 1 | 0 | 高 | 下降沿(第一个) | 上升沿 |
| 模式 3 | 1 | 1 | 高 | 上升沿(第二个) | 下降沿 |
时序波形对比——一张图看懂
文字描述总是不够直观。下面这张 SVG 图把四种模式的时钟波形和数据采样点画在一起,你可以对照着看:
个人经验:我在调试一块 QSPI Flash 时,手册里写的是模式 3,但我把主控配成了模式 0。波形显示时钟完全反相,数据线也错位了一个边沿。后来用示波器仔细比对采样点,才找到原因——说白了就是 CPOL 配反了,导致采样时刻正好落在数据跳变上。
实际项目怎么选模式?
你手上拿到的 QSPI 器件(Flash、ADC、传感器等),数据手册里一定会写明支持的 SPI 模式。有时候它会写“支持模式 0 和模式 3”,有时候只写“CPOL=0, CPHA=0”。
我的习惯是:先看从设备手册的时序图,确认空闲电平是低还是高,然后看数据被采样的边沿。如果手册上没给模式编号,你就按 CPOL/CPHA 去配,错不了。
为什么我强调要先看从设备?因为很多主流 QSPI Flash(比如 Winbond、Macronix)默认工作在模式 0 或模式 3,而有的 MCU 默认是模式 0。如果不统一,通信直接失败。
避坑指南——我曾经踩过的坑
- 主从模式必须一致:主控和从设备必须工作在同一个模式下。我曾经天真地以为“只要边沿对上就行”,结果数据少了一位。后来发现 CPHA 不一致会导致数据移位一个时钟周期。
- 不要只看名字:有的芯片手册把模式写成“SPI mode 0”但实际时序图显示空闲高——那可能是手册写错了。请以时序图为准。
- 四线 QSPI 的采样沿和单线一样:QSPI 只是把数据线从 1 根变成 4 根(或者更多),但时钟极性和相位的定义完全沿用标准 SPI。别被“Quad”吓到,模式配置是一样的。
- 高速时注意建立/保持时间:模式本身不会导致时序问题,但高速下采样沿必须避开数据跳变区。有些器件在模式 0 下要求数据在上升沿之前稳定,你如果配成了模式 1,采样沿刚好是数据跳变,那就白忙了。
警告:不要在初始化代码中随便改 CPOL/CPHA。一定先确认从设备的时序要求,再编程。改错后波形看起来可能“差不多”,但数据正确率会急剧下降。我曾经调试一块 QSPI Nor Flash,读 ID 有时对有时错,最后发现是温度变化导致时钟边沿漂移,但根本原因是模式配错了半个周期。
小结
四种模式其实不难记。你只要抓住两个关键点:
- 空闲电平看 CPOL
- 采样边沿看 CPHA
然后把它们组合起来,就是完整的模式定义。实际项目中,我遇到最多的是模式 0 和模式 3,因为很多 MCU 默认模式 0,而大部分 Flash 支持模式 0 或模式 3。当你发现通信不稳定时,先用示波器抓一下 SCK 和数据线,对照上面那张图确认采样点位置。嗯,这一步能解决 80% 的问题。