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