SPI NAND 与并行 NAND / SD NAND 选型对比
三条产品线的控制器归属、协议成本与场景边界 —— 面向存储器件选型决策的横向对比 | 编制日期 2026-10-14 | 版本号 Rev 1.0
并行 NAND、SPI NAND、SD NAND 这三个名字经常被放在一起比较,但它们之间不是新旧替代关系,也不是高低档关系。它们是三种不同的架构契约:并行 NAND 把控制器放在主芯片里、SPI NAND 把控制器放进器件但用标准 SPI 暴露、SD NAND 把控制器放进器件并封装成 SD 形态。选型的第一问因此不是「哪个更快」,而是「这块存储的责任边界画在哪里」。
这份文档不讲存储单元物理、不讲 3D NAND 堆叠,也不逐颗器件写规格(那些属于同系列的其它文档)。它只做一件事:把三条线的责任划分、协议成本、可靠性分工与场景边界讲清楚,并给出一套可以直接照着走的五步选型法。看完你应该能判断「我的项目该锁哪一条线,以及为什么」。
结论: 三条线是三种不同的「谁负责」架构契约,而不是同一件事的三个档位。 并行 NAND = 主控全责(介质只做存储),SPI NAND = 器件内控制器 + 标准 SPI 接口, SD NAND = 器件内控制器 + SD 协议与 SD 形态。 选型先问责任边界画在哪里,再问性能与成本; 凡是容量与形态已被应用场景锁死的、性能差距多数场景不重要的、可观测性要求高的场景,三条线各自的边界会直接替你把答案选出来。 所有数值均为能力量级区间与定性描述,实际设计一律以正式 datasheet 与实测为准。
读者路径
- 只想快速定选型:直接看第 10 章(五步选型法)与第 10.7 节(什么条件直接锁死选型),比通读全文更快出结论。
- 想搞懂三条线的根本差别:按第 1 章(责任边界)→ 第 2 章(技术源头)读,这一章是全文的地基。
- 正在做 MCU 或小系统设计:第 4 章(SPI NAND)+ 第 5 章(SD NAND)+ 第 11.1 节(低成本 MCU 系统)。
- 正在做大容量扩展:第 3 章(并行 NAND)+ 第 7 章(性能与容量)+ 第 11.2 节(高端 SoC 扩展)。
- 关心可靠性与车规落地:第 9 章(可靠性与生命周期)+ 第 11.5 节(车规与工业长寿命)。
- 要动手写文档或做评审:附录 B(逐项对照速查)、附录 C(选型自查表)与附录 D 的适用边界,是可以直接引用的形式。
1. 三条线为什么不是替代关系
这一章不介绍任何一颗器件,只先把一件事说清楚:三条线之间的差别不是性能高低,而是控制器放在哪里、谁负责协议与可靠性。这一层讲明白,后面的性能、成本、可靠性对照就都只是它的推论。
1.1 责任边界:控制器在哪里
NAND 介质本身只做一件事:按页存、按块擦、留出坏块与 ECC 的冗余位。除此之外的一切——地址译码、时序产生、ECC 编解码、坏块管理、磨损均衡、块映射——都属于控制器。控制器在哪里,就决定了谁来实现这些工作。
- 并行 NAND:器件里只有介质阵列加一堆引脚。控制器在主芯片里,主控承担全部协议与可靠性责任。
- SPI NAND:器件里除了介质阵列,还装了控制器与一块缓存,但对外只暴露一组标准 SPI 信号。主控只发标准命令,介质管理由器件内的控制器承担。
- SD NAND:器件里有控制器,并被封装成 SD 形态、通过 SD 协议对外。主控把它当成一块「有智能的存储卡」,枚举、初始化与块读写都按 SD 的方式走。
所以三条线最本质的差别是责任边界的位置,而不是接口形式的繁简。接口只是责任边界的外部表现。
| 对照项 | 并行 NAND | SPI NAND | SD NAND |
|---|---|---|---|
| 控制器位置 | 主芯片内部 | 器件内部 | 器件内部 |
| 器件对外暴露什么 | 地址线、数据线、控制线与就绪信号 | 标准 SPI 信号(时钟、数据、状态) | 标准 SD 信号(时钟、数据、命令、状态) |
| 主控看到的东西 | 一堆需要自己驱动的信号 | 一颗标准命令式的串行器件 | 一块需要枚举与初始化的存储卡 |
| 介质管理的实现方 | 主控 | 器件内控制器 | 器件内控制器 |
| ECC / 纠错的责任方 | 主控 | 器件内控制器 | 器件内控制器 |
| 坏块与磨损管理 | 主控 | 器件内控制器 | 器件内控制器 |
| 主控侧要写的协议层 | 完整的 NAND 协议栈与 FTL | 标准 SPI 命令与少量状态处理 | 标准 SD 主机驱动 |
| 一句话概括 | 介质裸奔,主控全责 | 器件自带管理,主控发命令 | 器件自带管理与协议,主控当它是张卡 |
1.2 三种架构契约的对照
把上一节的对照再往上抽一层,就得到三种架构契约。契约的意思是:器件与主控之间有一份默认的责任划分,双方都按它设计系统,任何一方违约都会给对方带来额外负担。
| 契约 | 器件承诺给主控什么 | 主控承诺给器件什么 | 违约时的后果 |
|---|---|---|---|
| 契约 A · 主控全责(并行 NAND) | 稳定的电气接口与介质级的可靠性(坏块标记、冗余位) | 承担全部时序、地址译码、ECC、坏块与磨损管理 | 主控的 FTL 一旦有缺陷,所有介质缺陷都会变成不可控的数据损坏 |
| 契约 B · 器件内控制器(SPI NAND) | 标准命令语义、页内缓存写入、介质管理与健康状态 | 按时序驱动标准命令、处理状态与忙信号 | 主控若绕过标准命令直接改参数,可能与器件内管理逻辑冲突 |
| 契约 C · SD 形态(SD NAND) | 标准 SD 协议语义、枚举与初始化行为、介质管理 | 按 SD 主机角色发起命令并处理状态 | 主控若跳过初始化与状态检查,器件可能处于不可预期的模式 |
一旦把三条线看成三种契约,选型讨论就会从「你嫌我慢」变成「你要承担多少」。前一种问法永远争不出结果,因为三条线各自都有它比另外两条强的地方;后一种问法可以直接落到工时、BOM 与风险上。第 8 章与第 10 章全部建立在契约视角之上。
1.3 常见误解:把 SD NAND 当「更小的并行 NAND」
这是三条线里最常见、代价也最大的误解。很多项目在 SD NAND 刚铺开时,设计者仍按并行 NAND 的思路用它:以为它只是「小一点的 NAND」,于是把原有的 NAND 驱动原封不动搬过去。结果是协议层完全不匹配。
| 误解 | 如果按误解去做会发生什么 | 正确的理解 |
|---|---|---|
| 以为 SD NAND 只是容量更小的并行 NAND | 主控按并行时序驱动,实际器件根本不响应,表现为「读出来全是坏数据」 | SD NAND 是 SD 协议器件,主控必须以 SD 主机角色发起命令 |
| 以为不需要初始化就能直接读写 | 器件处于未初始化状态,容量识别与分区信息全都不对 | 上电必须走完整的枚举与初始化流程,包括电压协商与状态确认 |
| 以为可以像访问 SPI NOR 那样按地址连续线性读 | 跨页与跨块访问的语义完全不同,后果是随机读出错 | SD 协议以块为单位组织访问,读写语义必须按块对齐 |
| 以为 SD NAND 的可靠性天然比并行 NAND 好,所以不用管 | 厂商的可靠性承诺建立在「按规范使用」的前提上,误用不在承诺范围内 | 内置控制器让典型用法更省心,但不等于可以跳过主控侧的一致性设计 |
1.4 常见误解:把 SPI NAND 当「串行化只是为了省引脚」
第二种误解恰好相反:把 SPI NAND 当成「串行化的并行 NAND」,认为它只是把并行信号压缩到少数几根线上,协议层还是原来那套。这会导致严重低估器件内控制器已经替你做完的工作,从而做出错误的成本与工时估算。
- 省引脚只是副作用:SPI 接口省下的是引脚与布线,但真正改变的是责任划分——器件内部的控制器接管了介质管理,主控不再需要 ECC 与坏块管理逻辑。
- 协议层确实变简单了:主控不再处理页与块之间的映射、不再自己做 ECC、不再维护坏块表。这些工作不是消失了,而是搬到了器件内部。
- 但并没有变得「零工作」:主控仍然要处理上电初始化、忙状态、异常复位、写保护状态变更,以及掉电一致性。器件内置控制器不能替主控决定「什么时候写」与「写完怎么确认」。
| 工作项 | 并行 NAND 方案里谁做 | SPI NAND 方案里谁做 | 主控侧的实际变化 |
|---|---|---|---|
| 地址到物理页的映射 | 主控 | 器件内控制器 | 主控代码明显变少 |
| ECC 编解码 | 主控 | 器件内控制器 | 主控不再需要 ECC 引擎或其配置 |
| 坏块管理 | 主控 | 器件内控制器 | 主控不再维护坏块表 |
| 磨损均衡与块映射 | 主控 | 器件内控制器 | 主控不再做擦写调度 |
| 上电初始化 | 主控 | 双方各做一部分 | 主控仍需按时序完成器件初始化 |
| 忙状态与异常处理 | 主控 | 器件内控制器提供状态 | 主控仍需完整处理 |
| 写保护与状态保存 | 主控 | 器件内控制器 | 主控仍需在关键时点切换保护状态 |
| 掉电一致性设计 | 主控 | 器件内控制器无法覆盖 | 主控责任不变,这部分工时不省 |
1.5 三条线的定位全景图
把三条线放到同一张坐标图上,差别会变得非常直观。横轴是责任边界的位置(主控 → 器件),纵轴是主控要面对的软件复杂度。三者是同一条下降曲线上的三个位置,而不是三个等级。
图 1 描述的是责任分布,不是优劣排序。往右下走虽然主控负担更轻,但也意味着主控失去了对介质的直接控制力——一旦需要处理异常、榨取极限性能或做特殊的掉电恢复,能用的手段会明显变少。所以选型不是「越往右下越好」,而是把责任放到它该放的位置。
1.6 本文要回答的问题清单
本文要回答的问题就是下面这八条。它们覆盖了存储器件选型决策里真正会起作用的问题,顺序也与第 10 章的五步法一致。
- 责任边界:三条线各自把协议与可靠性的责任放在哪一侧,主控因此要多做多少事。
- 技术源头:三条线各自从哪里长出来,为什么今天会长成这个样子。
- 接口代价:每条线对信号数量、供电域、时序与布线提出的真实要求。
- 主控工作量:包括协议栈、介质管理、异常处理与掉电一致性在内的完整账目。
- 性能真相:标称速率与实际吞吐之间的差距来自哪里,哪些场景根本感知不到差距。
- 全成本:器件、主控侧工时、外围电路、PCB 面积与隐性验证成本的合计。
- 可靠性责任:谁能提供健康度信息,失效以什么形式出现在现场。
- 场景落点:六类典型场景分别落到哪条线上,以及为什么。
选型的第一问不是「哪个更快」,而是「这块存储的责任边界画在哪里」。一旦这句话成为习惯,剩下的问题都会变得容易——因为三条线的能力差异,本质上都是从这一句推出来的。
2. 三条线的技术源头与演进路径
上一章给出了结论,这一章解释它为什么会是这样。三条线各有自己的起点:并行 NAND 来自计算机主存的传统,SPI NAND 来自「把控制器搬进器件」的一次分工调整,SD NAND 来自 SD 卡的生态。这三条源头决定了它们今天各自的强项与短板。
2.1 并行 NAND 的传统地位
并行 NAND 是三条线里最年长的一条,也最贴近「原始形态」。闪存技术早期,NAND 阵列的读出电路复杂度高、随机访问能力弱,而当时的系统里已经有一个很成熟的控制器——CPU 本身或它旁边的芯片组。把控制器放在主芯片里,于是成为天然选择。
- 它的优势来自时间:几十年的主控实现、验证与产线经验都沉淀在主控侧,介质侧的接口定义反而很简单,就是标准时序下的地址与数据。
- 它的短板也来自这一点:因为控制器在主芯片里,主控的引脚数量、布线复杂度与协议栈规模都随容量需求一起增长,规模越大的系统越吃不消。
- 它的形态在固化:并行 NAND 的接口是并行总线,信号数量大、布线密度高,需要多层板与较多布线资源。在板上空间与成本敏感的系统里,这本身就是一道门槛。
| 维度 | 并行 NAND 的传统特征 | 这种特征带来的结果 |
|---|---|---|
| 控制器归属 | 在主芯片内 | 介质与主控之间的责任划分非常明确,主控有完全的控制力 |
| 接口形态 | 地址线 + 数据线 + 控制线的并行总线 | 信号数量多,布线密度高,需要较多 PCB 资源 |
| 时序控制 | 由主控按标准时序产生 | 主控必须精确满足时序要求,时序余量需逐条核对 |
| 介质管理 | 全部在主控 | 主控侧代码量大,且必须逐代验证累积的缺陷数据 |
| 容量扩展 | 受引脚与布线限制明显 | 大容量扩展时成本与难度非线性上升 |
| 生态 | 主控侧方案成熟、案例极多 | 风险低,但工程投入也高 |
2.2 SPI NAND 如何把控制器装进器件
SPI NAND 的诞生是一次明确的分工调整:把原在主芯片里的介质管理逻辑搬进器件,让器件自己管理自己,对外只用一组最省引脚的 SPI 接口。动机很直接——主控侧的 NAND 协议栈是重复劳动,每家主控厂都要重写一遍,而且越写越复杂。
分工调整之后,主控侧只需要做三件事:发一条标准命令、给地址、等状态。但器件侧必须补上原来由主控做的全部工作——缓存管理、ECC、坏块与磨损均衡。这是一次责任的大规模转移,也是三条线里技术含量最高的一次重构。
| 转移的动作 | 从谁转移到谁 | 转移后主控侧的变化 | 转移后器件侧的要求 |
|---|---|---|---|
| 地址到物理位置的映射 | 主控 → 器件 | 主控只给逻辑地址,不再维护映射表 | 器件内控制器要维护映射,且映射信息必须在掉电后可恢复 |
| ECC 编解码 | 主控 → 器件 | 主控不需要 ECC 引擎与相关配置 | 器件要处理软硬ECC,并在状态里暴露纠错统计 |
| 坏块管理 | 主控 → 器件 | 主控不再维护坏块表 | 器件要维护坏块表并在出厂或运行中完成标记 |
| 磨损均衡与块调度 | 主控 → 器件 | 主控不再做擦写调度 | 器件要在内部做均衡,且不能明显牺牲吞吐 |
| 读缓存 | 主控 → 器件 | 主控不再需要自己做读缓存 | 器件要有页内缓存与连续读能力 |
| 初始化与参数配置 | 双方分担 | 主控仍需按时序完成初始化序列 | 器件要提供参数存储与状态上报机制 |
2.3 SD NAND 的 SD 协议血统与形态演化
SD NAND 的血统很清楚:它不是把 SPI NAND 换个封装,而是把 SD 卡的整套协议血统搬到 NAND 介质上。SD 协议本身已经解决了枚举、电压协商、初始化状态机、块寻址、状态上报与命令响应模型——这些机制在 SD 卡上跑了二十多年,成熟度很高。
- 形态上:标准 SD 形态让主控侧的驱动可以直接复用现成的 SD 主机驱动栈,无论主控是 MCU 还是 SoC。
- 协议上:SD 协议是命令-响应模型,命令有明确编号与参数结构,主控不需要理解 NAND 的页与块概念。
- 代价上:命令与响应有固定的往返开销,协议本身比裸 SPI 复杂,因此在小容量高频访问场景里不一定占优。
- 能力上:器件内控制器仍然承担介质管理,但它的实现细节与协议实现是两件事,主控只看到 SD 协议。
2.4 三条线各自的起点与演进关系
把三条线的起点画出来,会看到它们不是一条线上的三个阶段,而是从三个不同源头分叉出来的三条支线。它们今天并存,是因为各自解决的是不同的问题,而不是因为有的还没被淘汰。
2.5 为什么三条线长期并存
如果三条线只是同一个问题的三种解,早晚会有一种胜出。但它们长期并存,说明它们各自解决的问题在不同应用里权重完全不同。下面这张表列出每条线「不可替代的场景条件」。
| 产品线 | 不可替代的场景条件 | 一旦这些条件不成立会怎样 |
|---|---|---|
| 并行 NAND | 主控本来就有成熟 NAND 控制器;系统需要主控直接控制介质(如启动阶段对时序的严格控制);容量不大但对成本极敏感 | 主控侧投入不划算,会被器件内控制器的方案反超 |
| SPI NAND | 主控资源紧张(引脚少、Flash 与 RAM 都吃紧);需要中等容量与可接受的吞吐;希望保留通用 SPI 总线以复用驱动 | 如果需要更高带宽或更大容量,SPI 的信号效率会成为瓶颈 |
| SD NAND | 应用形态天然是「可插拔/可升级的存储」;需要现场换存储而不换主板;主控已有成熟的 SD 主机驱动栈 | 如果形态固定、容量确定且不需要现场更换,SD 的协议开销就不划算 |
一个应用如果同时具备主控资源紧张、容量不大、需要现场更换存储这三个条件,那么 SD NAND 会明显胜出;如果同时具备主控有成熟控制器、只需要中等容量、成本极敏感,并行 NAND 更合适。三个条件都不具备时,才需要真正做取舍——这解释了为什么很多项目里选型争议并不大。
2.6 控制器内置后的收益与代价
把「把控制器内置进器件」这件事单独拿出来算一次账,后面第 4、5 章的收益与代价就都是它的细化版本。这一节先给总账。
| 收益 / 代价 | 具体内容 | 谁获得收益 | 谁承担代价 |
|---|---|---|---|
| 收益 · 主控代码量下降 | 地址映射、ECC、坏块与磨损管理从主控移到器件 | 主控厂与软件团队 | 器件厂要把这些逻辑做进每一颗器件 |
| 收益 · 引脚与布线下降 | 从多信号并行总线变成少量串行信号 | 硬件与 PCB 团队 | 带宽上限受串行速率限制 |
| 收益 · 复用现成协议栈 | SPI 或 SD 都有大量现成驱动 | 软件团队 | 几乎为零 |
| 收益 · 健康状态可读 | 器件能上报自身健康与统计信息 | 运维与现场调试 | 需要主控设计上报处理与记录机制 |
| 代价 · 控制力下降 | 主控无法直接干预器件内部的介质管理决策 | — | 主控侧需要更强的软件纪律来补偿 |
| 代价 · 器件复杂度上升 | 器件内控制器占用面积、功耗与良率 | 器件厂 | 器件单价与固定成本上升 |
| 代价 · 协议开销 | 命令与响应往返、状态轮询带来的时间成本 | — | 主控与系统工程师需要在协议层做优化 |
| 代价 · 黑盒化排障 | 出错时能做的内部观测更少 | — | 现场问题定位更依赖厂商支持与自身日志设计 |
① 什么时候写:介质策略在器件里,但写入时机永远由主控决定,数据一致性也由主控保证。
② 写完怎么确认:器件会回报状态与忙信号,但「这次写入是否满足业务一致性」要主控自己判断。
③ 掉电时怎么办:器件内部逻辑在掉电时同样会中断,关键数据的保护必须由主控侧设计。
④ 异常如何恢复:器件挂在总线上、或者器件内部状态异常时,主控需要有明确的恢复路径。
把这四件事当成人云亦云的「器件会处理」,是内置控制器方案最常见的现场问题来源。
3. 并行 NAND:主控全责架构
这一章逐条拆开并行 NAND 的完整画像。核心判断只有一句:介质只做存储,协议与可靠性的全部责任都在主控。它的优势与代价都从这一句推出来。
3.1 架构画像:主控承担什么
并行 NAND 器件内部只有介质阵列、译码门电路、坏块标记与冗余位,不含任何管理逻辑:地址映射、ECC、磨损均衡、坏块表都不在器件里。
因此主控的清单很长:初始化、地址映射、页与块管理、读缓存、写缓冲、ECC 编解码、坏块管理、磨损均衡、擦写调度、异常处理。任何一项做错都表现为数据错误或掉数据,而且往往几个月后才暴露。
| 层次 | 并行 NAND 里由谁负责 | 器件侧提供的原始条件 | 做错时的典型表现 |
|---|---|---|---|
| 接口电气 | 主控 | 信号按标准时序定义,器件不做时序拉伸 | 偶发读错,表现为随机位数错误 |
| 地址映射 | 主控 | 只给物理地址,不做逻辑转换 | 读到错位置的数据,肉眼难发现 |
| 块管理 | 主控 | 只提供块的擦除与编程 | 写入越界或块被误擦 |
| 纠错 | 主控 | 只提供冗余位,不做编解码 | 纠错不足或逻辑与冗余位不匹配 |
| 坏块管理 | 主控 | 只提供坏块标记位的读与写 | 分配到坏块,直接读出错误数据 |
| 磨损均衡 | 主控 | 不提供任何磨损信息 | 少数块被反复擦写,提前失效 |
| 映射信息持久化 | 主控 | 不保存映射信息 | 掉电后映射丢失,数据位置错乱 |
很多项目评估并行 NAND 时只看器件单价,忽略了映射信息的持久化与掉电恢复是一条完整的工程线:映射表存在哪里、什么时候更新、掉电时如何保证映射与数据一致、恢复失败如何降级。这些逻辑必须逐代验证累积的缺陷数据,代码量往往超过驱动本身。这是并行 NAND 真实成本的主要构成,也是它在小系统里最不划算的地方。
3.2 硬件接口画像:信号、电源域与时序
硬件层面并行 NAND 的特征可用三个词概括:信号多、时序严、布线密。这三点直接决定了它在大容量扩展时的成本曲线。
| 维度 | 并行 NAND 的要求 | 设计上的约束 | 常见做法 |
|---|---|---|---|
| 信号数量 | 地址线、数据线、控制线与状态线合计数十根 | 占用大量主控引脚与连接器位置 | 尽量与主控引脚规划一起定,避免后期返板 |
| 数据位宽 | 常见 8 位或 16 位可选,决定每周期搬运的数据量 | 位宽加宽会显著增加引脚与布线 | 带宽够用即可,不追求加宽 |
| 时序要求 | 地址建立保持、数据有效与边沿关系都有窗口 | 必须逐条核对规格书给出的时序参数 | 留足建立保持余量,不按典型值设计 |
| 就绪信号 | 器件用就绪信号表示忙闲 | 主控必须以轮询方式等待,不能假设固定延时 | 轮询就绪信号,禁止固定延时假设 |
| 电源域 | 通常与主控同一电源域,也有器件需要额外电压 | 额外电压要单独供电并考虑上电时序 | 与主控共用电源域可省去时序问题 |
| 封装形态 | 多为 BGA 或 TSOP,引脚密度高 | PCB 层数与工艺要求上升 | 布线资源不足时该方案应尽早放弃 |
3.3 软件画像:主控要实现的协议栈
软件层面,并行 NAND 要求主控实现的东西可以按四层来看。四层里每一层都需要独立的验证工作量,加起来的总量往往超出项目初期估计。
- 物理层:按规格书时序驱动信号,处理就绪与忙,遵守编程与擦除的最小时间要求。这一层最简单但最容易出错,因为时序窗口的余量往往比直觉小。
- 块层:把逻辑地址翻译成物理页与块,维护坏块表,在坏块上做标记与替换,并保证映射信息可持久化。
- 纠错层:按器件要求的冗余位布局做编码与解码,在读出错时按策略处理,并向上层上报纠错统计。
- 调度层:磨损均衡、擦写调度、垃圾回收与写放大控制,决定了器件的实际寿命表现。
这四层加起来的代码规模,通常是三条线里最大的。而其中第三、四层的难度不在于写出来,而在于验证:缺陷注入、掉电模拟、长时间寿命测试都是必需的。物理层要在多颗器件与多批样品上重复验证时序余量;块层要模拟掉电以确认映射与数据一致;纠错层要注入错误验证策略真的能救回来;调度层属于长期行为,只能靠长时间或加速测试才暴露问题。也正因为如此,这一层最容易被低估的是「上层接口」——错误码语义要与应用层对齐,而现实中最常见的问题恰恰是每一层都以为对方会处理。
这四层代码在设计上不复杂,但在产品化过程中极度依赖历史数据:哪颗器件哪个批次容易出问题、哪种坏块形态最常见、哪种掉电场景最致命,这些都要靠长期积累。所以同一家主控厂在不同系列上的实现质量差别可能很大。
如果你的项目选并行 NAND,优先选已有成熟平台支持的主控,而不是自己从零写这四层——这个选择的收益远大于器件价差。
3.4 可靠性画像:ECC、坏块、FTL 全在主控
可靠性是并行 NAND 最大的风险来源,因为它的全部保护机制都依赖主控侧实现得对,器件本身不提供任何保护。保护机制由三部分组成:
- 冗余位与 ECC:器件预留冗余位,主控负责编解码。主控选的纠错强度必须与器件的冗余位布局匹配,强度不足则保护无效,强度过高则可能超出器件冗余位容量。
- 坏块管理:器件出厂时已标记初始坏块,运行期新增的坏块靠擦除或编程失败来发现。主控必须在发现后完成标记、替换与映射更新。
- 磨损均衡:主控要主动把擦写分散到所有块,避免少数块被反复使用。这项对寿命的影响在长期运行的产品里往往是决定性的。
| 保护机制 | 器件提供什么 | 主控必须做什么 | 缺失时的后果 |
|---|---|---|---|
| ECC 与冗余位 | 预留冗余位与写入结构 | 按布局编码写入、读出后解码、按策略重试与上报 | 纠错失效,数据错误直接暴露给应用 |
| 初始坏块 | 出厂时标记的坏块位置 | 上电时读取并建立初始坏块表 | 把数据分配到初始坏块,读出来就是错的 |
| 运行期坏块 | 擦除或编程时以状态反映失败 | 识别失败、标记块、迁移数据、更新映射 | 坏块被继续使用,数据静默丢失 |
| 磨损均衡 | 不提供磨损相关信息 | 统计擦写次数、主动调度、把冷数据合并 | 少数块提前失效,寿命远低于标称 |
| 映射持久化 | 不保存任何映射 | 设计持久化格式、掉电一致性与恢复流程 | 掉电后地址错乱,整片数据不可用 |
3.5 并行 NAND 的优势与代价
把前四节的账合起来,并行 NAND 的优势与代价都很鲜明。它的优势集中在控制力与带宽,代价集中在主控投入与布线资源。
优势集中在四处:带宽高(每周期搬运多位,大页连续读时吞吐显著,前提是引脚与布线资源充足)、控制力强(可做特殊调度、预取与异常干预,前提是主控有足够算力与代码预算)、介质成本低(单位容量成本三条线最低,但需容量够大才能摊薄固定成本)、生态成熟(长期量产验证、风险最低,前提是能拿到成熟平台支持)。代价同样明确:引脚与布线数量多、密度高,PCB 成本与工艺要求上升,空间紧张或层数受限时问题被放大;主控工作量四层软件全在主控、验证投入三条线最大;映射持久化必须由主控保存并保证掉电一致,方案不成熟会直接导致数据事故;规模不经济则意味着小容量时这笔账算不过来。
3.6 什么时候选并行 NAND
并行 NAND 的适用条件相当明确。它不是「保守的选择」,而是在特定条件下唯一合理的形态。
归拢成一句话:主控已有成熟的并行 NAND 平台支持且无需自研、容量需求在几百 MB 到数 GB 量级、引脚与布线资源充足且 PCB 层数不受限、需要连续大块高速读取且主控能吃满带宽、项目团队有 NAND 介质管理经验——这五条同时成立时并行 NAND 是推荐答案。
主控本来就带成熟 NAND 控制器,且容量需求正好落在它的舒适区。典型情况是 SoC 平台自带 NAND 控制器(很多应用处理器都这样集成),外部再挂并行 NAND 扩容。此时主控侧的实现是现成的,成本与风险都被摊薄到最低,用器件内控制器方案反而是自寻烦恼。
4. SPI NAND:器件内控制器
SPI NAND 是三条线里最「通用」的一条:接口最省、成本最可控、生态最通用。它的核心命题是把介质管理搬进器件,让主控只发标准命令。这一章拆开它接管了什么、又留下了什么。
4.1 架构画像:器件承担什么
SPI NAND 器件内部包含四类东西:介质阵列、页内缓存、纠错引擎、介质管理控制器。四者合起来,使器件成为一个「自己会管理」的存储:主控给的是逻辑意义上的页号,器件负责把它落到真正可用的物理位置上。
- 介质管理控制器:维护地址映射表、坏块表与磨损统计,负责逻辑地址到物理地址的转换。
- 纠错引擎:按器件内部定义的冗余位做编码与解码,并统计纠错次数供状态查询。
- 页内缓存:写入先落在器件内的缓存里,主控发出缓存写入命令后数据才真正提交。
- 状态上报机制:主控可以查询器件的健康与统计信息,这是并行 NAND 完全不具备的能力。
| 器件内模块 | 承担的工作 | 对主控的意义 | 对器件的意义 |
|---|---|---|---|
| 介质管理控制器 | 地址映射、坏块表、磨损均衡 | 主控不需要 FTL 与映射持久化 | 控制器面积、功耗与验证成本上升 |
| 纠错引擎 | 冗余位编码解码与纠错统计 | 主控不需要 ECC 引擎 | 纠错强度与冗余位布局必须匹配工艺 |
| 页内缓存 | 写入先缓存,命令触发提交 | 主控要理解缓存写入的语义 | 缓存容量与掉电时的数据状态必须明确 |
| 状态上报 | 健康度、纠错统计、坏块数等 | 主控可以做运行期健康监控 | 需要保留内部统计并在状态命令中组织返回 |
| 参数存储 | 保存器件的工作参数 | 主控要按顺序完成参数配置 | 参数区本身要纳入可靠性设计 |
4.2 标准 SPI 接口与 x1 / x2 / x4 模式
SPI 接口本身是三条线里最省资源的一种:时钟、数据线、状态/就绪信号,加上少量控制信号。SPI 规范定义了多种数据线宽度模式,NAND 器件常用的是 x1 / x2 / x4 三种,数字表示每个时钟周期在总线上并行传送的数据位数。
- x1:每周期一位数据。信号最少、时序最宽松,在信号质量受限或需要长走线时最稳妥。
- x2:每周期两位数据,吞吐提升明显,对信号完整性与时序匹配的要求上升。
- x4:每周期四位数据,吞吐最高,对布线长度、串扰与时钟抖动最敏感。
需要特别注意的一点:模式切换本身是协议动作。从一种模式切到另一种通常需要先退出当前模式、完成状态确认,再进入目标模式。频繁切换模式会带来不可忽略的往返开销,因此工程上通常按「一段传输内固定一种模式」来组织。
| 模式 | 每周期数据位数 | 优势 | 代价与限制 |
|---|---|---|---|
| x1 | 1 位 | 信号最少、时序最宽松、对布线最不敏感 | 吞吐上限最低,长距离走线时的首选 |
| x2 | 2 位 | 吞吐相对 x1 明显提升 | 时序匹配变紧,需要按规格书核对建立保持窗口 |
| x4 | 4 位 | 吞吐最高,适合短距离高质量布线 | 对时钟抖动与串扰最敏感,板上换层与过孔都会影响 |
模式宽度提高的是总线上的传输位数,不是所有环节的速率。命令下发、状态查询、页内缓存的提交这些环节仍有固定开销,在小块、随机、混合负载下,宽度提升带来的实际收益可能远小于理论值。反过来,在连续大页读写时收益最明显。因此模式选择应当按业务负载形态决定,而不是按「能开就开」。具体可达速率以正式 datasheet 与实测为准。
4.3 内置控制器接管了什么、还剩什么
这一节最需要看清。接管与保留的分界线非常清晰:凡是「决定访问哪个物理位置」的工作都被接管,凡是「决定什么时候访问、访问是否算成功」的工作仍保留在主控。
| 工作项 | 并行 NAND 方案 | SPI NAND 方案 | 省下的实质内容 |
|---|---|---|---|
| 地址到物理位置映射 | 主控实现并持久化 | 器件内实现并保存 | 映射格式、持久化与掉电恢复整条工程线 |
| ECC 编解码 | 主控实现 | 器件内引擎实现 | 纠错策略、错误上报链路与重试逻辑 |
| 坏块管理 | 主控维护坏块表 | 器件内维护 | 坏块标记流程、替换策略与迁移逻辑 |
| 磨损均衡 | 主控调度 | 器件内调度 | 擦写调度策略与寿命统计代码 |
| 读缓存 | 主控实现 | 器件内页内缓存 | 缓存替换策略与预取算法 |
| 上电初始化 | 主控完成 | 主控仍需完成 | 这一项不省,主控要按顺序配置器件 |
| 忙状态处理 | 主控轮询 | 主控仍需轮询状态 | 这一项不省,状态语义由主控解释 |
| 写保护状态切换 | 主控实现 | 主控仍需实现 | 这一项不省,且切换时机的判断在主控 |
| 掉电一致性 | 主控设计 | 主控设计 | 这一项完全不省,是三条线共同的责任 |
4.4 页内编程与缓存写入
页内编程是最容易被误解的一项。含义是:主控把一页数据写进页内缓存后,还要显式发出缓存写入命令,这次写入才算真正提交到介质。在提交完成之前,主控发出的读命令读到的仍是缓存内容而非介质内容。
这带来三个必须注意的后果:
- 数据提交有明确时刻:系统认为「已经写完」的时点,必须对齐到缓存写入命令完成,而不是对齐到数据送出。
- 掉电窗口的位置变了:风险窗口不再出现在「数据送出」时,而是出现在「缓存写入命令执行中」时。掉电保护的设计必须围绕这个时点。
- 部分页与部分写是自然支持的:因为缓存是页内的,主控可以只提交页内的一部分字节,这一点在参数与小数据更新场景里非常方便。
把一次写入拆开看,四个环节的责任划分是这样的:写数据时主控把数据填进页内缓存、器件暂存不动介质;提交缓存时主控发出缓存写入命令并等待完成、器件把缓存内容真正编程到介质;读数据时可以先读缓存再读介质,按命令语义返回;状态查询时器件返回忙闲与状态信息,主控据此串行化后续访问。排障时这四个环节各有各的怀疑点——写数据阶段怀疑缓存填充与页内偏移,提交阶段怀疑时序是否被满足与失败是否被上报,读阶段怀疑命令是否发生了不该有的交错,异常中断阶段则必须明确未提交的数据如何处理。
因为缓存是页内的,「读改写一个小区域」这件事在 SPI NAND 上变得非常自然:读出整页到主控缓存、在 RAM 里改几个字节、再把整页写回并提交。这比并行 NAND 里「先读出到缓冲区、改、再整页写回」的流程少了一层搬运。
但要注意代价是每次改写都要写回整页,写放大由器件内部的策略决定,器件通常并不暴露这部分细节。因此频繁小改写的场景仍然要看整体写入量是否在预算内。
4.5 器件暴露的健康与状态信息
这是内置控制器最容易被忽视也最有价值的一项能力:器件知道自己的健康状况,并能通过状态机制报告出来。并行 NAND 完全不具备,因为器件里没有任何统计与判断逻辑。
器件可暴露的信息通常有四类:器件识别信息(型号、容量、器件内固件版本)用于确认实际装的是什么,容量判断与后续升级都依赖它;擦写相关计数用于在运行期估算剩余寿命;纠错统计与坏块状态用于发现介质质量恶化趋势,判断是否已接近失效;以及忙闲状态,主控据此正确地等待与串行化访问。
这四类信息的意义在于:主控可以在运行期判断「这块存储是不是正在变坏」,而不是等到读不出数据才发现。反过来,不做这件事的代价也很明确:装错器件却按预期容量工作、寿命耗尽时才被发现、数据已经出错才发现、坏块突然大面积增加导致业务直接中断,以及命令交错造成的偶发错误。
三件事,成本都很低:① 上电时读一次器件识别信息并与设计预期核对,不匹配就告警;② 周期性地把纠错统计与擦写相关计数读出来做趋势记录,写进日志;③ 给关键数据保留一份可回退的副本,在统计出现异常趋势时主动切换。
这套做法在并行 NAND 上基本做不到——器件不提供任何信息,主控只能靠自己统计自己发出去的命令,而这在掉电或异常后会失真。这正是「谁负责」这件事带来的实际差别之一。
4.6 SPI NAND 的优势与代价
SPI NAND 的优势与代价都很明确:它在成本、引脚、生态三项上最均衡,代价是带宽上限与控制力。
优势有四条:引脚最少(常常单独就决定方案)、生态最通用(SPI 是通用总线,可与其它器件共用控制器与驱动框架)、主控负担适中(不需要 FTL 与 ECC 引擎,但要保留状态处理)、容量档位较全(代价是容量要落在器件提供的档位内)。代价同样四条:带宽有上限(串行宽度与速率共同限制吞吐,负载对延迟不敏感时才无所谓)、器件单价更高(内置控制器占面积,容量不大时影响较小)、控制力下降(无法直接干预器件内部管理,需要特殊调度时是硬伤)、缓存写入语义(写完不等于提交,对掉电模型理解不足时容易埋坑)。
4.7 什么时候选 SPI NAND
SPI NAND 是三条线里适用面最宽的一条。它的判断门槛最低:既不要求主控有富余资源,也不要求应用有特殊的形态假设。
把判断条件归拢成一句话:主控引脚与 SPI 外设资源紧张、容量需求落在数十 MB 到数 GB 量级、业务负载以连续读写为主、希望主控侧尽量少做介质管理、后续可能扩容而不改主控——这五条同时成立时 SPI NAND 是推荐答案。其中第一条常常单独就足以决定方案。
反过来,如果需要主控直接控制介质的物理布局,就不应该选 SPI NAND,因为它提供不了这种控制力,这时应改用并行 NAND。
很多项目把 SPI NAND 当成「没得选时的妥协」,这是误解。在绝大多数嵌入式系统里,SPI NAND 恰恰是成本、生态、容量与主控负担四项综合最优的形态:它的引脚开销最小、生态最通用、主控负担适中、容量档位最全。它之所以常常成为最终答案,不是因为其它方案不好,而是因为它不需要任何额外条件。
只有当你明确知道自己需要更大带宽、或需要主控直接控制介质时,才需要往并行 NAND 那条路上走。