第1章 QSPI Flash 概述
做嵌入式启动调试的朋友,多半都被 QSPI Flash 坑过。我自己就有一段惨痛经历——产品量产前突然发现一片 Flash 死活起不来,查了三天才发现是协议时序参数没配对。那之后我就把 QSPI 启动的底裤翻了个底朝天。
本章我们先搭个知识框架:QSPI 协议到底是什么?市面上常见的 Flash 芯片类型有哪些?从 CPU 上电到执行 Flash 里的第一条指令,中间经历了什么?搞懂这些,后面排查问题才有方向。
1.1 QSPI 协议简介
QSPI 的全称是 Quad Serial Peripheral Interface,说白了就是传统 SPI 的“四车道”升级版。
- 标准 SPI:1 根数据输入(MOSI)、1 根数据输出(MISO)、1 根时钟(SCK)、1 根片选(CS)。一次传输 1 bit。
- QSPI:额外增加 2 根数据线,组成 4 根双向 IO 线(IO0~IO3)。一次能同时传输 4 bit。
你想想看,同样的时钟频率下,QSPI 的吞吐量是标准 SPI 的 4 倍。这对启动场景至关重要——CPU 上电后要快速把代码搬进 RAM,带宽就是生命线。
QSPI 协议有几种常见模式:
| 模式 | 数据线数 | 典型用途 |
|---|---|---|
| Standard SPI (1-1-1) | 1 入 1 出 | 兼容模式,早期 Flash |
| Dual SPI (1-2-2) | 2 线双向 | 中等速度需求 |
| Quad SPI (1-4-4) | 4 线双向 | 程序加载、数据存储 |
| QPI (4-4-4) | 4 线,命令也走 4 位 | 高吞吐持续传输 |
嗯,这里要注意:并不是所有 Flash 都支持 QPI 模式。启动时 CPU 通常先用标准 SPI 发命令,再切换到 Quad 模式提高速度。我遇到过一个坑——某款国产 Flash 的 Quad 模式使能命令跟 datasheet 写的不一样,导致启动卡在中间阶段。
1.2 Flash 芯片类型
市面上主流的 QSPI Flash 大致分三类:
- NOR Flash:随机访问快,支持 XIP(就地执行),但密度低。启动首选。
- NAND Flash:密度高、成本低,但需要坏块管理,不能直接 XIP。一般只存数据。
- EEPROM:可字节擦写,但容量小、速度慢,很少用于启动。
做启动 Flash 基本只用 NOR Flash。我个人习惯先看一下芯片的 命令集兼容性:
| 厂商 | 常见系列 | 命令集特点 |
|---|---|---|
| Winbond | W25Qxx | 标准 JEDEC,兼容性好 |
| Macronix | MX25Lxx | 类似 Winbond,偶有差异 |
| GigaDevice | GD25Qxx | 性价比高,部分命令需适配 |
| ISSI | IS25LPxx | 高速模式需确认 |
我曾经在项目里混用过两款不同厂商的 Flash,结果发现同一套代码在 Winbond 上跑得飞快,换成 Macronix 就概率性失败。为什么?因为 Macronix 的 Fast Read Quad I/O 命令跟 Winbond 差一个 dummy cycle。看似小差异,启动时序不对就直接黑屏。
1.3 启动流程概览
大多数 ARM / RISC‑V 芯片的 QSPI 启动流程大约分这么几步:
- CPU 上电复位:内部 BootROM 获得控制权。
- 配置 QSPI 控制器:BootROM 初始化 QSPI 管脚、时钟、模式。
- 发送 Reset 命令:确保 Flash 处于已知状态。
- 发送 Read ID 命令:读取 Flash 的 Manufacturer ID 和 Device ID,验证连接。
- 切换 Quad 模式:通过 Write Enable + Quad Enable 命令开启 4 线模式。
- 执行 Fast Read Quad I/O:从 Flash 指定地址(通常是 0x0)读取首段启动代码。
- 加载并校验:将代码搬入 SRAM 或 DDR,然后跳转执行。
别小看第 4 步——如果 Read ID 返回错误值,BootROM 可能直接放弃启动。我调过一块板子,Flash 供电正常,示波器量波形也对,但就是读不出正确的 ID。后来发现是 Flash 的 WP# 引脚没拉高,导致芯片处于保护状态。
下面这张图概括了整个启动链条:
核心要点回顾
- QSPI 协议本质是 SPI 的多线并行版本,启动场景优先关注 Quad 模式切换逻辑。
- NOR Flash 是启动首选,选型时务必对标 CPU 的 BootROM 命令兼容列表。
- 启动流程从上电到跳转执行,每一步都可能成为“坑点”——尤其是 Read ID 和 Quad 使能部分。