1. SD卡协议
SD卡的寄存器
2. SDIO控制器
注:SD卡一般可以支持SDIO和SPI两种方式,本次只学习SDIO方式。
2.1 SDIO的功能
图2 STM32F1 的 SDIO 控制器功能框图
SDIO_CK(SD卡接口时钟线):由SDIO主机产生,一般不超过400Khz,此外SDIO_CK 与 SDIOCLK 的关系:SDIO_CK = SDOCLK/(2+CLKDIV);
SDOCLK(SDIO适配时钟线):该时钟用于驱动 SDIO 适配器,其频率等于 AHB 总线频率(HCLK);
HCLK/2(AHB总线接口时钟):该时钟用于驱动 SDIO 的 AHB 总线接口,其频率为HCLK/2;
SDIO_CMD:控制命令线,SDIO主机可以由此发送命令来控制SD卡,此外也可以通过该线接受应答信号;
SDIO_D:数据线。
注:复位后默认情况下 SDIO_D0 用于数据传输。初始化后主机可以改变数据总线的宽度(通过 ACMD6 命令设置)。如果一个多媒体卡接到了总线上,则 SDIO_D0、SDIO_D[3:0]或 SDIO_D [7:0]可以用于数据传输(由于MMC 版本 V3.31 和之前版本的协议只支持 1 位数据线,所以只能用 SDIO_D0)。如果一个 SD 或 SD I/O 卡接到了总线上,可通过主机配置数据传输使用 SDIO_D0 或 SDIO_D[3:0]。
2.1 SDIO的命令和响应
SDI数据是以块的形式进行传输的,数据块的长度一般是512个字节。此外,数据块需要CRC位(由SD卡硬件系统产生,可以单线或者4线控制)来保证传输成功。
图3 SDIO命令格式
在实际操作中,我们只需要编写索引(例如:CMD0,CMD1)和参数部分(利用SDIO_ARG寄存器控制),一般SD卡收到命令后会发送应答(除了CMD0),这种响应有长(136位,一般是R2 类)短(48位)之分但都含有CRC(或1111111)校验。值得注意的是,传输位为1时表示命令,传输位为0是表示响应。
图4 长响应格式
图5 短响应格式
接下来,本文列举了一些常用的命令及响应集:
CMD0 | [31:0] | 复位所有卡到空闲状态 | |
CMD2 | [31:0] | R2 | 通知所有卡返回CID值 |
CMD3 | [31:0] | R6 | 通知所有卡发布新的RCA |
CMD8 | [31:12]保留位[16:0]填充位 | R7 | 发送卡的接口信息,包括电压等 |
CMD15 | [31:12]保留位[16:0]填充位 | 使卡进入inactive模式 | |
ACMD41 | [31]保留位[30]HCS(OCR)[29:24]保留位[23:0]电压 | R3 | 要求卡发送它的支持信息(HCS)和OCR的内容 |
ACMD55 | [31:16]RCA[16:0]填充位 | R1 | 指定下个命令是特定应用命令(用于ACMD41前) |
图5 SD常用响应
2.2 SDIO的相关寄存器
电源控制寄存器(SDIO_POWER) | 控制SD卡的供电 |
时钟控制寄存器(SDIO_CLKCR) | 主要用于设置SDIO_CK的分配系数 |
参数控制寄存器(SDIO_ARG) | 存储命令参数,写命令前先写入此寄存器 |
命令响应寄存器(SDIO_RESPCMD) | 存储最后收到的命令响应中的命令索引 |
响应寄存器组(SDIO_RESP1~SDIO_RESP4) | 存放接收到卡的响应部分的信息。短响应放在SDIO_RESP1中,长响应依次放在4个寄存器中。 |
命令寄存器(SDIO_CMD) | 主要设置命令索引 |
数据定时器寄存器(SDIO_DTIMER) | 用于存储 以卡总线时钟(SDIO_CK)为周期的数据超时时间 |
数据长度寄存器(SDIO_DLEN) | 设置需要传输的数据字节长度 |
数据控制寄存器(SDIO_DCTRL) | 用于控制数据通道状态机(DPSM),包括数据传输使能、传输方向、传输模式、DMA 使能、数据块长度等信息 |
状态寄存器(SDIO_STA) | 用来查询 SDIO 控制器的当前状态 |
数据 FIFO 寄存器(SDIO_FIFO) | 数据 FIFO 寄存器包括 接收和发送 FIFO |
FIFO计数器寄存器(SDIO_FIFOCNT) | 当SDIO_DCTRL中的DTEN使能,并且DPSM处于Idle state时,SDIO_LEN/4的数值加载到该寄存器中 |
中断寄存器(SDIO_ICR) | |
中断屏蔽寄存器(SDIO_MASK) |