QSPI Flash概述与分类
大家好,我是你们这节课的讲师。做嵌入式底层开发十几年了,QSPI Flash 这东西几乎是我每次做板子都得打交道的伙计。你可能觉得它就是个存储芯片,能存代码就行。但在引导加载这个场景里,QSPI Flash 的选择和配置,往往决定了整个系统能不能可靠启动。
我个人习惯把 QSPI Flash 称作「启动流程的第一块拼图」。你想想看,CPU 上电后第一条指令从哪读?如果走内部 ROM 启动,那它最终还是要从外部 Flash 里把用户代码搬过去。这个外部 Flash 选什么类型、用什么协议、配什么时序,全都直接影响启动成败。
1.1 什么是 QSPI Flash
QSPI,全称 Queued Serial Peripheral Interface,其实是从 SPI 演化过来的。普通的 SPI 只有一条数据线(MISO/MOSI),一次传一个位。QSPI 呢,它最多能用 4 条数据线同时传。换句话说,理论上速度是普通 SPI 的 4 倍。
一个小经验:我早期在一个智能家居项目中用过普通 SPI Flash,启动时读代码慢得让人抓狂。换成 QSPI 后,引导时间从 480ms 直接降到 140ms。这个差距在量产时很关键。
1.2 常见 QSPI Flash 分类
市面上的 QSPI Flash 三大家族:
- 标准 NOR Flash: 最常见的一种。特点是按扇区擦除,读起来快,适合存代码。缺点嘛,擦写次数通常 10 万次左右,不算高。
- 高性能 NOR Flash: 比如带 DTR(双倍传输速率)、带 Continuous Read 模式的。这些家伙能把时钟利用率拉到最高。我用过一款 W25Q64JV,在 133MHz 时钟下跑 QSPI DTR,读速率能到 532Mbps。
- 特殊用途 Flash: 比如支持 XIP(Execute In Place)的、带 OTP 安全区域的、宽电压范围的。这类一般是给汽车或工控准备的。
| 参数 | W25Q64JV | MX25L6436F | IS25LP064A |
|---|---|---|---|
| 容量 | 64Mbit | 64Mbit | 64Mbit |
| 最高时钟 | 133MHz | 166MHz | 133MHz |
| 读模式 | SPI/QPI | SPI/QPI/DTR | SPI/QPI/DTR |
| 扇区大小 | 4KB | 4KB | 4KB |
| 擦写次数 | 10万次 | 10万次 | 10万次 |
1.3 QSPI 与 SPI 的差异
很多人以为 QSPI 只是把线数翻倍就行,没那么简单。我从引脚协议到驱动配置给你对比一下:
- 引脚差异: 普通 SPI 需要 CS、CLK、MOSI、MISO 四根线。QSPI 把 MOSI/MISO 改成 IO0~IO3,最多四根双向数据线。
- 命令集差异: QSPI Flash 有专门的四线读命令(比如 0xEB),这个命令在普通 SPI 模式下不识别。你如果拿到一个 QSPI Flash 却只用 SPI 模式,等于买了跑车只开一挡。
- 时序参数: 四线传输时,每个时钟周期同时传 4 个 bit,这就要求芯片内部的采样窗口得足够宽。有个我曾经踩过的坑:某款国产 Flash 标称支持 104MHz QSPI,实际跑到 80MHz 以上就开始丢数,最后不得不降频使用。
注意: 不要以为 Flash 上印着 QSPI 就一定能四线工作。有些芯片默认上电是标准 SPI 模式,需要用软件发送“切换到 QPI 模式”的命令才能启用四线。上电引导阶段如果没切换,CPU 读到的全是乱码。
1.4 QSPI Flash 在引导加载中的角色
搞懂了分类,我们把目光放回引导加载这个主题上。QSPI Flash 为什么被大量用于启动? 原因就两个:快和简单。
- 快: 相比 NAND,NOR Flash 启动不需要搬运坏块表,可以直接随机读取。配合 QSPI 满速,能媲美并行 NOR 的性能。
- 简单: 大多数 SoC 内部都集成了 QSPI 控制器,上电后自己就能初始化,不需要复杂的外设配置。我记得做第一个 i.MX RT 项目时,板子一来,代码直接放在 QSPI Flash 里就能跑,真是省心。
1.5 分类与选型要点
知道了分类,那项目里怎么挑?我一般按这几个维度看:
选型 checklist:
- 容量:>2MB 时建议用 64Mbit 以上的颗粒,否则启动代码放不下。
- 工作电压:3.3V 还是 1.8V?注意 SoC 的 QSPI 接口电压是否匹配。
- 温度等级:工业级(-40~85℃)和商业级(0~70℃)不一样,车规级另说。
- 读模式支持:至少支持 QPI 或 DTR,否则启动速度没优势。
- Erase time:扇区擦除时间,差的有 2 秒,快的 200 毫秒。
1.6 一张图看懂本章脉络
1.7 一个实际的 QSPI Flash 初始化片段
理解分类后,我习惯看一段代码来加深印象。下面是一个简化版 QSPI Flash 初始化流程,以华邦 W25Q64JV 为例:
// 伪代码:QSPI Flash 初始化和模式切换
void qspi_flash_init(void)
{
// 1. 复位 Flash(确保在 SPI 模式)
qspi_send_command(0x66); // 开启写使能
qspi_send_command(0x99); // 复位
// 2. 读取 ID 确认型号
uint8_t id[3];
qspi_send_cmd_read(0x9F, id, 3); // JEDEC ID
if (id[0] != 0xEF || id[1] != 0x40 || id[2] != 0x17)
error_handler(); // 不是 W25Q64JV,挂起
// 3. 切换到 QPI 模式(四线模式)
qspi_send_command(0x38); // 写 QPI 使能
qspi_send_command(0xEB); // 切换到 QPI 模式
// 4. 配置读参数:连续读模式
qspi_send_command(0xC0); // 设置连续读参数
// 5. 设置 QSPI 控制器时钟分频
qspi_set_clock_div(QSPI_CLK_DIV_2); // 假设主频 200MHz,生成 100MHz QSPI 时钟
}
注意: 上面的复位命令 (0x66 + 0x99) 不是所有 Flash 都支持,有些老片子需要用 0xAB 或 0x06。确定使用前建议读 datasheet 的 “Reset” 章节。我吃过一次亏,不同批次芯片复位命令都不一样,导致量产后 3% 的板子启动失败。
1.8 总结这章的关键点
- QSPI Flash 是引导加载中最常用的外部存储器,速度远超 SPI。
- 分类上主要看 NOR 类型、容量、读模式支持。
- 选型不能只看数据手册标称,要实测高时钟下的稳定性。
- 初始化需要先复位、读取 JEDEC ID、切换工作模式,顺序不能乱。