STM32 SD
单片机使用的大容量存储器,U盘、SD卡、Flash芯片。最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做
到很大(32GB 以上),支持 SPI/SDIO 驱动
4 位模式
最高通信速度可达 48Mhz(分频器旁路时)
最高每秒可传输数据 24M字节
SDIO 控制器支持多媒体卡(MMC 卡)、SD 存储卡、SD I/O 卡和 CE-ATA 设备;
如果一个多媒体卡接到了总线上,则 SDIO_D0、SDIO_D[3:0]或 SDIO_D[7:0]可以用于数据传输;
SDIO 的命令分为应用相关命令(ACMD)和通用命令(CMD)两部分,应用相关命令(ACMD)
的发送,必须先发送通用命令(CMD55),然后才能发送应用相关命令(ACMD);
其中开始位、传输位、CRC7 和结束位由 SDIO 硬件控制,我们需要设置的就只有命令索引和参数部分。其中命令索引(如 CMD0,CMD1 之类的)在 SDIO_CMD 寄存器里面设置,命令参数则由寄存器 SDIO_ARG 设置。
数据在 SDIO 控制器与 SD 卡之间的传输。对于 SDI/SDIO 存储器,数据是以数据块的形式传输的,而对于 MMC 卡,数据是以数据块或者数据流的形式传输。本节我们
只考虑数据块形式的数据传输。SDIO(多)数据块读操作,如图

从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带有 CRC 校验值(CRC 由 SDIO 硬件自动处理),单个数据块读的时候,在收到 1 个数据块以后即可以停止了,不需要发送停止命令(CMD12)。但是多块数据读的时候,SD 卡将一直发送数据给主机,直到接到主机发送的 STOP 命令(CMD12)
SDIO(多)数据块写操作

数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的
数据块必须在 SD 卡非繁忙的时候发送。这里的繁忙信号由 SD 卡拉低 SDIO_D0,以表示繁忙,
SDIO 硬件自动控制
SD卡初始化

SD 卡的初始化流程,要实现 SDIO 驱动 SD 卡,最重要的步骤就是 SD卡的初始化,
只要 SD 卡初始化完成了,那么剩下的(读写操作)就简单了,所以我们这里重
点介绍 SD 卡的初始化。从 SD 卡 2.0 协议文档。
不管什么卡(这里我们将卡分为 4 类:
SD2.0 高容量卡(SDHC,最大32G);
SD2.0 标准容量卡(SDSC,最大 2G);
SD1.x 卡
MMC 卡;
首先我们要执行的是卡上电(需要设置 SDIO_POWER[1:0]=11),上电后发送 CMD0,对卡进行软复位,之后发送 CMD8
命令,用于区分 SD 卡 2.0,只有 2.0 及以后的卡才支持 CMD8 命令,MMC 卡和 V1.x 的卡,是不支持该命令的
SD 卡在收到 CMD2 后,将返回 R2 长响应(136 位),其中包含 128 位有效数据(CID 寄
存器内容),存放在 SDIO_RESP1~4 等 4 个寄存器里面。通过读取这四个寄存器,就可以获得
SD 卡的 CID 信息。
CMD3,用于设置卡相对地址(RCA,必须为非 0),对于 SD 卡(非 MMC 卡),在收到
CMD3 后,将返回一个新的 RCA 给主机,方便主机寻址。RCA 的存在允许一个 SDIO 接口挂
多个 SD 卡,通过 RCA 来区分主机要操作的是哪个卡。而对于 MMC 卡,则不是由 SD 卡自动
返回 RCA,而是主机主动设置 MMC 卡的 RCA,即通过 CMD3 带参数(高 16 位用于 RCA 设
置),实现 RCA 设置。同样 MMC 卡也支持一个 SDIO 接口挂多个 MMC 卡,不同于 SD 卡的
是所有的 RCA 都是由主机主动设置的,而 SD 卡的 RCA 则是 SD 卡发给主机的。
在获得卡 RCA 之后,我们便可以发送 CMD9(带 RCA 参数),获得 SD 卡的 CSD 寄存器
内容,从 CSD 寄存器,我们可以得到 SD 卡的容量和扇区大小等十分重要的信息。CSD 寄存器
我们在这里就不详细介绍了,关于 CSD 寄存器的详细介绍,请大家参考《SD 卡 2.0 协议.pdf》。
至此,我们的 SD 卡初始化基本就结束了,最后通过 CMD7 命令,选中我们要操作的 SD
卡,即可开始对 SD 卡的读写操作了,SD 卡的其他命令和参数。
硬件

软件
增加了固件库 SDIO 支持文件 stm32f4xx_sdio.c 以及头文件 stm32f4xx_sdio.h,同时,我们还新增了 SD 卡的 SDIO 支持文件 sdio_sdcard.c 以及头文
件 sdio_sdcard.h。
浙公网安备 33010602011771号