SDIO协议简介
SDIO简介
SDIO接口设备
目前 SD 协议提供的 SD 卡规范版本最新是 4.01 版本,但 STM32F10x 系列控制器只支持 SD 卡规范版本 2.0,即只支持标准容量 SD 和高容量SDHC 标准卡,不支持超大容量 SDXC 标准卡,所以可以支持的最高卡容量是 32GB。
如下图所示(左边64GB为超大容量 SDXC,右边32GB为大容量 SDHC):
SD卡物理结构
一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分。
SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息。这些寄存器只能通过对应的命令访问,对 SD 卡进行控制操作并不是像操作控制器 GPIO 相关寄存器那样一次读写一个寄存器的,它是通过命令来控制。 SDIO 定义了 64 个命令,每个命令都有特殊意义,可以实现某一特定功能, SD 卡接收到命令后,根据命令要求对 SD 卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现 SD 卡的控制以及读写操作。
SD卡寄存器描述(很复杂,只需要关注常用的几个就可以):
SD卡总线结构:
引脚说明和操作时序:
SDIO和SPI的区别:
SDIO明显时钟频率更快,而且SDIO拥有4根数据线,同等频率下通信速度能提高4倍。
总线协议
SD 总线通信是基于命令和数据传输的。通讯由一个起始位(0),由一个停止位(1)终止。 SD 通信一般是主机发送一个命令,从设备在接收到命令后作出响应,如有需要会有数据传输参与。
stm32 多数据块写入
SD 数据传输支持单块和多块读写,它们分别对应不同的操作命令,多块写入还需要使用命令来停止整个写入操作。数据写入前需要检测 SD 卡忙状态,因为 SD 卡在接收到数据后编程到存储区过程需要一定操作时间, SD卡忙状态通过把 D0 线拉低表示。
SD卡操作时序:
先发送第1字节,然后发送第2字节,以此类推...
在发送每字节时,D0 ~ D3先发送高 4 位,再发送低 4 位。
宽位数据包格式(专用于SSR寄存器):
SDIO命令及响应
命令
SD 命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
命令格式
命令参数意义:
命令类型:
常规命令(64条)和特定应用命令(厂商自定义的命令)
响应:
响应由 SD 卡向主机发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈SD卡的状态。 SDIO 总共有7个响应类型(代号: R1~R7),其中 SD 卡没有 R4、 R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。
命令描述:
如上所示,CMD0命令,类型为无响应广播命令,复位所有卡到空闲状态;
CMD2命令,位带响应广播命令,通知所有卡通过CMD线返回CID值,响应类型为R2;
可以看到,发送命令CMD2,返回R2类型,实际上就是返回CID或者CSD寄存器的值。
当发送CMD2命令后,会返回CID值(128位),这个128位标识符太长,可以通过CMD3命令,通知所有卡发布新RCA(16位)来区分系统上有几张卡(总线上的卡通信后会知道总线上有多少张卡,然后协调并自动分配每张卡的RCA标识符),返回类型为R6,如下所示:
R6类型会返回RCA寄存器值,并返回部分卡状态寄存器值(32位寄存器);
R1类型会返回卡状态寄存器的全部位。
CMD8命令,发送SD卡的接口条件,如果SD卡认为这是正常的电压,则返回R7类型;
数据读取操作(每次读取前,要先设置块的长度):
可以看到,SD卡的数据宽度为32位。注意,这里有区分SDSC(标准容量SD卡)和SDHC(大容量SD卡):
SDSC:地址以字节位单位,如 0 ~ 511地址位第1数据块,512 ~ 1023地址为第2数据块;
SDHC:地址以块为单位,1地址就是第1数据块,2地址就是第2数据块;
块写入操作类似:
块擦除操作(需要使用3个命令):
块擦除需要指定数据起始地址、结束地址、然后开始进行擦除操作;
当有多个SD卡存在时,SD卡如何得知是对哪一张SD卡进行操作?
实际上,要通过CMD7命令,选中一张SD卡。
SD卡操作模式
SD卡操作模式
模式状态如下:
卡识别模式状态机:
数据传输模式状态机:
stm32 SDIO接口
SDIO功能框图:
SDIO适配器:
控制单元:
命令路径:
下面是 stm32 中文参考手册中,相关的寄存器描述:
SDIO参数寄存器:
SDIO命令寄存器:
SDIO响应1...4寄存器(根据短响应or长响应不同来区分)
命令路径状态机:
数据路径:
数据路径状态机:
数据 FIFO
对应的寄存器描述:
SDIO状态寄存器 SDIO_STA
SDIO数据控制寄存器(设置数据块大小):