SDNAND 的读写与擦除操作在 SDIO 和 SPI 两种模式下遵循相同的 SD 协议命令集,但命令的封装格式和底层驱动实现有所差异。下面从底层命令序列和上层应用两个层面来梳理。
读取操作使用块寻址,每个块通常为 512 字节。
SDIO 模式下,主机通过 SDIO 外设自动处理命令与数据的时序。

多块读取时,SDNAND 会持续发送数据块,直到主机发送 CMD12 (STOP_TRANSMISSION) 终止传输。
SPI 模式下的命令需封装为 6 字节帧:1 字节命令码 + 4 字节参数 + 1 字节 CRC。

SPI 模式下,主机发送读命令后,需等待 SDNAND 返回 数据令牌 (0xFE),随后接收数据块。
写入操作同样以 512 字节块为单位。写入前,目标块必须已被擦除(或由控制器内部自动处理)。

多块写入时,建议在 CMD25 之前发送 ACMD23(通过 CMD55 + ACMD23),设置预擦除的块数量,可显著提升多块写入速度。

写入时,主机先发送写命令,等待 SDNAND 返回响应令牌,然后发送 数据令牌 (0xFE) + 数据 + 2 字节 CRC。
SDNAND 的擦除以擦除组为单位,一组可以包含一个或多个写块。擦除命令序列必须严格按顺序执行:
如果命令顺序错误(如先发 CMD38),SDNAND 会在状态寄存器中设置 ERASE_SEQ_ERROR 并重置整个序列。擦除过程中,SDNAND 会将 DAT0 拉低表示忙状态,擦除时间可能较长,主机需等待其释放。
SPI 模式下的擦除使用相同的命令码(CMD32/33/38),但封装为 6 字节 SPI 帧。擦除后数据为 0 还是 1 取决于芯片设计,由 SCR 寄存器的 DATA_STAT_AFTER_ERASE 位定义。
对于大多数嵌入式应用,无需手动管理上述底层命令。SDNAND 内置控制器自动处理擦除、ECC 和坏块管理,配合 FATFS 文件系统即可像操作 U 盘一样读写文件。
典型流程:
底层初始化:SDIO 模式调用 HAL_SD_Init();SPI 模式实现 SDinit()(发送 CMD0/CMD8/ACMD41/CMD58 等序列)
文件操作:使用 f_open / f_write / f_read / f_close 等标准 API
格式化(可选):f_mkfs("0:", ...) 在首次使用时创建 FAT 文件系统
SPI 模式代码示例(STM32 + FATFS):
// 1. 切换到 SPI 模式并初始化
SDinit(); // 内部:拉低 CS + CMD0 → 锁定 SPI 模式
// 2. 挂载文件系统
FATFS FS;
f_mount(&FS, "0:", 1);
// 3. 写入文件
FIL f;
UINT bw;
f_open(&f, "0:test.txt", FA_CREATE_ALWAYS | FA_WRITE);
f_write(&f, "Hello SDNAND", 12, &bw);
f_close(&f);
// 4. 读取文件
char buf[32];
UINT br;
f_open(&f, "0:test.txt", FA_READ);
f_read(&f, buf, 12, &br);
f_close(&f);
在 Linux 平台下,SDNAND 通常被识别为块设备(如 /dev/mmcblk0),可直接使用 mount、cp、mkfs.vfat 等标准命令进行操作。
地址模式:SDHC/SDXC 卡(CCS=1)使用块地址(每块 512 字节),SDSC 卡(CCS=0)使用字节地址,需在初始化后通过 CMD58 读取 OCR 寄存器确认。
SPI 模式的 CRC:SPI 模式默认 CRC 关闭,但 CMD0 和 CMD8 的 CRC 必须有效,否则无法正确切换模式。
总结:裸机开发需按 CMD17/18/24/25 和 CMD32/33/38 的顺序实现底层驱动;带文件系统的应用则直接调用 FATFS 或 Linux 块设备接口即可,底层擦除和坏块管理由 SDNAND 控制器自动完成。
上一篇:SDNAND怎么进入SPI模式
电话:176-6539-0767
微信:176-6539-0767
邮箱:xcz@xczmemory.cn
地址:深圳市联创商务中心13层1308室