stm32专题四十一:SDIO

时间:2024-03-18 14:10:27

SDIO协议简介

SDIO简介

stm32专题四十一:SDIO

SDIO接口设备

stm32专题四十一:SDIO

目前 SD 协议提供的 SD 卡规范版本最新是 4.01 版本,但 STM32F10x 系列控制器只支持 SD 卡规范版本 2.0,即只支持标准容量 SD 和高容量SDHC 标准卡,不支持超大容量 SDXC 标准卡,所以可以支持的最高卡容量是 32GB。

如下图所示(左边64GB为超大容量 SDXC,右边32GB为大容量 SDHC):

stm32专题四十一:SDIO

SD卡物理结构

一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分。

stm32专题四十一:SDIO

SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息。这些寄存器只能通过对应的命令访问,对 SD 卡进行控制操作并不是像操作控制器 GPIO 相关寄存器那样一次读写一个寄存器的,它是通过命令来控制。 SDIO 定义了 64 个命令,每个命令都有特殊意义,可以实现某一特定功能, SD 卡接收到命令后,根据命令要求对 SD 卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现 SD 卡的控制以及读写操作

SD卡寄存器描述(很复杂,只需要关注常用的几个就可以):

stm32专题四十一:SDIO

SD卡总线结构:

stm32专题四十一:SDIO

引脚说明和操作时序:

stm32专题四十一:SDIO

SDIO和SPI的区别:

SDIO明显时钟频率更快,而且SDIO拥有4根数据线,同等频率下通信速度能提高4倍。

 

总线协议

SD 总线通信是基于命令和数据传输的。通讯由一个起始位(0),由一个停止位(1)终止。 SD 通信一般是主机发送一个命令,从设备在接收到命令后作出响应,如有需要会有数据传输参与。

stm32专题四十一:SDIO

stm32 多数据块写入

stm32专题四十一:SDIO

stm32专题四十一:SDIO

SD 数据传输支持单块和多块读写,它们分别对应不同的操作命令,多块写入还需要使用命令来停止整个写入操作。数据写入前需要检测 SD 卡忙状态,因为 SD 卡在接收到数据后编程到存储区过程需要一定操作时间, SD卡忙状态通过把 D0 线拉低表示。


SD卡操作时序:

先发送第1字节,然后发送第2字节,以此类推...

在发送每字节时,D0 ~ D3先发送高 4 位,再发送低 4 位。

stm32专题四十一:SDIO

宽位数据包格式(专用于SSR寄存器):

stm32专题四十一:SDIO

 

SDIO命令及响应

命令

SD 命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
命令格式

stm32专题四十一:SDIO

命令参数意义:

stm32专题四十一:SDIO

命令类型:

stm32专题四十一:SDIO

常规命令(64条)和特定应用命令(厂商自定义的命令)

stm32专题四十一:SDIO

stm32专题四十一:SDIO

响应:

响应由 SD 卡向主机发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈SD卡的状态。 SDIO 总共有7个响应类型(代号: R1~R7),其中 SD 卡没有 R4、 R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。
 

命令描述:

stm32专题四十一:SDIO

如上所示,CMD0命令,类型为无响应广播命令,复位所有卡到空闲状态;

CMD2命令,位带响应广播命令,通知所有卡通过CMD线返回CID值,响应类型为R2;

stm32专题四十一:SDIO

可以看到,发送命令CMD2,返回R2类型,实际上就是返回CID或者CSD寄存器的值。

stm32专题四十一:SDIO

当发送CMD2命令后,会返回CID值(128位),这个128位标识符太长,可以通过CMD3命令,通知所有卡发布新RCA(16位)来区分系统上有几张卡(总线上的卡通信后会知道总线上有多少张卡,然后协调并自动分配每张卡的RCA标识符),返回类型为R6,如下所示:

stm32专题四十一:SDIO

R6类型会返回RCA寄存器值,并返回部分卡状态寄存器值(32位寄存器);

stm32专题四十一:SDIO

R1类型会返回卡状态寄存器的全部位。

stm32专题四十一:SDIO

CMD8命令,发送SD卡的接口条件,如果SD卡认为这是正常的电压,则返回R7类型;

stm32专题四十一:SDIO

数据读取操作(每次读取前,要先设置块的长度):

stm32专题四十一:SDIO

可以看到,SD卡的数据宽度为32位。注意,这里有区分SDSC(标准容量SD卡)和SDHC(大容量SD卡):

SDSC:地址以字节位单位,如 0 ~ 511地址位第1数据块,512 ~ 1023地址为第2数据块;

SDHC:地址以块为单位,1地址就是第1数据块,2地址就是第2数据块;

块写入操作类似:

stm32专题四十一:SDIO

块擦除操作(需要使用3个命令):

块擦除需要指定数据起始地址、结束地址、然后开始进行擦除操作;

stm32专题四十一:SDIO

stm32专题四十一:SDIO

当有多个SD卡存在时,SD卡如何得知是对哪一张SD卡进行操作?

stm32专题四十一:SDIO

实际上,要通过CMD7命令,选中一张SD卡。

 

SD卡操作模式

SD卡操作模式

stm32专题四十一:SDIO

模式状态如下:

stm32专题四十一:SDIO

卡识别模式状态机:

stm32专题四十一:SDIO

数据传输模式状态机:

stm32专题四十一:SDIO

 

stm32 SDIO接口

SDIO功能框图:

stm32专题四十一:SDIO

stm32专题四十一:SDIO

SDIO适配器:

stm32专题四十一:SDIO

控制单元:

stm32专题四十一:SDIO

命令路径:

stm32专题四十一:SDIO

下面是 stm32 中文参考手册中,相关的寄存器描述:

SDIO参数寄存器:

stm32专题四十一:SDIO

SDIO命令寄存器:

stm32专题四十一:SDIO

stm32专题四十一:SDIO

SDIO响应1...4寄存器(根据短响应or长响应不同来区分)

stm32专题四十一:SDIO

命令路径状态机:

stm32专题四十一:SDIO

数据路径:

stm32专题四十一:SDIO

数据路径状态机:

stm32专题四十一:SDIO

数据 FIFO

stm32专题四十一:SDIO

对应的寄存器描述:

SDIO状态寄存器 SDIO_STA

stm32专题四十一:SDIO

stm32专题四十一:SDIO

SDIO数据控制寄存器(设置数据块大小):

stm32专题四十一:SDIO