SD NAND 电路设计指南
SPI / SDIO 双模式 · 1-bit / 4-bit 总线 · 高速 / 低速 / 低功耗 / 动态可调 · VCC 负载开关断电控制 | 编制日期 2026-09-21 | 版本号 Rev 1.0
本指南面向使用贴片式 SD NAND(LGA / BGA 封装,内置 NAND Flash + SD 控制器)作为板载存储的硬件与固件设计,覆盖原理图、器件选型、电源与低功耗、PCB Layout、初始化流程、可靠性与量产排查。常见供应商:米客方德 MKST、芯天下 XTSD、江波龙 Longsys、得一微、Zetta、SkyHigh 等,容量覆盖 128 MB ~ 64 GB。
不同厂商、不同容量的 SD NAND 在支持的最高速率档位、初始化时序要求、峰值电流上存在差异。本文给出的是符合 SD Physical Layer Specification 的通用设计基线,落地前必须以实际器件 datasheet 为准二次核对,尤其是第 3 章的上下电时序与第 2 章的最高速率。
核心结论速览
- SPI 模式:接线最少(4 根信号线),速率低(通常 ≤25 MHz),适合小容量、低速、MCU 无 SDIO 外设的场景。
- SDIO 4-bit 模式:速率最高(Default Speed 12.5 MB/s、High Speed 25 MB/s 理论值),适合需要较高吞吐或跑文件系统的场景。
- 速率可调:400 kHz 初始化 → Default Speed 25 MHz → CMD6 切 High Speed 50 MHz,是标准且推荐的动态调节路径。
- 低功耗:SD NAND 没有 eMMC 那样的 SLEEP / AWAKE 指令,停时钟后的 Standby 电流仍在 100 µA 量级。要做到 µA 级待机,唯一可靠办法是用主控 GPIO 控制负载开关切断 VCC,并严格遵循"先收 IO、再断电"的顺序。
同系列文档
| 文档 | 器件类型 | 关注重点 |
|---|---|---|
| SPI NOR 电路设计指南 | 串行 NOR Flash | Quad/QPI 提速、dummy cycles、XIP、DPD 低功耗 |
| SPI NAND 电路设计指南 | 串行 NAND Flash | 页/块管理、片内 ECC、坏块表、主机 FTL |
| 并行NAND (PPI NAND) 电路设计指南 | 8/16 位并行 NAND | 宽总线时序、ECC 引擎、40+ 引脚 Layout |
| eMMC 电路设计指南 | eMMC 5.0/5.1 | HS200/HS400、1.8 V VCCQ、DS 选通与等长 |
| SD NAND 电路设计指南 本文 | 贴片式 SD NAND | SPI/SDIO 双模式、无休眠指令、VCC 负载开关断电 |
| NAND MCP 电路设计指南 | 多芯片合封存储 | 多 die 与多 CE、双电源轨、HDI 扇出 |
| 并行NOR (PPI NOR) 电路设计指南 | 并行 NOR Flash | 异步读时序、XIP、等待周期、总线扩展 |
| PSRAM 电路设计指南 | 伪静态 RAM | OPI/HyperBus、刷新与延迟周期、XIP 与帧缓存 |
| DDR2 电路设计指南 | DDR2 SDRAM | SSTL_18、T 分支拓扑、VTT 端接、ODT |
| DDR3 电路设计指南 | DDR3 / DDR3L | Fly-by 拓扑、write leveling、动态 ODT |
| DDR4 电路设计指南 | DDR4 SDRAM | POD12、bank group、DBI、2D 训练 |
| DDR5 电路设计指南 | DDR5 SDRAM | 双子通道、On-DIMM PMIC、DFE、同帧 ECC |
| EEPROM 电路设计指南 | EEPROM | I²C/SPI 接口、上拉电阻与总线电容、页写与写保护 |
1 · 器件基础
1.1 定位与选型对比
SD NAND 可以理解为"把 SD 卡的控制芯片和 NAND 裸片封装进一个贴片 LGA / BGA 里",对外呈现标准的 SD 协议接口(SDIO 或 SPI),内部完成坏块管理、ECC、磨损均衡、垃圾回收。对主控而言,它和一张焊死在板上的 microSD 卡没有区别。
| 对比项 | SD NAND | microSD(TF 卡) | eMMC | Raw NAND |
|---|---|---|---|---|
| 封装 | LGA-8 / BGA-9,6×8 mm 或 8×8 mm | 卡座 + 可插拔卡 | BGA-153/169,11.5×13 mm | TSOP / BGA |
| 接口 | SDIO 1/4-bit 或 SPI | SDIO 1/4-bit 或 SPI | eMMC 1/4/8-bit HS400 | ONFI / Toggle |
| 最高理论速率 | 25 MB/s(HS 4-bit) | 50~104 MB/s(UHS-I) | 400 MB/s(HS400) | 取决于主控 |
| 主控要求 | SDIO 或 SPI 外设即可 | 同上 | 需专用 eMMC 控制器 | 需 NAND 控制器 + FTL |
| 是否需卡座 | 不需要,直接贴片 | 需要(接触可靠性风险) | 不需要 | 不需要 |
| 抗振动 | 优 | 差(易松脱) | 优 | 优 |
| 成本 / 容量 | 中小容量性价比高 | 最低(但卡座有成本) | 大容量更划算 | 最低,但开发量大 |
| 典型应用 | 穿戴、IoT、工控、小家电、语音模组 | 消费类可换卡设备 | 手机、平板、盒子 | 大批量成本敏感产品 |
卡座是机电件,在振动、高低温、盐雾环境下是典型的失效点(接触电阻变大、弹片疲劳、氧化)。SD NAND 贴片后与 PCB 成为一体,抗震性与一致性显著提升,且省掉卡座成本与结构空间。代价是不可更换、容量在贴片时就固定。
1.2 封装与引脚定义
市面上最常见的是 LGA-8(8 引脚,6×8 mm 或 8×8 mm)封装,引脚定义对应 SD 总线的完整信号子集:
| 引脚 | SDIO 模式 | SPI 模式 | 方向(SDIO) | 说明 |
|---|---|---|---|---|
| 1 | DAT2 | 未使用(NC / 上拉) | I/O | 4-bit 数据线 bit2;1-bit 与 SPI 下不用 |
| 2 | DAT3 | CS(片选) | I/O | 4-bit 数据线 bit3;SPI 下作片选,低有效 |
| 3 | CMD | DI(MOSI) | I/O(双向,开漏 + 推挽) | 命令与响应线;SPI 下为主发从收 |
| 4 | VDD(VCC) | VDD(VCC) | 电源 | 2.7 ~ 3.6 V,典型 3.3 V |
| 5 | CLK | SCK | I | 时钟,主控输出 |
| 6 | VSS(GND) | VSS(GND) | 地 | — |
| 7 | DAT0 | DO(MISO) | I/O | 数据线 bit0;SPI 下为从发主收,同时承载 busy 指示 |
| 8 | DAT1 | 未使用 / IRQ / busy | I/O | 4-bit 数据线 bit1;部分型号在 SPI 下复用为中断或 busy 输出 |
上图是主流 LGA-8 的一种排列,但不同厂商、不同封装(LGA-8 / BGA-9 / WSON-8)的 pin order 并不统一,甚至同厂不同容量批次也可能有差异。原理图建库时必须逐一对照该型号的 datasheet 引脚图,切勿直接套用其他家的封装。这是 SD NAND 项目最容易翻车的地方。
芯天下 XTX SD NAND 选型对照
| 电压域 | 容量 | 型号 | 封装 | 状态 |
|---|---|---|---|---|
| 3.3 V(2.7 ~ 3.6 V) | 1 Gb | XTSDG01GWSIGA | WSON-8 8×6 mm | MP |
| 3.3 V(2.7 ~ 3.6 V) | 2 Gb | XTSDG02GWSIGA | WSON-8 8×6 mm | MP |
| 3.3 V(2.7 ~ 3.6 V) | 4 Gb | XTSDG04GWSIGA | WSON-8 8×6 mm | MP |
| 3.3 V(2.7 ~ 3.6 V) | 8 Gb | XTSDG08GWSIGA | WSON-8 8×6 mm | MP |
| 1.8 V(1.7 ~ 1.9 V) | 1 Gb | XTSDQ01GWSIGA | WSON-8 8×6 mm | MP |
| 1.8 V(1.7 ~ 1.9 V) | 2 Gb | XTSDQ02GWSIGA | WSON-8 8×6 mm | MP |
| 1.8 V(1.7 ~ 1.9 V) | 4 Gb | XTSDQ04GWSIGA | WSON-8 8×6 mm | MP |
| 1.8 V(1.7 ~ 1.9 V) | 8 Gb | XTSDQ08GWSIGA | WSON-8 8×6 mm | MP |
| 1.8 V(1.7 ~ 1.9 V) | 1 / 2 Gb | XTSDQ01GLAIGA / XTSDQ02GLAIGA | LGA-8 6×5 mm | CS(小体积版本) |
XTX SD NAND 主力封装为 WSON-8 8×6 mm(不是 LGA-8),pin order 需以具体料号 datasheet 为准;1.8 V 小体积版本另有 LGA-8 6×5 mm 封装。
未使用引脚的处理
- SPI 模式下的 DAT1(8 脚)、DAT2(1 脚):优先级顺序为 → 接主控 GPIO(若器件支持 IRQ / busy 输出且你需要)→ 4.7 ~ 10 kΩ 上拉到 VCC_SD → 直接悬空(仅当 datasheet 明确允许)。不推荐直接接地。
- SDIO 1-bit 模式下的 DAT1 / DAT2 / DAT3:DAT3 在 SD 协议中兼作卡检测(内部下拉、主机上拉识别),外部仍建议 4.7 ~ 10 kΩ 上拉;DAT1 / DAT2 悬空或上拉均可,但上拉更利于 ESD 与抗干扰。
- 任何情况下,未使用的 IO 引脚不要在 PCB 上预留测试焊盘以外的大面积走线,避免成为天线。
1.3 内部架构
理解内部架构有助于判断"哪些事情硬件不用管、哪些必须由软件做":
因为坏块管理、ECC、磨损均衡都在器件内部,主控不需要像 Raw NAND 那样外挂 ECC 引擎或跑 FTL —— 这也是 SD NAND 相对并行 NAND 的最大工程价值。但代价是:主控无法直接控制写入位置与时机,掉电时序必须由系统设计保证(见 第 8 章)。
1.4 关键电气参数
| 参数 | 符号 | 最小值 | 典型值 | 最大值 | 备注 |
|---|---|---|---|---|---|
| 电源电压 | VDD | 2.7 V | 3.3 V | 3.6 V | SD 规范要求 ±10% |
| 电源纹波 | Vripple | — | — | 100 mVp-p | 建议控制在 50 mV 以内 |
| 读工作电流 | IDD-R | — | 15 ~ 30 mA | 45 mA | 25 MHz 4-bit 连续读 |
| 写 / 擦工作电流 | IDD-W | — | 30 ~ 70 mA | 100 mA | NAND 编程瞬间峰值 |
| Standby 电流 | IDD-SB | — | 80 ~ 350 µA | 500 µA | 时钟停止、卡未选中 |
| 断电后漏电流 | Ioff | — | < 1 µA | 取决于负载开关 | 低功耗方案的目标值 |
| 输入高电平 | VIH | 0.625×VDD | — | VDD+0.3 | 3.3 V 时约 2.06 V |
| 输入低电平 | VIL | −0.3 | — | 0.25×VDD | 3.3 V 时约 0.83 V |
| 上电到首条命令 | tPU | 1 ms | 5 ms | — | 建议留 5~10 ms 余量 |
| 初始化时钟 | fOD | 100 kHz | 400 kHz | 400 kHz | 识别阶段上限 |
注:以上为通用参考量级,实际以器件 datasheet 为准。VIH / VIL 取值来自 SD 规范对 3.3 V 信令的定义。
2 · 接口与工作模式
2.1 SPI 模式 vs SDIO 模式
SD NAND 上电后默认处于 SDIO(SD 总线)模式。切换到 SPI 模式的方法是:拉低 CS(DAT3)的同时发送 CMD0。一旦进入 SPI 模式,只能通过重新上下电退出(部分器件支持断电复位)。
| 维度 | SPI 模式 | SDIO 模式 |
|---|---|---|
| 信号线 | CLK、DI(CMD)、DO(DAT0)、CS(DAT3) | CLK、CMD、DAT0 [+DAT1~3] |
| 总线宽度 | 固定 1-bit | 1-bit / 4-bit 可切换 |
| 理论最高速率 | 25 MHz → 约 3.1 MB/s(部分器件可超频至 33~40 MHz) | 50 MHz × 4 = 25 MB/s |
| SPI 时钟极性 | Mode 0(CPOL=0, CPHA=0),数据在 CLK 上升沿采样 | 不适用(SD 总线为上升沿采样) |
| CRC | 默认关闭,需 CMD59 开启;CMD0 必须带正确 CRC(0x95) | 命令 CRC7 / 数据 CRC16,硬件自动 |
| 主控要求 | 任意 SPI 外设,甚至 GPIO 模拟 | 需 SDIO / SD / MMC 硬件控制器 |
| 初始化流程 | CMD0 → CMD8 → CMD58 → ACMD41 → CMD58(查 CCS)→ CMD16 / CMD59 | CMD0 → CMD8 → ACMD41 → CMD2 → CMD3 → CMD7 → ACMD6 → CMD6 |
| 硬件 CRC / DMA | 需软件处理 CRC(若开启) | 控制器硬件完成,可配 DMA |
| 优势 | 接口简单、走线少、时序裕量大、主控选择面广 | 速率高、协议由硬件处理、CPU 占用低 |
| 劣势 | 速率低、CPU 开销大、无 4-bit 扩展 | 需要专用外设、走线等长要求更严 |
只存配置参数、日志、小固件、字库 → SPI 模式足够,还省主控资源。
需要跑文件系统(FATFS / littlefs)、存 UI 资源 / 音频 / OTA 包、批量写日志 → 必须 SDIO 4-bit,否则写吞吐会严重拖慢系统响应。
2.2 速率档位与总线宽度
| 档位 | 信令电压 | 时钟上限 | 1-bit 理论 | 4-bit 理论 | 实测有效(读) | SD NAND 支持度 |
|---|---|---|---|---|---|---|
| 识别 / 初始化 | 3.3 V | 100 ~ 400 kHz | 0.05 MB/s | — | — | 全部支持(必须) |
| Default Speed(DS) | 3.3 V | 25 MHz | 3.1 MB/s | 12.5 MB/s | 6 ~ 10 MB/s | 全部支持 |
| High Speed(HS) | 3.3 V | 50 MHz | 6.25 MB/s | 25 MB/s | 12 ~ 20 MB/s | 主流型号支持 |
| UHS-I SDR25 | 1.8 V | 50 MHz | 6.25 MB/s | 25 MB/s | — | 极少支持 |
| UHS-I DDR50 | 1.8 V | 50 MHz | — | 50 MB/s | — | 基本不支持 |
SD NAND 的写入速度远低于读取速度,这是 NAND 编程特性决定的,与接口速率关系不大。典型 SD NAND 连续写入在 2 ~ 8 MB/s,小文件随机写可能低至几百 KB/s。把时钟从 25 MHz 提到 50 MHz,读性能提升明显,写性能提升有限。做方案评估时不要拿 25 MB/s 这个理论数字去估写入时间。
2.3 模式选型决策
选择接口模式的核心依据是三条:主控是否有 SDIO 外设、吞吐需求是否超过 3 MB/s、PCB 是否能满足 4 线等长。三者都满足才值得上 SDIO 4-bit;否则 SPI 更简单也更稳。
3 · 电源与低功耗设计(核心章节)
本章是 SD NAND 设计与普通 SD 卡座设计最大的差异点。由于 SD NAND 没有类似 eMMC 的 CMD5 SLEEP / AWAKE 指令,也不支持 SDIO 卡的休眠机制,关掉时钟后的 Standby 电流仍在 100 µA 量级。对于电池供电的 IoT / 穿戴设备,这个量级不可接受,必须从硬件上切断 VCC。
3.1 供电与去耦
- 电压:3.3 V ±10%(2.7 ~ 3.6 V)。若系统主电源是 3.7 V 锂电池或 5 V,需先经 LDO / DCDC 稳压,不要直接由电池供电(电压会随电量变化超出范围)。
- 去耦配置:VCC 引脚附近放置 1 × 10 µF(陶瓷,X5R/X7R,0603/0805)+ 2 × 0.1 µF(0402/0603)。0.1 µF 必须紧靠 VCC 引脚(走线 < 2 mm),10 µF 提供写操作峰值电流的电荷池。
- 总容值下限:SD 规范要求卡侧 VDD 上有效去耦电容不小于 1 µF;工程上按 ≥ 10 µF 设计以应对编程峰值。
- 电容布局:所有去耦电容的地回路必须直接打到 SD NAND 下方的完整地平面,用短而宽的走线或多个过孔连接,避免与其他大电流回路共用。
- 不要串磁珠 / 电感:在 VCC 上串磁珠会在写峰值电流时造成电压跌落,导致写入失败。若必须隔离噪声,用 0 Ω 电阻预留位置。
图中 10 µF 与两颗 0.1 µF 都是各自独立地从 VCC_SD 跨接到 GND(三条并联支路)。若误画成串联,等效容量按 1/C 折算且两颗电容分压,等于没有去耦 —— 这是画原理图时最容易被忽略、后果也最严重的一类错误。
3.2 VCC 断电控制:三种方案
- 方案 A 的动作逻辑:GPIO 高电平 → N-MOS 导通 → P-MOS 栅极被拉低 → VGS ≈ −3.3 V → P-MOS 导通;GPIO 低电平 → N-MOS 截止 → 10 kΩ 上拉使 VGS = 0 → 关断。
- 1.8 V GPIO 的经典坑:若主控 GPIO 为 1.8 V 电平而 VCC_SD 为 3.3 V,GPIO 直驱 P-MOS 会关不断(VGS = −1.5 V 仍导通),必须用 N-MOS / NPN 做电平移位,如方案 A 所示。
- 方案 C 为什么不推荐:开关在地回路里,导通时器件地比系统地高出一个 VDS,CMD / DAT 的电平判定基准被抬高,容易在读写出错;而且 IO 引脚仍挂在 3.3 V 上,倒灌路径依然存在,省不掉"IO 置低"这一步。
- 不要把负载开关当成"GPIO 直接供电":写峰值可达 100 mA,远超 GPIO 驱动能力,会造成主控内部电压跌落。
负载开关选型要点
| 参数 | 要求 | 原因 |
|---|---|---|
| 导通电阻 RDS(on) | < 100 mΩ(推荐 < 60 mΩ) | 200 mA 峰值时压降 < 20 mV,不影响 VDD 窗口 |
| 持续电流 | ≥ 300 mA | 预留 2~3 倍裕量应对写峰值与浪涌 |
| 关断漏电流 | < 1 µA | 直接决定待机功耗下限 |
| 静态电流 IQ | < 1 µA | 关断态主要看关断电流,导通态看 IQ |
| 输出电压摆率 | 可控 / 软启动 | 限制上电浪涌,避免主电源电压跌落 |
| 输出放电 QOD | 强烈建议具备 | 关断后快速泄放残压,保证下次干净上电 |
| 反向电流阻断 | 具备(true reverse current blocking) | 防止主控先掉电时电流倒灌 |
| EN 逻辑电平 | 兼容主控 GPIO 电平(1.8 V / 3.3 V) | 1.8 V IO 主控需选 1.8 V 逻辑兼容型号 |
常用型号参考
| 型号 | 厂商 | VIN | IMAX | RDS(on) | QOD | 特点 |
|---|---|---|---|---|---|---|
| TPS22916 | TI | 1.8~5.5 V | 2 A | 63 mΩ | 可选 | 超低关断漏电(<10 nA),IQ 极低 |
| TPS22917 / 22918 | TI | 1.8~5.5 V | 2 A | 78 mΩ | 有 | 软启动可控,封装小,综合最均衡 |
| TPS22860 | TI | 1.8~5.5 V | 0.5 A | 240 mΩ | 有 | 超小封装,适合空间紧张设计 |
| SGM2578 | 圣邦微 | 1.8~5.5 V | 1.5 A | 60 mΩ | 可选 | 国产替代,性价比高 |
| SY6280AAC | 力芯微 | 2.4~5.5 V | 1.2 A | 80 mΩ | 无 | 带限流保护,常用 |
| AP22652 / AP22802 | Diodes | 1.5~5.5 V | 2 A | 65 mΩ | 可选 | 车规型号齐全 |
| RT9742 / RT9743 | Richtek | 2.4~5.5 V | 3 A | 55 mΩ | 可选 | 带可调限流 |
| XC8107 | Torex | 1.8~6.0 V | 1 A | 90 mΩ | 无 | 超低 IQ,适合穿戴 |
型号仅为示例,选型时请以最新 datasheet 参数与供货状态为准。
3.3 泄放残压与 IO 倒灌防护
切断 VCC 后,如果主控的 CLK / CMD / DAT 引脚仍保持高电平(SDIO 外设的空闲态常常是内部上拉为高),电流会通过 SD NAND 引脚内部的 ESD 保护二极管从 IO 灌入 VDD 网络,把 VCC_SD "顶"到 1~2 V。后果有四个:
- 断电失败,实际功耗仍达数十至数百 µA;
- SD NAND 内部处于半死不活的亚稳态,下次上电初始化可能失败;
- 长期偏置会加速器件老化甚至损坏;
- 若外部上拉电阻挂在 VCC_3V3 上,倒灌路径更明显。
解决办法:断电前,先把主控的这 4~6 个 IO 从 SDIO 复用功能切回 GPIO,配置为输出低电平(或模拟输入 / 高阻)。推荐"输出低",因为它可以主动把结电容上的电荷放掉,最彻底。
外部上拉的接法(硬性要求)
CMD / DAT0~3 的外部上拉电阻必须接到 VCC_SD(开关之后),而不是 VCC_3V3(开关之前):
- 若接到 VCC_3V3,断电后上拉电阻会持续通过 ESD 二极管给 VCC_SD 供电,直接破坏断电效果;
- 接到 VCC_SD 后,断电瞬间上拉网络随之失电,且主控 IO 已置低,倒灌路径被彻底切断。
泄放设计
- 首选:选用带 Quick Output Discharge(QOD)功能的负载开关,关断时内部 MOS 自动把 VCC_SD 拉到地,零静态功耗。
- 次选:在 VCC_SD 与 GND 之间加 47 kΩ ~ 100 kΩ 常接泄放电阻。10 kΩ 时静态功耗 1.09 mW(偏大),47 kΩ 为 0.23 mW,100 kΩ 为 0.11 mW。不要用小于 10 kΩ 的泄放电阻。
- 第三选择:用一个额外的 N-MOS + 电阻,仅在关断时导通放电(成本换功耗)。
- 关断后等待 VCC_SD 降到 < 0.3 V(留足余量可按 < 0.1 V)再认为断电完成;之后若要重新上电,建议再等 1~5 ms 让电荷完全泄放。
3.4 上电 / 断电时序
- 严禁在 busy 期间断电:可能导致正在编程的页损坏,甚至丢失 FTL 映射表。断电前必须确认
CMD13或 DAT0 电平显示卡已空闲。 - VCC 上升沿必须单调:回勾可能使内部 POR 误判,导致初始化失败。选用带软启动的负载开关即可满足。
- 避免频繁上下电:每次上电都需重新初始化(10~100 ms)并产生浪涌电流,建议在 RAM 中做写缓存合并,减少上下电次数。
- CMD0 之前至少要送 74 个时钟周期,让内部控制器完成 POR 与状态机复位;这 74 个时钟必须在 ≤400 kHz 下送出。
3.5 软件流程参考
下面是断电 / 上电控制的伪代码框架,可直接移植到 STM32、GD32、NXP、ESP32、瑞萨等平台。
/* ============ 断电 ============ */
int sdnand_power_down(void)
{
/* 1. 落盘并等待卡不再忙 */
fs_sync(); // 文件系统同步
if (sd_wait_not_busy(TIMEOUT_500MS) != OK) // CMD13 轮询 / DAT0 电平
return -EBUSY; // 宁可放弃断电,也不要在 busy 时掉电
/* 2. 停时钟;SPI 模式先拉高 CS */
SDIO_ClockCmd(DISABLE);
gpio_set(CS_PIN, 1); // 仅 SPI
/* 3. 关键:IO 切 GPIO 输出低,切断倒灌路径 */
sdio_pins_to_gpio_output_low(); // CLK / CMD / DAT0~3
/* 4. 关断负载开关 */
gpio_set(SD_PWR_EN, 0);
/* 5. 等待残压泄放 */
delay_ms(3);
// 可选:adc_sample(VCC_SD) < 0.3V 确认
/* 6. 标记状态,进入低功耗 */
sd_state = SD_OFF;
return OK;
}
/* ============ 上电 ============ */
int sdnand_power_up(void)
{
/* 1. 确保 IO 低、EN 低 */
sdio_pins_to_gpio_output_low();
gpio_set(SD_PWR_EN, 0);
delay_us(50);
/* 2. 打开负载开关 */
gpio_set(SD_PWR_EN, 1);
/* 3. 等待电源稳定(含软启动时间)*/
delay_ms(5);
/* 4. IO 切回外设 */
sdio_pins_to_af();
/* 5. 识别阶段:400 kHz + ≥74 个 dummy clock */
SDIO_Init(CLK_400KHZ, BUS_1BIT);
SDIO_SendDummyClocks(80);
/* 6. 标准识别流程 */
if (sd_identify() != OK) { // CMD0 / CMD8 / ACMD41 / CMD2 / CMD3
sdnand_power_down(); // 失败也断电,避免漏电
return -EIO;
}
/* 7. 提速:先切宽度,后切高速,最后提频 */
sd_set_bus_width(BUS_4BIT); // ACMD6
if (card_supports_hs())
sd_switch_to_hs(); // CMD6,切换时时钟必须 ≤25 MHz
SDIO_SetClock(target_freq); // 25 或 50 MHz
sd_state = SD_ON;
return OK;
}
初始化失败时建议做"断电 → 延时 10 ms → 重新上电 → 重新初始化"的重试循环,最多 3 次。单纯重复发命令而不重新上下电,成功率远低于完整断电重来。同时务必在失败路径上把负载开关关掉,否则一次失败就会让整机待机电流长期偏高。
3.6 功耗预算
| 工作场景 | SD NAND 电流 | 负载开关漏电 | 合计 | 说明 |
|---|---|---|---|---|
| 连续读(25 MHz 4-bit) | 20 mA | — | 20 mA | — |
| 连续写 / 擦除 | 30 ~ 70 mA | — | ≤ 70 mA | 峰值可到 100 mA |
| 空闲(时钟停、未选中) | 80 ~ 350 µA | — | ≤ 350 µA | 无休眠指令,降不下去 |
| 断电(VCC off,无泄放电阻) | 0 | < 1 µA | < 1 µA | 推荐配置 |
| 断电(VCC off + 47 kΩ 泄放) | 0 | < 1 µA | < 1 µA | 泄放电阻也被切断,不耗电 |
| 断电失败(IO 倒灌) | 50 ~ 500 µA | — | 50 ~ 500 µA | 未将 IO 置低的典型后果 |
以 500 mAh 电池、每天写入 10 MB(约 3 秒 @ 60 mA)、其余时间待机为例:
· 不断电方案:待机 250 µA × 24 h = 6 mAh/天,加写入约 0.05 mAh → 约 6.05 mAh/天 → 约 82 天。
· 断电方案:待机 < 1 µA × 24 h ≈ 0.024 mAh/天,加写入 0.05 mAh → 约 0.074 mAh/天 → 数年(受电池自放电限制)。
差距在一到两个数量级,这就是必须做 VCC 断电控制的原因。
4 · SPI 模式电路设计
图中所有 10 kΩ 上拉都挂在负载开关之后的 VCC_SD 轨上。若接到常开的 VCC_3V3,断电后上拉电阻会持续通过器件内部 ESD 二极管给 VCC_SD 供电,断电效果直接失效(详见 §3.3)。
- SPI Mode 0(CPOL=0, CPHA=0),上升沿采样;识别阶段 ≤400 kHz,工作常用 10~25 MHz。
- CS 在整个命令—响应—数据期间必须保持低电平(每 8 个时钟后可短暂拉高,视器件而定)。
- 进入 SPI 模式:CS 拉低的同时发送 CMD0,CRC 必须正确,为
0x95。 - 上拉点必须接在串阻之后的器件侧(图中串阻占 x≈270~302,上拉抽头在 x≈310~478,全部落在器件侧)。接在串阻主控侧会与器件侧形成分压,空闲电平拉不到 VCC_SD。
- DAT1 / DAT2 是慢速可选线,不画串阻;图中用虚线表示可选连接。
4.1 元件取值
| 元件 | 取值 | 数量 | 作用与说明 |
|---|---|---|---|
| Rseries(SCK / MOSI) | 0 ~ 33 Ω(可选) | 2 | 源端端接,抑制过冲。靠近 MCU 放置,Layout 预留焊盘 |
| Rseries(MISO) | 0 ~ 33 Ω(可选) | 1 | MISO 是 SD NAND 输出、MCU 输入,串阻应靠近 SD NAND 放置 |
| Rseries(CS) | 0 ~ 33 Ω(可选) | 1 | CS 速率低,可直接短接;空间允许时保留 |
| RPU(CS) | 10 kΩ,必需 | 1 | 保证上电期间 CS 为高,避免误入 SPI 模式 |
| RPU(DO / DAT0) | 4.7 ~ 10 kΩ | 1 | 开漏响应期间提供上升沿;多数 MCU 内部上拉可替代 |
| RPU(DI / CMD) | 4.7 ~ 10 kΩ(可选) | 1 | MCU 推挽驱动时可省;长走线时建议保留 |
| RPU(DAT1 / DAT2) | 4.7 ~ 10 kΩ(可选) | 2 | SPI 下未使用;上拉更利于抗干扰,也可接 GPIO 用 IRQ / busy |
| Cbypass | 0.1 µF × 2 | 2 | 紧靠 VDD 引脚,两颗并联 |
| Cbulk | 10 µF | 1 | 提供写峰值电荷池 |
上拉取值口径:本指南统一推荐 4.7 kΩ(允许 4.7 ~ 10 kΩ),不使用 47 kΩ 一类过弱上拉——SDIO 走线通常在 30~80 mm,过弱上拉在空闲期易受串扰,且开漏响应阶段上升沿过缓会直接吃掉高速模式的时序余量。追求极低功耗时可取 10 kΩ,但不要再往上加。
4.2 SPI 初始化流程要点
/* 1. 进入 SPI 模式:CS=0 的同时发 CMD0,CRC 必须为 0x95 */
CS_LOW(); spi_send_cmd(0, 0x00000000, 0x95); // 期望 R1 = 0x01 (idle)
/* 2. CMD8 检查电压与协议版本,arg = 0x000001AA,CRC = 0x87 */
r = spi_send_cmd(8, 0x000001AA, 0x87); // 期望 R7 = 0x01 + 0x000001AA
/* 3. CMD58 读 OCR,确认电压窗口 */
r = spi_send_cmd(58, 0, 0); // R3: OCR 32bit
/* 4. ACMD41 = CMD55 + CMD41,轮询直到 busy bit 清零 */
do {
spi_send_cmd(55, 0, 0);
r1 = spi_send_cmd(41, 0x40000000, 0); // HCS = 1
} while (r1 != 0x00 && --retry);
/* 5. 再次 CMD58,检查 CCS(bit30) 判断 SDSC / SDHC */
spi_send_cmd(58, 0, 0);
is_sdhc = (ocr & (1UL << 30)) ? 1 : 0;
/* 6. SDSC 必须设置块长度;SDHC/SDXC 固定 512B,此步可省 */
if (!is_sdhc) spi_send_cmd(16, 512, 0);
/* 7. 建议开启 CRC 校验,提升数据可靠性 */
spi_send_cmd(59, 0x00000001, 0); // CRC_ON_OFF = 1
/* 8. 提频到工作速率 */
SPI_SetBaudRate(target); // 常用 10~25 MHz
- 不能像 SPI NOR Flash 那样上电直接读。SD NAND 必须走完整的 SD 识别流程,否则数据线不会输出有效内容。
- 写操作后必须轮询 busy。发送 CMD24(WRITE_BLOCK)后,DO 线会持续输出
0x00,主机需持续读取直到收到非0x00字节,才能拉高 CS 或发下一条命令。 - 每块之间要有间隔。连续多块写时用 CMD25(WRITE_MULTIPLE_BLOCK),并用 STOP_TRAN token 结束,效率远高于多个 CMD24。
- SPI 模式下的"高速":SD 规范没有为 SPI 定义 High Speed 档位,能否超过 25 MHz 取决于器件,需要实测验证并做高低温考核。
4.3 1 路 SPI 挂多个 SD NAND
一颗主控的一路 SPI 只有一组 SCK / MOSI / MISO,但板上有可能需要两片 SD NAND——常见理由有三个:把固件区与数据区分开(避免频繁擦写拖慢启动)、A/B 双备份 OTA、以及一片常电小容量存配置、一片门控大容量存日志。SPI 模式天然支持这种接法:每片一个独立 CS,三根信号线共享。
但 SD NAND 与 SPI NOR 有一个本质差别,会让"照搬多片 SPI NOR 的画法"直接翻车:SD NAND 写完一个块之后,DO 线会被器件持续驱动为低电平直到内部编程结束,这段时间里即便把 CS 拉高,部分器件也不会立刻释放 DO。再叠加上第 3 章的 VCC 门控——两片的上下电状态可能不同步——这就是多片 SD NAND 最难调的地方。
- 共享线只串一次阻:SCK / MOSI / MISO 由主控唯一驱动,未被选中的那片在这些线上为高阻,因此 33 Ω 串阻只放在主控侧一次,不必每片都串。
- 每片独立 CS:CS0 / CS1 由两个 GPIO 分别驱动,各自串 33 Ω、各自上拉 10 kΩ 到本片的 VCC_SD。绝不能用一片 CS 同时选通两片。
- DO 上拉按片独立:两片的 DAT0 / DO 各用 10 kΩ 上拉到自己的 VCC_SD(图中在总线两端各画一处,实际两片都接)。
- 每片一路负载开关:SW1 / SW2 各自独立,EN0 / EN1 分别由主控 GPIO 控制,这样才能做到"只唤醒其中一片"。代价见下文"上拉互拉"。
为什么不能照抄多片 SPI NOR 的接法
| 对比项 | 多片 SPI NOR | 多片 SD NAND |
|---|---|---|
| 进入可用的前置流程 | 上电即可读,无需初始化 | 每片都要走完整的 SD 识别流程(CMD0 / CMD8 / ACMD41 / CMD58),且换片后不能复用 |
| DO 的释放时机 | CS# 拉高后立即高阻 | 写操作 busy 期间 DO 被器件持续驱动为低;CS 拉高后还需补 8 个时钟才彻底释放 |
| 一次事务的长度 | 1 字节 opcode(长命令也只到 6 字节) | 6 字节命令 + 多字节响应,一次读块要连续四千多个时钟 |
| 典型速率 | 104 ~ 133 MHz | SPI 模式通常 ≤ 25 MHz,总线负载对时序的影响相对小 |
| 上下电 | 多片通常同一电源域,同时上下电 | 常需要独立门控,于是引出上拉互拉问题 |
这是多片 SD NAND 最致命的硬件故障模式。SPI NOR 在 CS# 拉高后立刻释放 MISO,而 SD NAND 有两种情况会让 DO 保持驱动:
- 写操作 busy:发送 CMD24 / CMD25 之后,器件把 DO 拉低表示忙,直到内部编程结束才放开。
- 读数据的连续输出:多块读(CMD18)进行中,DO 持续输出数据流。
如果此时主控切到另一片(拉低另一片 CS),总线上就是一片拉低、一片输出数据——读到的是线与结果,表现为"数据偶尔整体错位"或直接读出全 0。
软件侧必须做的三件事:
- 换片前先确认当前片不在 busy。发完写命令后轮询 DO 直到收到非
0x00,再拉高 CS。 - CS 拉高后补 8 个时钟,让器件彻底释放 DO。多片共享总线时这一步不能省。
- 换片后重新走识别流程。SD NAND 的状态机由上电 / CS 有效沿触发,不能假设另一片已经初始化过;把初始化流程封装成函数,按需对目标片再跑一遍。
这是多片 SD NAND 最隐蔽的一个坑,只有"独立门控"和"共享总线"同时存在时才会出现。假设片 1 断电、片 2 上电:
- 带 QOD(快速输出放电)的负载开关(TPS22917 等)关断后,会把 VCC_SD0 内部拉到 GND。于是片 1 的 DO 上拉不再是上拉,而变成了 10 kΩ 下拉。
- 它与片 2 的 10 kΩ 上拉在 MISO 上分压,空闲电平停在 VCC/2 附近(3.3 V 时约 1.65 V)——既不是确定的高,也不是确定的低。
- 同理,CS0 的上拉在片 1 断电后也变成下拉,若该 GPIO 在复位期驱动能力弱,CS0 可能拉不到高电平而误选通。
三种解法,按推荐度排序:
| 方案 | 做法 | 代价 | 适用 |
|---|---|---|---|
| A 两片共用一路负载开关推荐 | SW1 / SW2 合并成一路更大电流的开关,VCC_SD0 = VCC_SD1,上拉只留一组 | 失去独立门控,待机电流是两片之和 | 两片总是同时工作的场景(固件区 + 数据区) |
| B DO 线加总线开关隔离 | 每片的 DO 经 74LVC1G66 / TS3A5017 一类模拟开关再并入总线,未上电那片的开关断开 | 每片多 1 颗开关 + 1 根选择 GPIO;DO 线上多约 5 Ω 导通电阻与 5 pF 电容 | 必须独立门控的场景 |
| C 两片各占一路 SPI 外设 | SPI1 接片 1、SPI2 接片 2,完全不共享 | 多占 3 根 IO | 主控 IO 富裕、且两片速率或模式不同 |
如果选 A(两片同时上下电),上拉只保留一组即可,阻值回到 4.7 ~ 10 kΩ;如果两片分开布局在板子两端,则应在总线最末端保留这一组上拉,而不是放在主控附近。
如果只是为了容量,直接换更大容量的单片——XTX SD NAND 现有 MP 料号已覆盖 1 / 2 / 4 / 8 Gb(3.3 V 的 XTSDG01G / 02G / 04G / 08GWSIGA,1.8 V 的 XTSDQ01G / 02G / 04G / 08GWSIGA,均为 WSON-8 8×6 mm)。多片方案的真实价值是隔离——读写分离、A/B 备份、独立门控,而不是堆容量。
另外,SPI 模式下片数超过 4 片后 GPIO 与总线电容都会失控,那时应改用 SDIO 多片(见 §5.4)或换接口。