Flash 芯片基础:NOR Flash 与 NAND Flash 区别、QSPI Flash 内部结构、时钟与复位时序

其实做 QSPI 驱动之前,先摸清楚 Flash 芯片本身的脾气很重要。

我记得刚开始做嵌入式那会儿,拿着 NAND 的驱动代码直接往 NOR 上怼,结果读写全乱套,排查了整整两天。后来才发现——这两种 Flash 的“性格”完全不同。

这一章我们就先聊聊这两种主流 Flash 的区别,再解剖一下 QSPI Flash 内部到底长什么样,最后看看时钟和复位这两个“命门”该怎么伺候。

1. NOR Flash 与 NAND Flash 的区别

说白了,一个像内存(随机访问),一个像硬盘(块操作)。

对比项 NOR Flash NAND Flash
读取方式 随机访问,可直接寻址到字节 只能页读取(通常 2KB/4KB)
写入方式 按字节或字编程 按页编程,必须先擦除块
擦除单位 扇区(通常 64KB) 块(通常 128KB~1MB)
读取速度 快(支持 XIP,代码可直接跑) 较慢(读需要先加载到 SRAM)
写入速度 慢(按字节写) 快(页编程,批量写入)
擦除速度 慢(扇区擦除几秒) 快(块擦除几毫秒)
密度 低(通常 ≤ 512Mb) 高(单芯片可达 8Gb+)
位反转概率 极低 较高(需要 ECC 校验)
典型应用 代码存储、XIP 启动 文件系统、大容量数据
我个人的选型习惯: 需要 XIP(原地执行)的场合,果断用 NOR;存储音视频或固件镜像的,考虑 NAND。但用 NAND 的话,一定要预留 ECC 和坏块管理。

2. QSPI Flash 内部结构

不管是哪种 Flash,在 QSPI 接口下,内部都有几个关键模块。我来给你拆开看看。

  • 存储阵列(Memory Array) —— 数据真正躺的地方,NOR 是行列交叉结构,NAND 是串行串结构。
  • 页缓冲(Page Buffer) —— 读写的。页编程时数据先缓存到这里,再一次性写入。
  • 状态寄存器(Status Register) —— 告诉你芯片忙不忙(BUSY 位),写保护是否打开等。
  • 配置寄存器(Configuration Register) —— 控制 QPI 模式、DDR 模式、驱动强度等。这个后面实战会重点调。
  • 命令解码器(Command Decoder) —— 解析 SPI 总线上发来的指令,比如 0x03(普通读)、0xEB(四线快速读)。
  • I/O 控制逻辑(IO Control) —— 管理数据流向,决定是单线、双线还是四线模式。
  • 时钟管理(Clock Management) —— 内部时钟分频、延迟锁定,决定采样时机。
注意: 不是所有 QSPI Flash 的配置寄存器都一样。我遇到过一款国产 Flash,配置寄存器第 5 位是 QPS 模式使能,换了个型号变成第 6 位了。阅读 datasheet 时一定要逐位确认。

3. 时钟与复位时序

这个坑我踩过好几次。时钟快了不行,相位不对也不行;复位没处理好,芯片直接“罢工”。

3.1 时钟时序(SCK)

QSPI 的时钟频率通常可以从几十 MHz 到上百 MHz。但对于 QSPI Flash,不是频率越高越好。看清楚了:

  • 最大时钟频率(f_max) —— datasheet 会标,比如 80MHz、104MHz。超过这个值,数据就会错。
  • 时钟相位(CPHA)与极性(CPOL) —— 大部分 QSPI Flash 支持模式 0(CPOL=0, CPHA=0)或模式 3(CPOL=1, CPHA=1)。
  • 采样沿 —— 标准 SPI 用 SCK 上升沿采样数据。但在 DDR 模式下,上升沿和下降沿都要采样。
经验值: 我个人习惯优先用模式 0 来调试,因为大部分 MCU 的 QSPI 控制器默认也跑在模式 0。先让通信通起来,再调高性能。

3.2 复位时序(RESET# / RST#)

复位其实比想象中复杂。有些 Flash 上电后内部需要一段时间才能响应命令,这叫“上电初始化时间(tVSL)”。

  • 复位低电平维持时间(tRP) —— 通常需要 ≥ 30μs,但某些器件要求 ≥ 100μs。我建议宁长勿短。
  • 复位到正常工作延迟(tRST) —— 复位释放后,还要再等一小段时间,Flash 才会准备好。
  • 软件复位(Reset 命令) —— 0x66 + 0x99 序列,很多设计会忽略这个,导致热插拔后状态机卡死。
我曾经踩过的坑: 一块板子用 QSPI 启动,第一次上电正常,热复位后 CMD 指令 FPGA 一直超时。后来查出来是 MCU 复位后立马发送命令,而 Flash 还在“发呆”。加上一段 150μs 的延时后,问题解决。

4. 本章核心结构图

下面这张图把 NOR 和 NAND 的结构差异以及 QSPI Flash 的内部模块串在了一起,方便你对照理解。

NAND Flash 与 NOR Flash 结构差异 + QSPI Flash 内部框图 NAND Flash vs NOR Flash 结构差异 NAND Flash 内部结构 串行页结构(Page = 2KB ~ 4KB) 块擦除(Block = 128KB ~ 1MB) 页缓冲 + ECC 校验 存储密度高(单芯片可达 8Gb+) 读取速度慢(需先加载到 SRAM) 应用场景:大容量存储 / 文件系统 NOR Flash 内部结构 随机访问(字节寻址) 扇区擦除(Sector = 64KB) 按字节/字编程 存储密度低(通常 ≤ 512Mb) 读取速度快(支持 XIP) 应用场景:代码存储 / XIP 启动 密度 vs 速度 QSPI Flash 内部核心模块 存储阵列 页缓冲 状态寄存器 配置寄存器 时钟管理 I/O 控制 调频调相前,必须确认芯片类型(NOR/NAND)、配置寄存器布局、时钟最大频率、以及复位延迟时间。 一次失败的复位可能让整块板子“假死”,总线挂掉,连调试器都连不上。

5. 几个需要警惕的地方

  • 上电时序: QSPI Flash 对 VCC 的上升斜率有要求,太慢可能导致内部 POR(上电复位)无法正确触发。
  • 复位引脚: 如果芯片没有独立的 RST# 引脚,只能通过软件复位命令。这个命令序列 (0x66 + 0x99) 千万别发反了。
  • 多设备共用总线: 多个 QSPI 设备挂一条线上时,片选信号必须先释放再拉低。我曾见过两个 Flash 因为片选时序重叠,导致数据总线冲突,烧了好几个片子才找到原因。
最后给个建议: 拿到一块新 Flash 芯片,先花 15 分钟看 datasheet 的 "AC Characteristics" 和 "Initial Delivery State" 两章。上面写清楚了上电后的默认状态、寄存器初始值以及时钟约束。省得后面调试时抓瞎。