QSPI Flash 类型:NOR Flash 与 NAND Flash 的特点与选型
做 QSPI 启动,第一件事就是选 Flash。选错了,后面时序调得再好也白搭。
市面上常见的 QSPI Flash 就两大类:NOR 和 NAND。别看它俩都叫 Flash,内部架构、读写方式、可靠性差的不是一星半点。我刚开始做嵌入式那会儿,觉得「都是 Flash,能存代码就行」,结果被坑过几次才老实了。
1. 两种 Flash 的架构差异
NOR 和 NAND 名字来源于逻辑门结构。NOR 的存储单元并联,像「或非门」;NAND 的单元串联,像「与非门」。结构不同,带来了本质差异。
- NOR Flash:每个存储单元独立连接位线,随机读取极快,几乎可以当 ROM 用。但也因为这个结构,单元尺寸大,密度做不高。
- NAND Flash:单元串成一串,通过页(Page)和块(Block)组织,密度高、成本低,但随机读取慢,必须按页读。
说白了,NOR 像一本每页都能直接翻开的书,NAND 像一本必须按「页」翻的册子。你想直接跳到第 837 页?NOR 可以,NAND 得先算偏移。
2. NOR Flash 核心特点
NOR 最大的王牌就是 XIP(eXecute In Place)。代码可以直接在 Flash 上跑,不用先搬到 RAM。这个特性对 QSPI 启动来说太关键了。
- 随机读取延迟低,通常 50–100 ns。
- 支持字节/半字/字读取,粒度很细。
- 写入和擦除慢,擦除一个扇区通常几百毫秒。
- 单芯片容量一般在 16 MB~128 MB,再大就贵得离谱。
- 可靠性高,位翻转概率极低,通常不需要 ECC。
经验之谈:我之前做一个工业控制器,代码 6 MB 出头,选了一颗 64 MB 的 NOR Flash。启动时间 400 ms 就完成了,XIP 跑得稳稳当当。如果当时图便宜换成 NAND,光搬运代码到 RAM 就得再加 200 ms,还不算坏块管理的开销。
3. NAND Flash 核心特点
NAND 的优势就一个字:大。一颗芯片轻松做到 1 GB、2 GB,价格只有 NOR 的几分之一。
- 读取以页为单位(通常 2 KB~16 KB),随机读取慢。
- 写入和擦除比 NOR 快得多,尤其连续写入。
- 天生存在坏块,出厂就有,使用中还会新增。
- 必须搭配 ECC(纠错码)和坏块管理,软件复杂度高。
- 不支持直接 XIP,代码需要先加载到 RAM 再执行。
避坑提醒:我曾经在一个数据采集项目里用了 NAND 存储配置文件,没做坏块映射。结果用了一年后某个块坏了,配置读出来全是 0xFF,设备直接罢工。后来老老实实上了完整的 NAND 驱动栈,再没出过事。
4. 关键性能对比
下面这个表我每次选型都会翻出来看。你直接收藏也行。
| 对比项 | NOR Flash | NAND Flash |
|---|---|---|
| 随机读取 | ~70 ns(QSPI 模式下) | ~25 µs(首字延迟) |
| 连续读取 | ~50 MB/s(QSPI @ 100 MHz) | ~200 MB/s(QSPI @ 100 MHz) |
| 页写入 | ~500 µs(256字节) | ~200 µs(4 KB 页) |
| 块擦除 | ~500 ms(64 KB 块) | ~2 ms(128 KB 块) |
| 单芯片密度 | ≤ 128 MB(主流) | ≤ 2 TB(主流) |
| XIP 支持 | ✅ 原生支持 | ❌ 不支持 |
| 位翻转率 | < 10⁻¹⁵ | ~10⁻⁹(需 ECC) |
| 每 MB 成本 | 高(~$0.1/MB) | 低(~$0.01/MB) |
核心结论:NOR 读快写慢、密度小、可靠;NAND 读慢写快、密度大、需要管理。怎么选?看你的应用要「跑代码」还是「存数据」。
5. 选型决策流程
我把选型逻辑画成了一张图。每次给团队新人讲,我都直接甩这个。你跟着走一遍,基本不会选错。
6. 可靠性分析与避坑
这一节我要多说几句。因为可靠性往往是选型时被忽略的「隐形炸弹」。
NOR Flash 的存储单元结构稳定,位翻转率极低。我测过一批工业级 NOR,连续读 1000 小时,零错误。做代码存储几乎不用操心 ECC。
NAND Flash 就不一样了。因为单元串在一起,漏电和干扰都会导致位翻转。尤其 TLC、QLC 这种高密度颗粒,出厂就有坏块,使用中还会产生新坏块。
我曾经踩过的坑:有次为了压缩 BOM 成本,在启动设计里用了一颗 NAND Flash,打算把代码搬运到 RAM 再执行。结果没做坏块跳过,某个块刚好在代码分区,启动到一半就挂了。从那以后我定了一条死规矩——启动代码必须用 NOR,数据存储才考虑 NAND。
7. 选型建议与实战清单
怎么选?我整理了一份清单。每次新项目拿到需求,我就照着这几步走:
- 确认是否需要 XIP。——是 → 直接锁定 NOR。
- 估算代码大小。——< 16 MB → NOR 很舒适;> 64 MB → NAND + 加载方案。
- 看数据密度。——纯代码 + 小配置 → NOR;大数据采集、文件系统 → NAND。
- 评估可靠性。——车规、工控、医疗 → NOR 优先;消费电子 → NAND 可接受。
- 算成本。——NOR 每 MB 贵 10 倍,但省了 ECC 和坏块管理的研发成本。
个人习惯:我给自己定了个「16 MB 法则」——代码不到 16 MB 且需要 XIP,闭眼选 NOR;超过 16 MB 且不依赖 XIP,再考虑 NAND。这个原则帮我省了至少 5 次选型争议。
8. 选型逻辑快速参考
下面这段伪代码我经常贴在项目 Wiki 里。新同事一看就懂。你也可以直接拿来用:
/* QSPI Flash 选型决策(伪代码) */
if (need_xip == true) {
/* 必须支持片内执行 */
if (code_size <= 16_MB) {
flash_type = "NOR Flash (单芯片)";
} else {
flash_type = "NOR Flash (多片级联)";
}
} else {
/* 不需要 XIP,代码可搬运到 RAM */
if (storage_density >= 128_MB) {
flash_type = "NAND Flash (需 ECC + 坏块管理)";
} else {
flash_type = "NOR Flash (更简单可靠)";
}
}
一句话总结:做 QSPI 启动选型,先问自己三个问题——要不要 XIP?代码多大?预算多少?答案有了,选型也就定了。