QSPI Flash 概述与应用场景
大家好,我是老周。做嵌入式这些年,SPI Flash 用得最多,但一到高速大容量场景,就得请出它的升级版——QSPI Flash。这玩意儿名字听着挺唬人,说白了就是四通道 SPI。标准 SPI 一次只能传 1 位,QSPI 一次能传 4 位,数据吞吐量直接翻四倍。嗯,这个提升很实在。
什么是 QSPI Flash?
先看名字:Quad Serial Peripheral Interface,四线串行外围接口。它在传统 SPI 的 SCK(时钟)、CS(片选)、MOSI(主出从入)、MISO(主入从出)基础上,把剩下的两根数据线也利用起来,变成 IO0~IO3 共 4 根双向数据线。
关键点:QSPI Flash 内部存储单元还是 NOR Flash 或 NAND Flash,区别在于对外通信接口。它支持 SPI 模式(单线)、Dual SPI(双线)和 Quad SPI(四线),有的还支持 QPI(四线命令/地址/数据全用四线)。
我个人习惯把 QSPI Flash 看作“少吃多快”的存储方案。引脚少,只占 8 个脚(SOIC-8 或 WSON-8);速度快,跑 80/108/133 MHz 很常见,四线模式下理论带宽能到 532 Mbps。你想想看,传统并口 Flash 要几十个引脚才能达到这个速度,QSPI 用 8 个脚就搞定了。
QSPI 相比 SPI 的优势在哪里?
我整理了一个对比表,你可以一目了然:
| 对比项 | 标准 SPI Flash | QSPI Flash | 说明 |
|---|---|---|---|
| 数据线宽度 | 1 位(MOSI/MISO) | 4 位(IO0~IO3) | QSPI 吞吐量是 SPI 的 4 倍 |
| 最高时钟频率 | 50~80 MHz | 80~133 MHz | 工艺更新,QSPI 频率更高 |
| 引脚数(典型封装) | 8 脚 | 8 脚(相同) | PCB 布局一样方便 |
| 读取带宽(理论) | 50 MB/s(50 MHz) | 266 MB/s(133 MHz × 4) | 实际受控于控制器和内部延时 |
| DDR 模式 | 无 | 部分支持 | QSPI 可加倍传数 |
| 典型容量 | 1~64 MB | 4 MB~256 MB(甚至 1 GB) | QSPI 更能大容量 |
我在一个车机项目中用过 64 MB 的 QSPI Flash 存导航地图数据。当时用标准 SPI 读地图,卡得要死;换成 QSPI 四线模式后,地图加载时间从 8 秒降到 1.5 秒。这个提升,客户一眼就看出来了。
小提示:QSPI Flash 的驱动强度很容易被忽略。同样是 8 脚封装,不同厂商的驱动电流默认值不一样。我曾经遇到过读数据偶尔飘错,折腾了两天,最后发现是驱动强度设成了 25% 而不是 100%。换了寄存器配置,问题消失。
应用场景——哪些场合非 QSPI 不可?
嵌入式系统中的固件存储
MCU 上电后需要快速从 Flash 加载代码。QSPI 支持内存映射模式(XIP,Execute In Place),CPU 可以直接像读内部 Flash 一样读外部 QSPI Flash,不需要先拷贝到 RAM。我做的 STM32H743 项目就是这样,片外一个 16 MB 的 QSPI Flash 存程序,跑起来和内部 Flash 速度差不多,但成本低多了。
物联网终端的数据日志
IoT 设备要把传感器数据、运行日志写到 Flash 里。QSPI 的页编程速度(一般 0.5~2 ms/256 字节)比普通 SPI 快一倍。而且 QSPI 支持连续写,批量日志写入很快。
汽车电子与工业控制
车规级 QSPI Flash 支持 -40°C~125°C 宽温,抗振动。我去年帮一个工控客户做产线,他们用 QSPI Flash 存 PLC 的梯形图程序,现场高温高湿环境下跑了两年没出过一次读错(当然,ECC 和 CRC 校验必须自己做)。
显示应用中的帧缓冲区
一些不带 RAM 的彩屏模块喜欢用 QSPI Flash 做帧缓存。四线模式读取速度足够刷新 320×240 的 16 位色屏幕,而且功耗比并口 SRAM 低很多。
典型系统框图
下面这张图展示了 QSPI Flash 在嵌入式系统中的位置,以及它和主控之间的信号关系:
避坑指南——初学者最容易犯的错:QSPI Flash 的引脚 IO0~IO3 在 SPI 模式下可以作为普通数据线,但有些芯片的 IO2 和 IO3 在 SPI 模式下内部默认是高阻还是弱上拉?不同的厂商定义不同。我以前在 GD32 上翻过车——买的 W25Q64JV 在 SPI 模式时 IO2/IO3 是弱上拉,结果电路板上浮空没接,读 ID 一直出错。后来加了个 10kΩ 上拉才稳定。
选型时还要注意什么?
- 电压范围:1.8V 还是 3.3V?别和主控的电平不匹配。我建议直接选 3.3V 通用型,如果 MCU 是 1.8V,得加电平转换。
- 页大小:多数 QSPI Flash 页是 256 或 512 字节。写操作必须按页对齐,否则会跨页写入失败。
- QE 位:进入 Quad 模式前,要先往状态寄存器写
QE=1。这个操作很容易被忽略,导致 Quad 读出来的数据全乱码。遇到过吧?我遇到过。 - 扇区大小:常见 4 kB、8 kB、64 kB。擦除最小单位是扇区,所以小文件很多的话,选 4 kB 小扇区更灵活。
总结一句话:QSPI Flash 就是用最少的引脚实现最高效的串行读取,适合代码就地执行、大数据日志、图形缓存三个核心场景。但速度提上去之后,PCB 布局和寄存器配置的坑就冒出来了——后面章节我会一个个带你看。