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 (单线读) | 1 | 50 | 50 | 30~40 |
| SPI (单线读) | 1 | 80 | 80 | 55~70 |
| QSPI (四线读) | 4 | 50 | 200 | 140~180 |
| QSPI (四线读) | 4 | 80 | 320 | 240~290 |
| QSPI (四线读) | 4 | 120 | 480 | 350~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 的架构、传输方式、吞吐率关系画在一起。你可以收藏起来,下次汇报时直接用。
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 翻转。我已经为此改版两次了。