嵌入式系统学习——STM32之SD卡(上)

SDIO简介-什么是SDIO接口?


      SDIO,全称: Secure Digital Input and Output ,即安全数字输入输出接口。它是在SD卡接口的基础上发展而来,它可以兼容之前的SD卡,并可以连接SDIO接口设备,比如:蓝牙、WIFI、照相机等。
      SDIO和SD卡规范间的一个重要区别是增加了低速标准。低速卡的目标应用是以最小的硬件开支支持低速I/ O能力。低速卡支持类似调制解调器、条码扫描仪和GPS接收器等应用。
      STM32的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SD I/O卡和CE-ATA设备。


SDIO简介-SDIO接口特点

STM32 SDIO接口特点包括:
①与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。
②与较早的多媒体卡系统规格版本全兼容(向前兼容)。
③与SD存储卡规格版本2.0全兼容。 
④与SD I/O卡规格版本2.0全兼容:支持两种不同的数据总线模式:1位(默认)和4位。
⑤完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。  8位总线模式下数据传输速率可达48MHz。 
⑥数据和命令输出使能信号,用于控制外部双向驱动器。


SDIO简介-SDIO框图

嵌入式系统学习——STM32之SD卡(上)_第1张图片
复位后SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置)。如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。       

MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0(为了通用性考虑,在程序里面我们只要检测到是MMC卡就设置为1位总线数据)。 


SDIO简介-SDIO时钟

卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输1位命令或数据。对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。
SDIO适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,可用于产生SDIO_CK时钟。对F1来说,SDIOCLK来自HCLK(72Mhz);对F4来说,SDIOCLK来自PLL48CK(48Mhz)。
F1:AHB总线接口时钟(HCLK/2):该时钟用于驱动SDIO的AHB总线接口,其频率为HCLK/2=36Mhz。
F4:APB2总线接口时钟(PCLK2):该时钟用于驱动SDIO的APB2总线接口,其频率为PCLK2=84Mhz。
      SDIO_CK计算公式:SDIO_CK=SDIOCLK/(2+CLKDIV)
注意:在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率(但不可以超过SD卡最大操作频率)。


SDIO简介-SDIO命令与响应

SDIO的命令分为:应用相关命令(ACMD)和通用命令(CMD)两部分。发送ACMD时,需先发送CMD55。
SDIO所有的命令和响应都是在SDIO_CMD引脚上面传输的,命令长度固定为48位,SDIO命令格式如下表所示:
嵌入式系统学习——STM32之SD卡(上)_第2张图片
其中:除了命令索引和参数需要我们设置,其他都是由SDIO硬件自动控制。命令索引(如CMD0,CMD1之类)由SDIO_CMD寄存器设置,命令参数则由SDIO_ARG寄存器设置。

一般SD卡在接收到命令行,都会有一个应答(CMD0例外),这个应答我们也称之为响应。STM32的SDIO接口,支持2种响应类型:短响应(48位)和长响应(136位)。

STM32 SDIO短响应(48位)格式如下表所示:
嵌入式系统学习——STM32之SD卡(上)_第3张图片


STM32 SDIO长响应(136位)格式如下表所示:
嵌入式系统学习——STM32之SD卡(上)_第4张图片

      不论是短响应还是长响应,硬件都会自动滤除了起始位、传输位、CRC7以及结束位等信息,对于短响应,命令索引存放在SDIO_RESPCMD寄存器,参数则存放在SDIO_RESP1寄存器里面。对于长响应,则仅留CID/CSD位域,存放在SDIO_RESP1~SDIO_RESP4等4个寄存器。


SDIO简介-SDIO块数据传输

SDIO与SD卡通信一般以数据块的形式进行传输,SDIO(多)数据块读操作,如下图所示:
嵌入式系统学习——STM32之SD卡(上)_第5张图片

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

uSDIO()数据块写操作,如下图所示:

嵌入式系统学习——STM32之SD卡(上)_第6张图片
       数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的数据块必须在SD卡非繁忙的时候发送。这里的繁忙信号由SD卡拉低SDIO_D0,以表示繁忙,SDIO硬件自动控制,不需要我们软件处理。


参考: 开源电子网     STM32中文参考手册

你可能感兴趣的:(嵌入式系统STM32)