一、QSPI 协议简介与信号特点

QSPI,全称是 Quad SPI,说白了就是 SPI 的升级版。标准 SPI 只有一根数据输出线(MOSI)和一根数据输入线(MISO),一次只能传 1 bit。QSPI 把这个通道翻了三倍——多了两根数据线,总共 4 根数据线,一次能传 4 bit。你想想看,同样一个时钟周期,吞吐量直接变成原来的 4 倍。

我最早接触 QSPI 是在一个高速数据采集项目里,Flash 读取速度总卡在 50 MHz 上不去。换成 QSPI 之后,同样的 PCB 走线,读速直接飙到 200 Mbps。嗯,这才真正体会到高速接口的威力。

1.1 接口定义与信号线功能

QSPI 接口一共 6 根主要信号线,算上片选才 7 根。别看线少,每根都有自己的脾气。

信号名 方向 功能描述
SCLK 主→从 时钟,数据采样沿(CPOL/CPHA 决定)
CS# 主→从 片选,低有效,选中设备
IO0 (MOSI) 双向 标准 SPI 的 MOSI,QSPI 模式下双向数据线 0
IO1 (MISO) 双向 标准 SPI 的 MISO,QSPI 模式下双向数据线 1
IO2 (WP#) 双向 写保护(标准 SPI),QSPI 模式下数据线 2
IO3 (HOLD#) 双向 保持(标准 SPI),QSPI 模式下数据线 3

注意 IO2 和 IO3 在标准 SPI 模式下其实是控制信号,切换到 QSPI 模式后才变成数据线。这一点很多新手栽过跟头,我曾经见过一块板子 IO2 被外部上拉到高电平,结果 QSPI 四线读取时这个引脚怎么也拉不下来,排查了半天。

还有一个容易被忽略的细节:QSPI 的时钟极性(CPOL)和相位(CPHA)一般默认是模式 0,也就是空闲时时钟低电平,第一个边沿采样。但不同厂商的 Flash 可能有差异,务必读 datasheet 确认。

1.2 高速特点与信号完整性挑战

QSPI 的工作频率现在普遍在 80 MHz~166 MHz,甚至有些器件能跑到 200 MHz。这个频率在 PCB 上已经算是高速信号了。为什么?因为信号上升时间通常在 1~2 ns 左右,对应带宽接近 300 MHz。按照经验法则,走线长度超过信号上升沿对应电长度的 1/6 就要考虑传输线效应。

我个人的习惯是:一旦 QSPI 时钟超过 50 MHz,就必须按传输线来设计。否则你会看到波形上出现回沟、过冲、振铃,甚至数据完全读不对。

  • 反射:阻抗不匹配导致信号在源端和负载端来回弹跳。典型表现是时钟边沿出现台阶,数据采样点刚好撞在台阶上。
  • 串扰:相邻信号线之间的电磁耦合。QSPI 的四根数据线一般平行走线,串扰尤其严重。
  • 同步开关噪声(SSN):数据线同时翻转时,芯片内部电源轨道瞬间压降。你可能会发现 SCLK 上莫名出现毛刺。
  • 地弹:多个输出同时切换时,地参考电位抖动。这对于双向数据线(IO0~IO3)是致命伤。
⚠️ 警告:QSPI 在四线读取模式下,所有数据线同时由从设备驱动。如果 PCB 地回路设计不当,地弹噪声会直接耦合到时钟信号上,导致采样错误。我曾经排查过一个项目,QSPI 读出的数据每 4 个字节就错一位,最后发现是地平面被分割,回流路径太长。

1.3 为什么 QSPI 对毛刺特别敏感?

原因有三点,我总结为「三快」:边沿快、速率快、翻转快。

  1. 边沿快——QSPI 驱动器的输出阻抗一般只有十几欧姆,上升时间很短,高频分量丰富。这些高频成分很容易通过寄生电容耦合到相邻信号线上。
  2. 速率快——时钟频率高,一个 bit 窗口只有几纳秒。毛刺只要宽过几百皮秒,就可能落在采样点上。
  3. 翻转快——四根数据线可以同时从 0→1 或 1→0,同步开关噪声和地弹效应叠加,产生幅度可观的毛刺。

我遇到过最极端的一个案例,是在 100 MHz 的 QSPI Flash 读取过程中,CS# 下降沿后会出现一个 300 mV 的负毛刺,直接导致 Flash 误判片选信号,重新开始命令序列。最后发现是 SCLK 和 CS# 在 PCB 上平行走了 3 英寸,串扰所致。把 CS# 走线包地之后,毛刺消失。

1.4 协议操作模式与信号流

QSPI 协议支持三种操作模式:标准 SPI 模式、双线模式(Dual SPI)、四线模式(Quad SPI)。在实际调试时,你需要根据主控和 Flash 的兼容性来选择。

模式 数据线数 单时钟周期传输位数 典型应用
标准 SPI 2(MOSI + MISO) 1 bit 配置寄存器、慢速参数读取
Dual SPI 2(IO0 + IO1) 2 bit 中等速度块读取
Quad SPI 4(IO0~IO3) 4 bit 高速数据块传输、代码映射

以最常见的 Quad Read 命令(0xEB)为例,流程是这样的:

  • 主设备拉低 CS#,启动传输
  • 主设备通过 IO0 输出命令字节(8 位)
  • 主设备输出 24 位地址(3 字节),仍然通过 IO0 串行发送
  • 主设备发送 8 个 dummy 周期(不关心 IO 状态)
  • 从设备切换为 Quad 输出,IO0~IO3 同时输出数据
  • 主设备在 SCLK 的每个上升沿采样 4 bit
  • 直到主设备拉高 CS#,结束传输

这个流程中,最关键的是 dummy 周期之后,四根数据线的方向会瞬间翻转(由主设备驱动变为从设备驱动)。这个转瞬间如果主设备没有释放总线,就会和从设备产生驱动冲突,产生毛刺。我记得有颗国产 Flash 芯片,在 dummy 周期后需要额外 2 个时钟周期等待内部 PLL 锁定,如果不等,IO 线上会出现一个 2 ns 的毛刺。你的主控如果正好在那时候采样,数据就错了。

💡 技巧:在 dummy 周期结束时,务必检查 IO 线的驱动方向切换是否干净。可以拉长 dummy 周期(比如从 8 个增加到 12 个),看看毛刺是否消失。如果消失,说明是方向切换时序问题,而不是信号反射问题。

1.5 知识体系全景图

下面这张图把 QSPI 协议的核心知识点串了起来。你可以用它快速回顾本章内容。

QSPI 信号毛刺分析知识体系(第1章) QSPI 协议与信号特点 6线接口定义 SCLK / CS# / IO0~IO3 三种操作模式 SPI / Dual / Quad 高速信号挑战 反射 / 串扰 / SSN / 地弹 毛刺敏感三要素 边沿快 / 速率快 / 翻转快 典型传输流程 命令→地址→Dummy→数据 ⚠️ 排查起点提示 • 先确认主控和 Flash 的 CPOL/CPHA 是否一致 • 示波器量 CS# 下降沿附近是否有毛刺(串扰信号) • 测量 SCLK 的过冲/振铃幅度,是否超过 VIH/VIL 限值

这张图你可以截下来贴到笔记本第一页。后面每一章的定位都可以用它做参照。