很多初级工程师第一次拆开 SD NAND 的规格书时脑子里都会冒出一个问号SD NAND 的存储介质是 NAND Flash这几乎是板上钉钉的事但为什么要用 NAND而不用 NOR这个问题的答案看起来简单真往深处挖却牵扯到闪存的物理结构、SD 卡标准的历史以及控制器在整个方案里的核心价值。如果你正准备做嵌入式选型或者刚接触存储方案这篇就把这件事从头到尾拆开讲清楚。1. 问题的起点SD NAND 到底是什么先捋清楚基本概念因为不少人的困惑其实源自对 SD NAND 定位的模糊。SD NAND 并不是一个凭空出现的新闪存类型而是把 NAND Flash 裸片、控制器、接口逻辑封装在一起对外直接提供标准 SD 协议接口的存储方案。它的宿主体现在SD这两个字母上而不是NAND这三个字母上——它首先是一张非易失性存储卡只不过通常被贴片封装在 PCB 上而不是插在卡座里。之所以叫SD NAND是因为它本质上遵循 SD 卡的标准电气接口读写命令走 SDIO 或 SPI 模式主控侧看到的是一个标准 SD 设备不需要去处理裸 NAND 的坏块管理、ECC 纠错、擦写均衡这些烦人的底层细节。而这些底层细节恰恰都是围绕 NAND 的特性设计的。所以你要真问为什么是 NAND 不是 NOR最直白的回答是因为整套 SD 协议就是为 NAND 设计的NOR 根本不是 SD 标准的服务对象。1.1 SD 协议是为谁写的你翻看 SD 卡物理层规范会发现它从逻辑地址映射、块擦除模型、页编程模式这些层面上全部是顺着 NAND Flash 的特性来定义的。SD 协议里的block和 NAND 的page天然对应写操作按块对齐擦除操作按更大的区域对齐这跟 NOR 的按字节随机擦写能力完全不是一个套路。一个很容易被忽略的事实是SD 卡在消费电子市场爆发本身就是 NAND 产能和工艺成熟的副产品。NAND 的单位容量成本极低让大容量存储成为可能而 SD 协议恰好是一个低引脚、低成本、可热插拔的标准化接口两者一拍即合。换句话说SD 卡从一开始就是 NAND Flash 的外壳而不是 NAND 反过来去适应 SD 卡。识别到这一点你再看标题里的问题答案的主线就已经浮现了SD NAND 里装 NAND是协议生态、成本结构和物理特性共同决定的必然结果。1.2 很多人把它误当成普通 Flash 芯片初级工程师最容易踩的坑是把 SD NAND 当作一种改进型的 NOR Flash以为它存取更灵活。实际恰好相反。你在电路板上看着它像一颗普通贴片 IC管脚还贼整齐但内部的工作方式完全是卡的逻辑你要发送 CMD 命令维护卡的状态机处理 CRC 校验还要在 SPI 模式下注意时钟极性和片选的时序。它不是一颗能吃透所有时序的存储器芯片而是一个跑着完整存储协议的小型存储系统。这个系统的最底层硬件是 NAND Flash协议层则负责把它包装成易用的 SD 设备。所以讨论为什么是 NAND 不是 NOR其实要先理解 NAND 和 NOR 在硅片层面、在协议层面上的差异有多大。接下来就先把它们各自是什么说透。2. NAND 和 NOR 在硅片层面上的本质差异存储介质选型的根子在半导体物理和电路结构上。NOR 和 NAND 虽然都叫 Flash都能断电保存数据但它们的存储单元连接方式、读取方式、写入方式完全不同这些差异直接决定了它们适合干什么。2.1 存储单元的连接拓扑闪存的核心单元是浮栅晶体管它多了一个被绝缘层包裹的浮栅可以把电荷困在里面。存在电荷就代表0没有电荷就代表1具体逻辑取向可以反着来这不重要。关键是这些晶体管怎么连接到外部电路上决定了芯片的对外行为。NOR Flash 的单元是并联的每个单元的漏极分别连到位线源极统一接地或其他公共端。这种结构下任意一个地址的单元都被独立引出来所以 NOR 可以做到真正的按字节随机读取——给一个地址就能在数十纳秒内拿到该地址上的数据。NOR 的在线性寻址空间里每个字节都有独立地址这个能力跟 SRAM/ROM 的读方式很像这也是代码可以直接在 NOR Flash 里面执行XIPexecute in place的根本前提。NAND Flash 的单元连接方式完全不同。它把大量存储单元串成一串像一串珠子行和列通过字线和位线交叉选通。一个串里的单元是串联的你要读取某个单元的值前提是串联路径上的其他单元都处于导通状态前级电流能一路流到位线感应放大器。这种串联读取带来的结果是你没法随机访问一个字节只能把一串里包含该字节的整串内容通常是一个页常见 4KB/8KB/16KB一次性地读到 SRAM 缓冲里再从缓冲里挑出你要的字节。2.2 干扰的本质读取的灵敏度问题串联结构的优劣是物理决定的。NAND 的串联设计极大地缩小了单元面积工艺可以做得更激进单位面积能塞进数倍于 NOR 的存储单元这成就了 NAND 的低价格、高密度。但代价是读路径上要经过一串晶体管信号衰减、漏电干扰、单元间串扰都会放大所以 NAND 的读取天生比 NOR脏必须靠更强的纠错算法兜底。NOR 因为单元并联、位线直接拉到敏感放大器上信号裕量充足读操作又快又稳可靠性根基很扎实。而 NAND 的可靠性天生薄弱单靠工艺补救不了于是控制器里的 ECC 引擎就成了必需品。这个可靠性差异会在后文的控制器章节细说你在选型时记住一个结论NAND 是便宜但需要伺候NOR 是贵但省心这不是谁优谁劣而是物理结构给了它们各自的修行路径。2.3 写入和擦除的物理代价还有一个被很多人忽略的关键点写入和擦除的机制差异。NOR 的编程写基于热电子注入可以在字节粒度上进行但它想擦除某一位之前必须对整个擦除块通常是 64KB~128KB 的扇区进行整体擦除这意味着改一个字节实际上要做一整块的读-改-写操作慢且复杂。NAND 的编程基于隧穿效应按页编程效率远高于 NOR 的按字节慢写但擦除同样要按更大的块来。换句话说NOR能随机读、能按字节写慢擦除必须按块NAND只能按页读先读到缓冲再取字节、按页写很快擦除必须按更大的块这些差异落实到 SD 卡的场景里很重要的一点是SD 协议压根就不需要按字节直接改 Flash这种能力它面向的是一块块的文件数据天然适合按页按块处理。NOR 的看家本领在 SD 的应用场景里完全排不上用场反而成了价格和容量的累赘。2.4 一张表看清两者的关键差别对比维度NOR FlashNAND Flash存储单元连接并联单元独立引出串联多个单元串成串读取方式按字节随机访问ns 级按页读入缓冲us 级是否支持 XIP支持代码可原地执行不支持代码需拷贝到 RAM写入方式按字节/字写慢按页写快us 级擦除方式按扇区擦寿命约 1万~10万次按块擦寿命约 1000~1万次QLC 更低单位容量密度低容量做不大高TLC/QLC 轻松上 GB 级单位成本贵便宜得多可靠性高误码率低低需要 ECC 纠错典型应用启动代码、固件、参数存储大容量数据存储这张表基本概括了后面所有讨论的物理基础。接下来就能回答一个更具体的问题SD 卡为什么设计成了只能吃 NAND 的样子。3. 为什么 SD 标准押注了 NAND 而不是 NOR有人可能会说那为什么不设计一个基于 NOR 的 SD 卡呢读取快可靠不用管坏块多省事。这个问题问得很合理答案在于SD 卡的核心诉求是大容量、低成本、高写入吞吐这三件事恰好全是 NAND 的强项NOR 一个都满足不了。3.1 容量与成本的决定性因素我们拍脑袋设想如果 SD 卡用 NOR Flash一张 8GB 的卡会是什么价格NOR 尝试做高容量时会遇到严重的面积代价和良率问题因为工艺在微缩到一定程度后NOR 的并联单元之间的干扰会非常难控制良率上不去价格当然下不来。而 NAND 的串联结构天生擅长堆叠工艺微缩的步伐也一直走在前列3D NAND 通过垂直堆叠几百层存储单元把容量做到了数十 GB 乃至 TB 级的规模。SD 市场从一开始走的就是花几十块钱买几十 GB的消费逻辑NOR 根本没法在这种成本曲线上生存。另外你要留意一个重要事实NAND 工艺的更新换代相当快每一代微缩都能显著降低每比特成本。这种强烈的成本下降螺旋让 NAND 成为唯一能满足海量移动存储需求的介质。SD 协议如果绑定 NOR那整个行业就不会有今天人手一张存储卡的局面。3.2 按页读写的模型与文件系统自然对齐另一个没人提但很重要的点NAND 的按页读写模型跟文件系统的数据存储方式天然契合。你把一张照片、一段视频、一份日志存到卡里它们都是以文件形式组织底层拆成一个个块block来读写。文件系统比如 FAT32/exFAT向 SD 卡发送读写请求时本来就是以扇区/簇为单位一个簇往往等于一个或多个 NAND 页。这种大块连续数据读写的场景NAND 的按页编程效率极高写一个页只需要几十到几百微秒。NOR 按字节写入在这种场景下反而是灾难写一个 4KB 的数据要逐字节写进去时间差可以被拉大几百倍。SD 卡的市场主打就是存储大量数据比如照片、视频、文件归档。这一类工作负载是 NAND 的舒适区不是 NOR 的。3.3 写入吞吐和随机写性能的差异再谈写入吞吐。NAND 的顺序写性能远远超过 NOR这几乎是数量级的差异。现代 SD 卡能标称几十 MB/s 的连续写速度常见原因是内部 NAND 是并行阵列可以同时操作多个 Plane/Die。而 NOR 的按字节写机制就决定了它的写入吞吐天花板极低写满一张 64MB 的 NOR 卡理论上都要花以分钟计的时间这种性能给手机当存储卡用体验会非常痛苦。值得一提的是SD 协议还有一个重复写同一块的场景如日志文件、文件系统表这需要控制器做磨损均衡把反复写入的负载分散到不同物理块上。这种均衡策略本来就是为 NAND 的块管理设计的。NOR 虽然寿命长但它的擦写块更大随机小写性能也很差在同样场景下同样捉急。3.4 从卡的诞生背景看这个问题从历史角度说SD 卡是 SD Association 在 1999 年前后推动取代 MMC/CF 卡的标准那个年代恰好是 NAND 成本开始碾压其他介质的时候。SD 标准也参考了 CF 卡的做法——CF 卡从一开始就是基于 NAND 的。所以 SD 卡生来就是 NAND 的载体这条技术路线在二十多年间不断加固到如今已没有回头的可能。你现在打开任何一张 SD 卡打开任何一颗 SD NAND里面 100% 是 NAND Flash不存在例外不是因为没有 NOR SD 卡的量产能力而是因为用 NOR 做 SD 卡违背了从诞生到现在的核心经济逻辑。4. SD 控制器把 NAND 的短板补成了优点前面说的都是为什么选 NAND但初级工程师真正容易困惑的地方在于NAND 本身的缺点如此明显坏块、位翻转、寿命有限SD 卡为什么看上去还是那么省心插到读卡器里就能用一直写也不会突然坏掉。这里面真正的功臣是 SD 控制器回答完NAND vs NOR的问题必须接着讲控制器否则就像只讲了 cpu 不讲主板。4.1 控制器的存在让 SD 卡的复杂变成了对外简单裸 NAND 是非常难用的它自己不知道哪个块已经坏了读写时会有随机位翻转bit flip连续擦写会让部分块寿命耗尽你直接操作它每个环节都要自己做错误检测、坏块表管理、垃圾回收、磨损均衡。如果让用户或主控去直接面对这些开发量和工作量都非常大。SD 控制器最大的功劳就是把这一堆麻烦全包了。它对外假装自己是一块可靠的、按逻辑块读写的小磁盘内部却在疯狂维护映射表——逻辑块地址 LBA 到物理块地址 PBA 的动态映射定期搬运数据做垃圾回收动态和静态磨损均衡。你在主控侧发写 LBA 100完全不用知道这个 LBA 此刻其实落在第 8 个 die 的第 1200 个物理块上更不用关心它下个瞬间会不会被搬走。4.2 ECC 纠错NAND 的细菌疫苗NAND 的位翻转是它的基因缺陷。随着工艺微缩和 TLC/QLC 普及误码率显著上升。SD 控制器内部必然有一个硬件 ECC 引擎常见的从 BCH 到 LDPC 发展。具体来说每页数据典型 4KB 冗余区会附带校验信息控制器在读数据时计算校验并纠正一定量的错误比特老一些 / 可靠性要求高的卡用 BCH能纠正若干 6~8bit 到几十 bit 错误按纠错能力参数划分现代高容量卡用 LDPC纠错能力更强并且与 3D NAND 的高密度误差模型更适配ECC 的能力会直接影响卡的实际可用寿命。同一个 NAND 颗粒如果控制器纠错能力弱它可能在其他位翻转累积出错前就已经宣布退役如果控制器纠错能力强这块 NAND 还能再战几百个 P/E 循环。这也是同为 NAND不同卡的寿命差距很大的主要原因之一。4.3 坏块管理与磨损均衡延长生命的技巧NAND 从出厂就可能有坏块初始坏块用着用着还会出现新坏块运行中坏块。控制器必须维护一份坏块表BBT把这些块标记出来不再使用。这个逻辑看起来简单实际操作却很考验经验什么时候判定一块是坏块擦除超时编程失败读出校验失败判早了浪费容量判晚了数据又可能丢失。好的控制器会做渐进式判定比如连续多次擦除失败才标记为坏块避免瞬时干扰导致误判。磨损均衡方面SD 控制器分为动态磨损均衡与静态磨损均衡。动态均衡只针对频繁更新的活动数据块静态均衡则会把长期不动、很少更新的冷数据也迁走把磨损压力分散到整个卡的全部物理块上。如果没有静态均衡长时间只改动少数热点区域比如数据库文件、日志区那些区域会极快达到寿命极限而卡的其他区域还近乎全新。这也是很多卡正常用很久一跑某个固定工作负载就迅速报废的隐含原因。4.4 为什么不能把裸 NAND 直接接到 MCU还有很多初级工程师在项目里试过直接用 MCU 操作裸 NAND然后在某次断电之后发现整片数据全乱从此不再碰裸 NAND。这正好印证了控制器存在的必要性。裸 NAND 有一个在 SD 卡场景中不常被感知的问题写入过程中一旦断电可能出现部分页写入partial program错误数据处于半写状态后续所有的读取、擦除、重写都可能出现异常。SD 控制器通过写日志、原子操作、掉电保护策略和冗余设计来规避这些问题。对使用者来说插上就用、随便断电的体验不是 NAND 的功劳而是控制器扛下了所有。讲到这里可能有人会反过来想既然 NAND 控制器这么强那 NOR 是不是完全没用了还真不是特定场合里 NOR 依然不可替代。5. NOR 并没有被淘汰启动代码与关键数据的正确归属我前面讲了一大堆 NAND 的绝对优势但现实中几乎每颗微控制器、每块嵌入式主板上依然能看到一颗 NOR Flash 的身影。原因很简单启动代码和关键数据天然属于 NOR 的领地。5.1 启动场景为什么离不开 NORMCU 上电后的第一条指令需要从复位向量指定的地址去取。这个地址可以指向内部 ROM、内部 Flash也可以指向外部 SPI NOR Flash。很多方案会从 SPI NOR 启动因为芯片内部 Flash 容量不够大、或者出于固件可更新的考虑把代码放在外部。NOR 支持 XIP代码就地执行CPU 可以直接在 NOR 的线性地址总线上取指令不需要先把代码拷到 RAM这意味着启动时间短、逻辑简单、还省 RAM 空间。如果换成 NAND就没法这样操作。NAND 的读路径复杂、没有线性寻址能力代码必须先由一个早期启动代码通常是固化在内部 ROM 里的一小段 loader把主固件从 NAND 读出来、搬到 RAM、再跳转执行。这个流程没错很多 Linux 设备从 NAND 启动的旧方案就是这么干的但它的实现复杂度、启动时序、以及如果没有一份完好引导代码就无法从 NAND 启动的死结让它的鲁棒性远不如 NOR。所以对 MCU 级设备来说NOR 几乎成了启动方案的默认标配。5.2 关键参数与固件升级的可靠性工程实践里还会把关键参数、MAC 地址、校准数据、量产信息放在一颗独立的小容量 NOR 上或者用 MCU 内部 Flash / OTP 来保存。为什么不用 SD NAND原因是这部分数据对可靠性要求极高随机写入频繁比如不停记录累计寿命、系统状态要求极低的坏块概率和很强的抗位翻转能力。NOR 虽然容量小、贵但它单字节可随机写、读可靠在偶尔改写一个字节、但数据必须 100% 正确的场景下是最让人放心的选择。因为模拟项目里经常要做固件在线升级我踩过坑之后有个习惯小固件放 NOR大固件过 1MB 的考虑用双备份 NAND 方案。小固件几十 KBNOR 直接跑 XIP不需要很复杂的块管理大固件几百 MBNOR 装不下也装不起就只能依靠控制器成熟的 NAND 方案做双备份升级每次升级记录版本上下文bootloader 启动时检查两份固件校验和失败则回滚。5.3 NOR 与 NAND 在嵌入式里的并存所以嵌入式系统里的经典分工是角色合适介质原因一级启动BootROM / BootloaderNOR或内部 Flash支持 XIP上电即执行主固件 / 根文件系统NAND或 SD NAND / eMMC容量大成本低写性能高配置参数 / 日志低频小写小容量 NOR / EEPROM按字节写方便可靠大容量用户数据照片、视频、数据采集SD NAND / eMMC / SD 卡容量大有控制器兜底这两个介质不是互相取代而是各有明确的生存空间。你只能问这个场景适合 NOR 还是 NAND不能问NOR 是不是被淘汰了。5.4 有控制器就万能的错误理解最后再提醒一点很多同学以为 SD 卡里有控制器NAND 的缺点就被完全消除了可以无脑替代 NOR。这个理解不完全对。控制器能做的是大幅降低 NAND 不可靠性带来的影响但不能变成 NOR。SD 卡 / SD NAND 的随机读延迟远高于 NOR且对极低功耗下的随时唤醒、按字节改写某个配置项、单次写入极小数据量且要求极强一致性这些场景适应能力并不好。你可以在 SD 卡里存数据库文件但你不应该把它当作 NOR 的替代品去优化一个高频率小量改写的工作流程比如频繁更新几个状态字节的掉电存储区。在那里还是老老实实给 EEPROM 或 FRAM 留个位置。6. 选型判断与几点补充认识讲了这么多原理落到实际工作里初级工程师在做存储选型时常犯的判断错误有几种这里一并说说给你一个可以直接套用的思考框架。6.1 容量是第一需求时答案基本就是 NAND 阵营如果你在做一个物联网关、音频记录仪、图像采集终端需求是保存大量数据比如几十 MB 到几十 GB 的日志、照片、音频文件那不用犹豫SD NAND 或 eMMC 这类 NAND 方案几乎是唯一的正解。你在这个场景里不可能用 NOR哪怕它可靠性再高、读得再快装不下就是原罪。这时你要关心的就不是 NAND 还是 NOR 的问题了而是控制器方案的版本选 A 级大厂还是白牌选消费级还是工业级温度范围最大写寿命指标是多少掉电保护策略如何排序逻辑是从介质类型NAND 已定转向控制器成熟度。6.2 启动与可靠性优先时NOR 的位置依然稳固如果你的产品核心诉求是上电必须最快最稳地跑起来、主控不支持 SD 启动、固件关键数据不容闪失那 NOR或小容量 eMMC 外加 boot 分区才是空地。不要让容量焦虑驱使你做一个复杂、脆弱的多级启动流程。嵌入式里最怕的就是为了省一颗 NOR 的成本把系统启动的可靠性搭进去最后花更多时间在 bootloader 的 bug 上。我的经验是哪怕选了一颗 64MB 的 SD NAND 做主存储也建议在主控旁边留一颗 8MB/16MB SPI NOR 放第一级引导和备份固件头部成本增加不多但系统的抗故障能力会显著提升。6.3 警惕容量越大越好的诱惑NAND 容量的增长伴随着单元层数的增加和每个单元位数的增长SLC - MLC - TLC - QLC单比特可靠性是逐渐下降的。入门工程喜欢选大容量卡但如果你要的是长期稳定跑工业日志、每天数百次掉电那采用更小容量但更高可靠性的方案比如 SLC NAND 或工业级 pSLC 模式可能比硬上超大容量 TLC 更合适。SD 卡的标称容量和它的实际写寿命之间没有必然关系只有 PE Cycle 总数和容量之积才是理论上限。大容量意味着磨损更分散、寿命更长但 QLC 颗粒本身的 PE Cycle 极低两者互相抵消最终寿命可能是相同的量级。6.4 关注控制器的固件本身最后说一个 SD NAND 选型时最容易被忽略的点控制器的固件。同样的 NAND 颗粒配不同的控制器固件可靠性和性能天差地别。好固件的表现是坏块管理激进但合理掉电处理有日志有校验磨损均衡能做到真正的全局均衡固件升级恢复机制完善。这些指标在公开规格书里不一定写得清楚所以采购时还是优先用过的主流方案踩坑概率会小很多。选型路径给你总结成一句话大容量数据找 NAND 方案代码启动和关键小数据找 NOR两者各司其职在系统里和平共存不需要强行互相替代。7. 我在实际项目中踩过的坑和最后的建议很有必要再补充一段实战体感。真实项目中我见过不止一次为了把 NOR 换成 SD NAND而改坏架构的事。最初的理由都差不多便宜容量大。但换完之后发现上电启动慢了几百毫秒、bootloader 升级流程复杂了、掉电后偶发配置丢失最后不得不加回 NOR。这并不是说 SD NAND 不行而是它被放在了错误的位置上。相反我也有一个项目把原来的裸 NAND 自研 FTL 方案整个打掉换成带控制器的 SD NAND 之后代码量骤减稳定性显著提升。理由很简单自研 FTL 需要自己处理 ECC、坏块、垃圾回收这些东西做到可用容易做到可靠太难有成熟控制器就不用重复造轮子。所以如果你现在正在纠结这个问题我的建议是先明确数据是什么形态大块文件数据走 NAND 阵营代码执行和小型关键存储走 NOR 阵营再确认掉电和寿命要求关键进程频繁掉电、几十万次擦写预期认真评估控制器方案和介质工艺最后看系统复杂度能用成熟 SD NAND 解决就不要再搞复杂的自研 FTL 逻辑需要快速启动和绝对可靠就别为了省成本砍掉 NOR。回到标题的问题SD NAND 里装的为什么是 NAND因为它要低成本、高容量、高写入吞吐还要符合整个 SD 协议生态的逻辑这些都是 NAND 的地盘NOR 的随机读和按字节写在 SD 卡的场景里没有用武之地反而成本高得无法接受。如果哪天有人真出一颗NOR 介质的 SD 卡它大概率活不过市场检验。而 NOR 饱满地活在自己的领地里负责每一块嵌入式板卡的安心上电。这两兄弟各有天命搞清楚原理你就不容易在选型时搞错方向了。