资讯动态

为什么SD NAND用NAND而不用NOR?从闪存原理到选型实践

发布时间:2026/10/14 16:40:36 来源:尧图企业网站定制
做嵌入式存储这几年被初级工程师问得最多的一个入门问题不是怎么选型号、不是怎么做测试而是一个看起来特别基础的问题“SD NAND 里装的为什么是 NAND不是 NOR”问的人多了我发现这事儿真不是一两句话能说清的。它牵扯到闪存存储单元的物理结构、接口协议的分层、控制器的职责边界、成本逻辑还有整个系统架构层面的取舍。一句话说“因为 NAND 便宜”是能应付面试但应付不了实际选型因为你很快会遇到一连串追问为什么 NOR 做不了大容量为什么 NAND 要控制器而 NOR 不用为什么 MCU 片内 Flash 又偏偏是 NOR把这几个问题串起来想明白比背十遍 datasheet 都有用。先亮结论免得你绕晕SD NAND 之所以叫 NAND、里面也确实装的是 NAND 闪存不是因为命名巧合而是因为它的产品定位是“大容量数据存储”这个场景在物理结构、成本模型、协议适配三个层面都只有 NAND 能接得住NOR 从根上就干不了这活。下面我把这个结论一步一步拆开讲尽量用大白话但该有的深度一点不少。1. SD NAND 是个什么东西先把它看明白SD NAND 的中文叫法挺乱有人叫“贴片式 SD 卡”有人叫“SD 接口闪存”还有人把它和 eMMC 混为一谈。我习惯这样定义SD NAND 是把一颗 NAND 闪存 Die、一颗内部控制器以及必要的接口逻辑封装在同一个芯片封装里对外暴露的是标准的 SD/MMC 接口协议焊在电路板上用而不是插在卡槽里用。也就是说从主控芯片SoC 或 MCU的角度看它和一个卡槽里插着 TF 卡几乎没什么区别——走 SD 总线发 SD 命令CMD0、CMD8、ACMD41 这些用过 SD 卡驱动的人都不会陌生读 CID/CSD 寄存器按 512 字节扇区做逻辑块读写文件系统照常挂载。但从物理形态看它是一颗可以直接贴装的 IC常见是 LGA-8 这类小封装面积能做到比 TF 卡还小不需要卡座、不需要外壳、不担心插拔接触不良。这么做的好处非常直接产品端省掉卡座和结构件降低装配成本也解决了 SD 卡在震动、潮湿、粉尘环境下的接触可靠性问题。过程中你的软件栈却一点不用改只要主控自带 SD 主机控制器代码直接按 SD 卡那套流程走就行。我在工业采集终端、医疗仪器、电力监测设备这类项目里见过大量这种方案主要图的就是“代码零改动 硬件可靠性高”这两个优势。这里有一个关键点你必须盯住SD NAND 的“SD”说的是接口协议而“NAND”说的是存储介质本身。接口和介质是两码事。SD 接口理论上可以包着 NAND也可以包着别的介质只是现实中厂商几乎都给你塞 NAND。这自然就引出了今天的核心问题为什么偏偏是 NAND而不是 NOR要回答它得从闪存单元的最底层聊起。2. NAND 和 NOR 的底层差距从一颗存储单元说起要弄清“为什么是 NAND”你先得看懂两种闪存在物理层上的根本差异。这个差异不是谁工艺更先进而是从设计之初就走向了两条完全不同的路。这两个方向的起点都是浮栅晶体管但后续的工程化路线彻底分道扬镳。2.1 编程和擦除机制的根本不同不管 NAND 还是 NOR基础存储单元都是浮栅晶体管靠往浮栅里注入电子、或者把电子抽走来改变阈值电压 Vth进而表示 0 和 1。更直白地说注入电子就是编程写抽取电子就是擦除。听起来一样但实现“写入”的手段差别很大。经典 NOR 闪存编程用的是沟道热电子注入想往哪个单元写就给这个单元所在的位线、字线加合适的偏压让高能电子越过氧化层进到浮栅里。这种方式定向准确、可以按字节操作但电流大、功耗高而且每个单元要单独选通写起来像“定点打击”——精准但是费劲速度也上不去。经典 NAND 闪存编程走的是 Fowler-Nordheim 隧穿给选中的字线加一个高电压让整个沟道里的电子以隧穿方式均匀穿过氧化层进入浮栅。这种方式电流极小、功耗低一次可以对一整页里的海量单元同时编程写起来像“地毯式轰炸”——单点精度不如 NOR但效率高得多特别适合大块数据写入。擦除两者都走隧穿但 NAND 擦除的最小单位是块一擦就是整块几百 KB 甚至上 MB 一起清空。这种“页写、块擦”的粗粒度操作方式是 NAND 介质特性里最重要的一个。2.2 单元连接拓扑决定了两者的命运浮栅单元本身只是原理真正决定 NAND 和 NOR 命运的是单元的连接方式。NOR 闪存里每个存储单元的源极都接地漏极通过位线直接连到读出放大器所以任意一个字节、任意一个地址都可以被随机访问。读的时候给地址对应位线直接被选中数据马上出来延迟可以做到几十纳秒级别。这种结构特别适合执行代码但代价是每个单元都需要独立的接触孔和位线连接密度做不上去Die 面积大单位比特成本高到离谱。NAND 闪存完全相反存储单元像串糖葫芦一样一串由 32 个、64 个、现在甚至 100 多个单元串联起来整串只有两端分别接位线和源线中间每个单元基本不单独拉线。想读某个单元得先把整串选通再通过沟道信号传递来判断目标单元的阈值状态。所以 NAND 读不能按字节随便抓必须按页读时序比 NOR 复杂单次随机读延迟也要高出几个数量级。这个拓扑差异直接决定了一个数字同工艺节点下NAND 的存储密度能做到 NOR 的十倍甚至几十倍。NAND 的一个 Die 现在动辄是 512Gbit、1Tbit 级别而 NOR 的主流容量还在 Mbit 到小 Gbit 徘徊。介质密度的差距是后面所有故事的地基。下面的表可以帮你快速建立直觉对比维度NOR FlashNAND Flash单元连接并行每单元独立接位线串联成串共享位线读取方式随机字节读延迟极低按页读时序复杂写入方式按字节/字编程功耗高按页编程功耗低擦除方式块擦除块较小块擦除块很大存储密度低单位比特面积大高单位比特面积小单位成本高低相差一个数量级坏块管理基本不需要需要控制器管理典型场景代码直接执行大容量数据存储提示不少初级工程师把“NAND 读写慢、NOR 读写快”当结论背这个说法太粗糙。准确讲NAND 的顺序写能力强、随机读延迟高NOR 的随机读延迟极低但写慢且功耗大。它俩的应用位置完全不同单纯说快慢没有意义。3. 为什么 SD NAND 用 NAND成本、容量、控制器三座大山现在回到正题。SD NAND 的设计目标是什么是给嵌入式系统提供一个“容量够大、接口通用、可靠性可控”的数据存储介质用来装文件系统、固件升级包、日志、参数记录甚至跑小型数据库。这个目标一摆出来NOR 基本就出局了。3.1 容量和成本模型是硬门槛同样一颗芯片面积NAND 能装进去的容量大概是 NOR 的四到十六倍以上单价算到每比特上NAND 通常比 NOR 便宜一个数量级。假设你的产品需要 4Gbit 的存储空间用 NOR 去做最终芯片面积会大到离谱价格更是产品经理看一眼就想砍人的程度。而 SD NAND 这种形态目标就是给“原来插 TF 卡”的产品做替代TF 卡用户习惯的是 8GB、16GB 起步的容量观感里面自然只能装 NAND。有人会说那我可以用多颗 NOR 拼容量。行但两片甚至四片 NOR 叠起来面积、成本、布线复杂度全上去了还要面对并行扩展带来的 IO 占用问题。稍微做点乘法你就明白NOR 在数据存储容量需求面前根本不具备工程可行性。这不是性能调优能解决的问题是物理和经济学层面的死路。3.2 NAND 的“难用”由控制器兜底肯定有初级工程师要追问NAND 不是有坏块吗不是要 ECC 纠错吗不是要磨损均衡吗这些“毛病”在裸 NAND 场景下确实是痛点但 SD NAND 内部自带控制器这一整套麻烦事全被控制器消化了。控制器内部做的事你可以把它理解成一个微型存储管理引擎。主机要写一个扇区控制器把它换算成对应的物理页再执行写操作底层发现某块擦写次数接近阈值就悄悄做磨损均衡把数据搬走并重新标记读出来发现位错误控制器用 BCH 或 LDPC 纠错算法补救实在纠不动就做坏块替换顺手还要维护逻辑地址到物理地址的映射表断电时保证映射表的一致性。SLC 的擦写寿命能做到十万次左右MLC 在一万次上下没有这些管理手段NAND 根本经不起长时间使用。也就是说NAND 的所有“坏脾气”都被 SD NAND 的控制器在内部包住了。主机侧看到的是一个标准 SD 卡不用管 ECC 算法、不用建坏块表、不用做静态磨损均衡SD NAND 产品形态存在的全部意义就是把这层复杂度封装起来对外露出简单可靠的标准接口。相比之下NOR 闪存几乎没有坏块概念也几乎不需要纠错但那是靠牺牲密度和成本换来的“省心”。当容量需求上升到一定程度这点省心根本抵不过成本差距。你想想谁会为了省掉控制器去花十倍单价买一片容量还不够的 NOR3.3 SD 协议天然适配 NAND 的扇区模型再往上一层看SD 协议本身就是按“扇区”模型工作的主机以 512 字节为单位下发读写命令而 NAND 的存储模型是按页编程、按块擦除。协议层的扇区与介质层的页之间恰好需要一个中间层来做 512 字节到 4KB/8KB/16KB 页的映射这个中间层就是控制器。所以你看SD NAND 的结构其实是“协议层 控制器软件层 NAND 介质层”的三层咬合这三层在存储行业里本来就是配套成熟的组合。反而是 NOR 那种字节随机访问的特性天然服务的是“挂到 CPU 地址总线、直接取指执行”的架构和 SD 这种命令-响应的接口协议根本不对路。硬拿 NOR 去做 SD NAND 的介质接口带宽、时序、命令语义全都得推翻重新设计没有任何合理性可言。4. NOR 是不是就被淘汰了它真正的战场在哪说到这里别急着给 NOR 判死刑。NOR 闪存到今天仍然活得好好的它有自己不可替代的场景只是那个场景不是 SD NAND 的活。4.1 XIP就地执行才是 NOR 的核心护城河NOR 挂在 CPU 的地址和数据总线上CPU 可以像访问普通内存一样随机读取任意字节做到 XIP也就是就地执行。片上代码直接从 NOR 里取指执行不用先搬到 RAM启动零延迟。这就是为什么几乎所有 MCU 的片内 Flash 都是 NOR 工艺外部扩展代码用的 SPI NOR Flash 也是这个思路。NAND 做不到 XIP。你没法让 CPU 像读内存一样随机取指因为 NAND 必须一页一页地读还要等待内部复杂时序CPU 取一条指令要等几百微秒甚至毫秒级这日子没法过。所以用 NAND 存代码标准方案是先由一段很小的引导程序通常放在 NOR 或者 ROM 里把镜像拷贝到 RAM再从 RAM 执行。引导时间的差距在冷启动要求苛刻的产品里是能感受到的。4.2 NOR 的生存场景速览NOR 在小容量、高可靠性、快速随机读、直接执行这几个维度上依然稳坐钓鱼台。比如 MCU 片内存储、独立小容量 SPI NOR 引导芯片、工控里的配置参数保存、安全固件的校验码存储等。这些需求容量都在 1Mbit 到 256Mbit 量级NOR 价格能接受读延迟几乎可以忽略XIP 更是不可替代的特性。反过来看如果你的应用只需要存 2MB 固件、而且代码希望直接从外部 Flash 执行选 SPI NOR 仍然是对的。但如果要存几百 MB 的媒体文件、数据库日志、离线地图那不好意思NOR 连候选名单都上不了SD NAND、eMMC 甚至 UFS 才是该考虑的方向。选型的关键从来不是“哪个技术更高级”而是“你的数据形态和访问模式适合哪个”。4.3 SD NAND 到底能不能用于引导经常有人问SD NAND 能不能放 bootloader、能不能引导系统答案是可以“放”但不能“直接执行”。你可以在 SD NAND 里存一份 bootloader 镜像由片内 ROM 或 NOR 里的引导代码通过 SD 协议把它读出来加载到 RAM 里再跳转执行。不过系统启动早期SD 主机控制器可能还没来得及初始化SD NAND 的上电初始化时序又长所以绝大多数方案里启动引导仍然依赖 SPI NOR 或片内 FlashSD NAND 负责装大块数据。这也是嵌入式系统里常见的一种“NOR 管启动、NAND 管存储”的分工格局。两种介质是搭档不是敌人把对立关系扔掉你的方案思路会开阔很多。5. 给初级工程师的避坑指南和选型心得最后这部分算是我这两年带人总结出来的琐碎经验。SD NAND 和 NOR 的选型坑比想象中多而且很多坑是 datasheet 上不会写的全得靠实际项目踩出来。5.1 三个高频误解先给纠过来第一个误解“SD NAND 就是 SD 卡芯片化容量随便挑。”现实是 SD NAND 目前主流容量集中在 1Gbit 到 8Gbit大容量的 SD NAND 也有但成本曲线不划算需要更大容量时更多人直接上 eMMC。所以选型前先精确计算容量需求别想当然拿 TF 卡的容量预期来套。第二个误解“NOR 那么贵肯定是因为性能全面更好。”NOR 贵不是因为性能全面更强而是因为单元结构不适合高密度集成单位比特面积大、工艺成本摊不下来。它的优势只在随机读延迟和 XIP 这两点上写入性能、功耗、密度、单位成本全都不如 NAND认知要一条条掰开别拿一个“更好”概括。第三个误解“NAND 需要 ECC说明它不可靠不能用在重要产品里。”这个说法太武断。NAND 的位翻转是物理常态但有了控制器里的 ECC 和坏块管理SD NAND 对外表现出来的可靠性完全不输 NOR。任何存储产品都有寿命工程上要做的是设计好寿命余量和掉电保护策略而不是笼统地给 NAND 扣一个“不可靠”的帽子。5.2 实际选型时的决策顺序我一般给团队定的选型决策顺序是这样的你可以直接拿去当检查清单用。先把数据量定下来小于 32MB 且以代码为主优先 SPI NOR大于 128MB 且以数据和文件为主优先 SD NAND 或 eMMC中间地带按读写频率和接口兼容性决定。再把启动流程定下来主控能不能 XIP能不能接受 SD 主机控制器的初始化时序启动代码必须放在哪颗芯片上这些直接决定 NOR 是不是刚需。再把接口资源定下来主控有没有原生 SD 主机控制器板上有没有空闲的 SPI 接口SD NAND 走 SDIO 至少需要 4 根数据线加时钟和命令SPI NOR 只需要 4 根线IO 资源紧张时 SPI NOR 反而占优。最后看环境可靠性和寿命预期高温、高湿、强振动场景优先选 SD NAND 这类带封装、无插拔的设计频繁小文件写入要考虑磨损均衡能力系统经常掉电的场景要挑带掉电保护或者映射表管理策略成熟的型号。这四步走完答案基本就出来了。5.3 我踩过的两个实际坑第一个坑是 SD NAND 的初始化时序。早期做某个采集终端时我把 SD NAND 当成一颗简单的 SPI Flash 来想以为上电就能读结果主控在开机后几毫秒内就尝试发 SD 命令SD NAND 还在内部初始化直接超时。后来在引导代码里加了几百毫秒的延时等待等它电源和时钟稳定后再初始化总线就再没出过问题。记住SD NAND 是一颗有“开机过程”的芯片不是上电立即可读的简单存储所有把 SD NAND 当 SPI Flash 用的习惯都得先纠正。第二个坑是扇区写放大。有一回做日志记录功能程序每 10 秒写一个 512 字节的日志记录跑了一段时间后发现擦写寿命消耗得比预期快得多。后来查明了原因日志量小、但写入频率高控制器内部磨损均衡虽然在正常工作但频繁的映射表更新和块回收放大了实际擦写量。整改方案是把日志攒到缓冲区按页对齐批量写入再配合几次批量落盘寿命使用率一下降了下来。初级工程师要记住存储产品的实际寿命不只是介质本身写次数更是你的写入模式与控制器内部策略的匹配度。5.4 最后交代一句真实体会回到最初那个问题我现在通常这样回答SD NAND 用 NAND不是成本低这么一句话能概括的它是存储介质物理特性、接口协议分层、控制器能力三个层面共同作用下的必然结果。每次做选型别把“NAND 还是 NOR”当成配置清单上的一个选项随手勾掉先问清楚自己要存什么数据、系统怎么读写、启动代码从哪里跑答案会自己浮出来。把这个思考习惯养成你以后看存储类的方案就不会再被各种缩写名词绕晕了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑