QSPI协议基础:信号线定义与四种工作模式

要讲清楚QSPI Flash的启动时序,咱们得先把最底层的通信协议掰扯明白。QSPI全称是Quad SPI,说白了就是传统SPI的升级版——多加了4条数据线,吞吐量直接翻了四倍。我刚开始接触这个协议时,光看芯片手册上的时序图就头晕,后来亲手调了几块板子,才发现其实核心概念就那几样东西。

信号线定义

一个标准的QSPI接口,最少需要5根信号线。但实际用起来,通常会扩展到8根左右。我整理了一张表格,方便你对照理解。

信号名称 方向 功能说明
SCLK 主→从 串行时钟,由主控端产生。频率决定了传输速率
CS# 主→从 片选信号,低电平有效。拉低表示选中从设备
MOSI / IO0 主→从 主出从入,也是双向数据线IO0
MISO / IO1 从→主 主入从出,也是双向数据线IO1
IO2 双向 QSPI模式下扩展数据线,标准SPI不用
IO3 双向 QSPI模式下扩展数据线,标准SPI不用

这里有个细节要特别注意——CS#上的波形必须干净。我在一个项目中遇到过Flash启动偶尔失败,查了三天发现是CS#线上有个毛刺,导致Flash误判了一次片选结束。嗯,这类问题在高速时钟下特别容易出现。

避坑指南:我曾经用过一款国产FPGA驱动Winbond的QSPI Flash,结果发现IO2和IO3默认是输入方向,得在初始化时额外配置。如果不配,数据根本读不回来。不同厂商的Flash,IO引脚的上电状态可能不一样,一定要看手册。

四种工作模式

QSPI的四种模式,区别其实就两点:时钟极性(CPOL) 和 时钟相位(CPHA)。CPOL决定空闲时时钟是高还是低,CPHA决定数据采样发生在时钟的哪个边沿。你想想看,这两个参数排列组合,正好是四种情况。

模式定义速查表

模式 CPOL CPHA 空闲时钟电平 数据采样边沿
Mode 0 0 0 低电平 第一个跳变沿(上升沿)
Mode 1 0 1 低电平 第二个跳变沿(下降沿)
Mode 2 1 0 高电平 第一个跳变沿(下降沿)
Mode 3 1 1 高电平 第二个跳变沿(上升沿)

我个人的习惯是,遇到新芯片先看看它默认支持哪个模式。绝大多数QSPI Flash默认工作在Mode 0或Mode 3。为什么?因为这两个模式都在上升沿采样数据,对于主控端来说时序更容易满足。

小技巧:如果你的主控端时钟频率很高(比如超过50MHz),尽量选Mode 3。两个时钟边沿都在中间位置,留给数据建立和保持的时间窗口更大。我调过一款400Mbps的QSPI,用Mode 3比Mode 0更容易收敛时序。

各模式时序特点

咱们详细看看每种模式的波形特点。为了方便理解,我画了一张对比图。

QSPI四种工作模式时序对比 Mode 0 (CPOL=0, CPHA=0) SCLK空闲低,上升沿采样数据,下降沿输出数据 采样在上升沿 Mode 1 (CPOL=0, CPHA=1) SCLK空闲低,下降沿采样数据,上升沿输出数据 采样在下降沿 Mode 2 (CPOL=1, CPHA=0) SCLK空闲高,下降沿采样数据,上升沿输出数据 采样在下降沿 Mode 3 (CPOL=1, CPHA=1) SCLK空闲高,上升沿采样数据,下降沿输出数据 采样在上升沿 Mode 0 SCLK MOSI Mode 3 SCLK MOSI ● 采样点(红色) 数据在采样点时必须稳定 总结:Mode 0和Mode 3采样在上升沿,Mode 1和Mode 2采样在下降沿 上升沿采样通常时序更友好,这也是大多数Flash默认Mode 0的原因

为什么会有两个时钟边沿的延迟时序?说白了,这是为了给数据总线留出切换方向的时间。我记得第一次写QSPI驱动时,没搞懂这个细节,代码里用错CPHA,结果所有数据都偏移了一个时钟周期,怎么读都是乱码。

核心结论:主控端和从设备必须工作在同一模式下,否则数据根本对不上。Boot ROM里一般默认用Mode 0,但有些厂商为了降低EMI,会推荐用Mode 3。你选哪个?我的建议是:先看Boot ROM的要求,再看Flash手册的推荐。

模式不匹配的后果

我碰到过最典型的一次问题:客户用了一款新出的国产Flash,手册上写支持Mode 0/3,但实际测试发现Mode 0的时序窗口特别窄。我仔细一看,那款Flash内部用了边沿触发器,上升沿采样时对数据的建立时间要求很苛刻。换成Mode 3后,问题立刻消失了。

你想想看,如果主控端配了Mode 0,Flash却工作在Mode 2,会发生什么?数据会在下降沿被采样,但主控端以为在上升沿采样——结果就是每个字节都错位。这类bug非常隐蔽,用示波器看波形也看不出明显异常,只有用逻辑分析仪抓数据时才能发现规律性错位。

经验之谈:我自己的习惯是,在初始化QSPI之前,先发一个读取ID的命令(0x9F)。如果读回来的ID和手册上的一致,说明模式匹配上了。这个方法比查手册更靠谱,因为它直接验证了物理层的通信是否正常。

四种模式在实际项目中的选择

最后总结一下各模式的应用场景:

  • Mode 0——兼容性最好,几乎所有Flash都支持。Bootstrap阶段最安全的选择。
  • Mode 1——相对少见,时钟边沿在下降沿采样。如果主控端时钟占空比有偏差,这个模式会更敏感。
  • Mode 2——与Mode 1对称,空闲时钟为高。很少在QSPI Flash中见到。
  • Mode 3——高频场景首选。因为两个边沿都远离数据变化时刻,建立时间和保持时间最宽松。

我个人建议,如果你的目标频率低于40MHz,直接用Mode 0,省心。如果超过40MHz,试试Mode 3。这两个模式覆盖了市面上99%的QSPI Flash。至于Mode 1和Mode 2,嗯……我做了十年嵌入式,只用过一次,还是因为某款ASIC的SPI控制器只支持这两个模式。

好了,信号线和工作模式这部分就说这么多。你把Mode 0和Mode 3的核心时序记牢,后面讲启动流程时,还会反复用到这些概念。