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. 选型决策流程

我把选型逻辑画成了一张图。每次给团队新人讲,我都直接甩这个。你跟着走一遍,基本不会选错。

NOR vs NAND Flash 选型决策图 系统存储需求 需要 XIP 启动? NOR Flash NAND Flash ✓ 随机读取快 ✓ 支持 XIP ✗ 密度低 (≤ 128 MB) ✓ 密度高 (≥ 1 GB) ✗ 需 ECC + 坏块管理 选型结论:代码存 NOR,数据存 NAND 🔑 选型核心:代码存储选 NOR,数据存储选 NAND 是 (XIP) 否 (数据存储)

6. 可靠性分析与避坑

这一节我要多说几句。因为可靠性往往是选型时被忽略的「隐形炸弹」。

NOR Flash 的存储单元结构稳定,位翻转率极低。我测过一批工业级 NOR,连续读 1000 小时,零错误。做代码存储几乎不用操心 ECC。

NAND Flash 就不一样了。因为单元串在一起,漏电和干扰都会导致位翻转。尤其 TLC、QLC 这种高密度颗粒,出厂就有坏块,使用中还会产生新坏块。

我曾经踩过的坑:有次为了压缩 BOM 成本,在启动设计里用了一颗 NAND Flash,打算把代码搬运到 RAM 再执行。结果没做坏块跳过,某个块刚好在代码分区,启动到一半就挂了。从那以后我定了一条死规矩——启动代码必须用 NOR,数据存储才考虑 NAND。

7. 选型建议与实战清单

怎么选?我整理了一份清单。每次新项目拿到需求,我就照着这几步走:

  1. 确认是否需要 XIP。——是 → 直接锁定 NOR。
  2. 估算代码大小。——< 16 MB → NOR 很舒适;> 64 MB → NAND + 加载方案。
  3. 看数据密度。——纯代码 + 小配置 → NOR;大数据采集、文件系统 → NAND。
  4. 评估可靠性。——车规、工控、医疗 → NOR 优先;消费电子 → NAND 可接受。
  5. 算成本。——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?代码多大?预算多少?答案有了,选型也就定了。