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 安全区域的、宽电压范围的。这类一般是给汽车或工控准备的。
主流 QSPI Flash 特性对比
参数 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 只是把线数翻倍就行,没那么简单。我从引脚协议到驱动配置给你对比一下:

  1. 引脚差异: 普通 SPI 需要 CS、CLK、MOSI、MISO 四根线。QSPI 把 MOSI/MISO 改成 IO0~IO3,最多四根双向数据线。
  2. 命令集差异: QSPI Flash 有专门的四线读命令(比如 0xEB),这个命令在普通 SPI 模式下不识别。你如果拿到一个 QSPI Flash 却只用 SPI 模式,等于买了跑车只开一挡。
  3. 时序参数: 四线传输时,每个时钟周期同时传 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 一张图看懂本章脉络

QSPI Flash 概述与分类 知识结构 QSPI Flash 概述与分类 常见类型与特性 NOR Flash 主力 高性能 / 工业级 QSPI vs SPI 差异 引脚 / 命令 / 时序 模式切换隐藏坑 启动加载关键角色 速度 = 引导时间 XIP 直连简化 选型需综合考虑容量、电压、温度等级、读模式支持

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、切换工作模式,顺序不能乱。