3、SPI 与 QSPI 的区别:单线 vs 四线传输、吞吐率对比

做嵌入式这么多年,我每次跟人聊 QSPI Flash 启动,总得先掰扯清楚一个基本问题:SPI 和 QSPI 到底差在哪儿?

说白了,核心就两点——数据线数量和吞吐率。我们一个一个拆开看。

3.1 单线传输:经典的 SPI 四线制

传统 SPI 接口大家都很熟了。四条线:SCK、CS、MOSI、MISO。数据只能在一个方向上一根线传。

MOSI 发命令、地址、写数据,MISO 收数据。每次只能做一种操作,不能同时收和发吗?其实可以全双工,但实际启动场景里多是半双工。

你想想看,从 Flash 读数据时,主机先发命令和地址,然后 Flash 再在 MISO 上把数据吐回来。一根 MISO 线,一个时钟传一个 bit。想要快?只能提频率。

常规 SPI 读操作的瓶颈

  • 地址/命令阶段:MOSI 单线串行发送
  • 数据阶段:MISO 单线串行接收
  • 最大吞吐率 ≈ f_SCK × 1 bit/cycle

我以前做一款 IoT 模块,Flash 最高能跑 50MHz SPI,理论峰值也就 50 Mbps。但实际还要加上命令开销、CS 片选延迟,能到 40 Mbps 就不错了。

这速度对于存放代码、启动系统来说,有时候真不够用——尤其是在要快速加载大镜像的场景下。

3.2 四线传输:QSPI 是怎么拉开差距的

QSPI 在标准 SPI 基础上,把 MOSI 和 MISO 的功能扩展了。它引入了四个双向 I/O 线:IO0、IO1、IO2、IO3。

发送命令时可以用单线(也叫 SPI 模式),也可以切换到四线模式。一旦进入四线传输,一个时钟周期就能传 4 个 bit。注意,这是 并行传输。

举个例子:你用 QSPI 读数据,命令和地址还能用单线发,但读数据时把 IO0~IO3 全开,一个时钟从 Flash 里拽出 4 bit。频率不变的情况下,吞吐率直接变成 4 倍。

我的个人习惯:设计上电启动电路时,如果 CPU 支持 QSPI 的 Fast Read Quad I/O 命令(比如 0xEB),我就优先用它。一条命令搞定地址+空转+四线数据,省时省力。

我记得有一次调启动时序,发现 Flash 明明支持 80MHz QSPI,但板子上的走线太长导致信号质量下降。最后降频到 60MHz,四线模式下仍然有 240 Mbps 的理论吞吐率——比单线 80MHz 的 80 Mbps 强太多了。

3.3 吞吐率对比:一张表说清楚

咱们直接对比一下常见场景下的理论值。实际吞吐率受命令开销、等待周期(Dummy Cycles)、片选切换等因素影响,但看上限最能反映差距。

传输模式数据线数量最大时钟 (MHz)理论吞吐率 (Mbps)实际典型值 (Mbps)
SPI (单线读)1505030~40
SPI (单线读)1808055~70
QSPI (四线读)450200140~180
QSPI (四线读)480320240~290
QSPI (四线读)4120480350~430

看到没?同样频率下 QSPI 的吞吐率直接翻四倍。而且 QSPI 的命令格式也优化过,比如 Fast Read Quad Output 命令只需要一个字节命令 + 三个字节地址 + 一个 dummy cycle,然后就是连续四线数据。开销更小。

我曾经踩过一个坑:选了一个标称 104MHz QSPI 的 Flash,结果板子布线没等长、没做阻抗匹配,跑四线模式时 IO2 和 IO3 的眼图一塌糊涂。最后不得不降频到 66MHz 才稳定。所以别光看吞吐率,信号完整性同样重要。

3.4 为什么启动场景特别在乎吞吐率?

系统上电后,CPU 要从 Flash 里把代码搬到内存(通常是 SRAM 或 DDR)执行。如果 Flash 吞吐率低,程序还没加载完,看门狗就饿了。

QSPI 的优势在这里被放大——尤其在 XIP(片上执行)的方案里,CPU 直接跑 Flash 里的代码,指令和数据访问都走 QSPI 总线。单线 SPI 根本扛不住随机访问的带宽需求。

我见过一个项目,用 SPI Flash 做 XIP,CPU 频繁读表导致系统卡顿;换成 QSPI 后,同样的代码,读表速度提升了 3 倍多。原因很简单:一次四线访问顶四次单线,总线利用率更高。

3.5 引脚数 vs 性能的权衡

有些工程师会说:“那我直接用并行 NOR Flash 不更好?8 位甚至 16 位数据线,吞吐率更高。”没错,但代价是引脚多。一颗 8 位并行 NOR Flash 至少需要 20 多条信号线,而 QSPI 只要 6 条(CS、SCK、4 个 IO)。

对于小封装 MCU 或 FPGA 来说,引脚是稀缺资源。QSPI 几乎是最优解:用最少的引脚换取足够高的启动速度。

设计选型建议

  • 如果启动镜像小于 256KB 且频率不高 → 普通 SPI Flash 够用
  • 如果代码 > 1MB 或需要 XIP → 必须上 QSPI
  • 如果对信号完整性没十足把握 → 留裕量,比如选频率低一档的 Flash

嗯,这里还要注意:不是所有 QSPI Flash 都支持四线模式。有些阉割版只支持 Dual(两线),买之前一定要看数据手册的“Read Quad I/O”命令是否真实存在。

3.6 一张图看懂对比

下面这张 SVG 图把 SPI 和 QSPI 的架构、传输方式、吞吐率关系画在一起。你可以收藏起来,下次汇报时直接用。

SPI vs QSPI 传输对比 SPI (单线) 主机 (CPU) 从机 (Flash) MOSI MISO SCK + CS (未画出) 1 bit/cycle → 50 Mbps @ 50MHz 1 bit/cycle → 80 Mbps @ 80MHz QSPI (四线) 主机 (CPU) 从机 (Flash) IO0 IO1 IO2 IO3 SCK + CS (未画出) 4 bit/cycle → 200 Mbps @ 50MHz 4 bit/cycle → 320 Mbps @ 80MHz ×4 关键结论: · 相同频率下,QSPI 吞吐率是 SPI 的 4 倍(四线并行) · 引脚只增加 2~3 根,远小于并行 Flash,非常适合嵌入式启动 实际项目需额外注意: · QSPI 的 DQS (数据选通)在某些高速模式下需要单独处理 · 四线传输时各 IO 走线等长是必须的,否则 skew 会导致错误 · 部分 Flash 支持 DDR 双倍速率模式,吞吐率还能再翻倍

3.7 避坑总结

  • 别盲目上高频:QSPI 超过 80MHz 后,PCB 走线的影响会急剧放大。我曾见过 100MHz 下 IO2 眼图闭合,换上等长蛇形线才解决。
  • 确认 CPU 的 QSPI 控制器是否支持四线读:有些低端 MCU 只支持 Dual SPI(两线),别被手册里的“QSPI”字样骗了。
  • 命令序列也要算时间:QSPI 的 Fast Read Quad I/O 命令通常带一个 dummy cycle。这个开销在小数据块读取时尤其明显,所以吞吐率公式要写成:吞吐率 = (数据长度 × 4) / (命令字节+地址字节+dummy+数据时钟数) × f
  • 电源纹波不能忽视:Flash 内部 PLL 对电源敏感,如果板子上的 3.3V 纹波超过 50mV,高速 QSPI 读出数据时可能会出现随机 bit 翻转。我已经为此改版两次了。