第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。我个人习惯先看一下芯片的 命令集兼容性:

厂商常见系列命令集特点
WinbondW25Qxx标准 JEDEC,兼容性好
MacronixMX25Lxx类似 Winbond,偶有差异
GigaDeviceGD25Qxx性价比高,部分命令需适配
ISSIIS25LPxx高速模式需确认

我曾经在项目里混用过两款不同厂商的 Flash,结果发现同一套代码在 Winbond 上跑得飞快,换成 Macronix 就概率性失败。为什么?因为 Macronix 的 Fast Read Quad I/O 命令跟 Winbond 差一个 dummy cycle。看似小差异,启动时序不对就直接黑屏。

避坑提示: 选型时务必确认 CPU 的 QSPI 控制器是否原生支持该 Flash 的命令集。如果 CPU 的 Flash 启动 ROM 只支持特定厂商的命令序列,换 Flash 就意味着要改硬件启动配置,甚至要改 BootROM —— 非常痛苦。

1.3 启动流程概览

大多数 ARM / RISC‑V 芯片的 QSPI 启动流程大约分这么几步:

  1. CPU 上电复位:内部 BootROM 获得控制权。
  2. 配置 QSPI 控制器:BootROM 初始化 QSPI 管脚、时钟、模式。
  3. 发送 Reset 命令:确保 Flash 处于已知状态。
  4. 发送 Read ID 命令:读取 Flash 的 Manufacturer ID 和 Device ID,验证连接。
  5. 切换 Quad 模式:通过 Write Enable + Quad Enable 命令开启 4 线模式。
  6. 执行 Fast Read Quad I/O:从 Flash 指定地址(通常是 0x0)读取首段启动代码。
  7. 加载并校验:将代码搬入 SRAM 或 DDR,然后跳转执行。

别小看第 4 步——如果 Read ID 返回错误值,BootROM 可能直接放弃启动。我调过一块板子,Flash 供电正常,示波器量波形也对,但就是读不出正确的 ID。后来发现是 Flash 的 WP# 引脚没拉高,导致芯片处于保护状态。

重要提醒: 不少芯片的 BootROM 对 Flash 的 Reset 命令时序非常敏感。有些 Flash 上电后需要等待 tVSL(上电到片选有效的时间)之后才能接收指令。如果 CPU 复位后立即发命令,Flash 还没准备好,就永远收不到回复。检查 datasheet 里的 初始化时序 章节,确认你的硬件设计是否满足最小等待时间。

下面这张图概括了整个启动链条:

QSPI Flash 启动流程概览 CPU 上电复位 BootROM 启动 初始化 QSPI 发送 Read ID Quad 使能 Fast Read 代码 搬移 & 校验 跳转执行 失败则重试/错误处理 常见失败点 时序不匹配 ID 读取异常

核心要点回顾

  • QSPI 协议本质是 SPI 的多线并行版本,启动场景优先关注 Quad 模式切换逻辑。
  • NOR Flash 是启动首选,选型时务必对标 CPU 的 BootROM 命令兼容列表。
  • 启动流程从上电到跳转执行,每一步都可能成为“坑点”——尤其是 Read ID 和 Quad 使能部分。