四.SDIO功能框图(重点)
SDIO包含2个部分:
● SDIO适配器模块:实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的传送。
● AHB总线接口:操作SDIO适配器模块中的寄存器(由STM32控制SDIO外设),并产生中断和DMA请求信号
正在上传…重新上传取消
复位后默认情况下SDIO_D0用于数据传输,初始化后主机可以改变数据总线的宽度(SD卡1根或4根数据线)。
如果一个SD卡接到了总线上,可以通过主机配置数据传输使用SDIO_D0或SDIO_D[3:0] (使用一根或四根数据线)。所有的数据线都工作在复用推挽模式。
命令线也都工作在复用推挽模式
-
时钟
SDIO使用两个时钟信号:
● SDIO适配器时钟(SDIOCLK=HCLK)
● AHB总线时钟(HCLK/2)经过了分频
SDIO_CK是卡的时钟线:每个时钟周期上升沿在命令和数据线上传输1位命令或数据。对于SD卡,时钟频率可以在0MHz至25MHz间变化。正在上传…重新上传取消
-
引脚定义
正在上传…重新上传取消
接下来就是将SDIO框图拆分研究各个模块:
1.SDIO适配器
● SDIO适配器模块:实现所有SD卡的相关功能,如时钟的产生、命令和数据的传送,而STM32可以通过AHB接口读写适配器寄存器从而控制SDIO外设读写SD卡(发送命令,接收响应,数据传输)。
正在上传…重新上传取消
适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK)
SDIO适配器包含以下5个部分
● 适配器寄存器模块
● 控制单元
● 命令通道
● 数据通道
● 数据FIFO
1.适配器寄存器模块
适配器寄存器模块包含所有系统寄存器。
2.控制单元
控制单元包含电源管理功能和为存储器卡提供的时钟分频
正在上传…重新上传取消
时钟管理子单元产生和控制SDIO_CK信号。SDIO_CK输出可以使用时钟分频或时钟旁路模式。
在电源关闭和电源启动阶段,电源管理子单元会关闭卡总线上的输出信号则下述情况下没有时钟输出:
● 复位后
● 在电源关闭和电源启动阶段
● 当启动了省电模式并且卡总线处于空闲状态(命令通道和数据通道子单元进入空闲阶段后的8个时钟周期)
3.命令通道(重点)
命令通道单元向SD卡发送命令,并接收SD卡的响应,命令与响应都使用SDIO_CMD(命令线)进行传输。
正在上传…重新上传取消
-
1.主机(STM32SDIO外设)发送命令给SD卡
1)命令参数寄存器
正在上传…重新上传取消
2)命令寄存器(命令索引(6位),命令使能位ENCMDcompl)
SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)。
命令的主体包括:命令号,命令参数/地址信息,其他的(起始位,传输标志,CRC校验,终止位)不管,后面再讲。
如果命令不带参数,那SDIO参数寄存器默认为全1就好了
主机发送命令的流程:
正在上传…重新上传取消
-
2.主机(STM32SDIO外设)接收SD卡的响应
1)命令响应寄存器
正在上传…重新上传取消
2)SDIO相应寄存器1~4
SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。(关于响应与命令后面马上讲)
正在上传…重新上传取消
现在只需要知道,响应由SD卡也是通过CMD(命令线)传输到SDIO(响应中的命令号存放在SDIO的命令响应寄存器中(如果响应不带命令号则不用管就好了),SD卡的状态则存放在SDIO 响应寄存器1~4)
主机接收SD卡响应的流程:
正在上传…重新上传取消
-
3.命令通道状态机(CPSM)
当写入命令寄存器并设置了使能位,开始发送命令。命令发送完成时,命令通道状态机(CPSM)设置状态标志并在不需要响应时进入空闲状态(见下图)。
正在上传…重新上传取消
一般发送命令接收响应过程
正在上传…重新上传取消
如果命令寄存器中设置挂起位,CPSM进入挂起(Pend)状态并等待数据通道子单元发出的CmdPend信号,在检测到CmdPend信号时,CPSM进入发送(Send)状态,这将触发数据计数器发送停止命令的功能
当进入等待(Wait)状态时,命令定时器开始运行,当CPSM进入接收(Receive)状态之前,产生了超时,则设置超时标志并进入空闲(Idle)状态。
注: 命令超时固定为64个SDIO_CK时钟周期。
正在上传…重新上传取消
然后那些状态机CPSM被关闭,CRC校验失败等都会回到空闲状态
最后这个发送命令等待响应的过程,有很多状态感觉会很复杂,其实我们只有启用了CPSM状态机可以不用管这些状态转化,我们只管发送命令,CPSM状态机会帮我们处理好这些状态。
正在上传…重新上传取消
-
4.命令通道状态标志
正在上传…重新上传取消
正在上传…重新上传取消
-
5.CRC校验
CRC发生器计算CRC码之前所有位的CRC校验和,包括开始位、发送位、命令索引和命令参数或卡状态)。对于长响应格式,CRC校验和计算的是CID或CSD的前120位;注意,长响应格式中的开始位、传输位和6个保留位不参与CRC计算。
CRC反正不用管,硬件会帮我们自动校验
4.数据通道
正在上传…重新上传取消
在时钟控制寄存器中可以配置卡的数据总线宽度。如果选择了4位总线模式,则每个时钟周期四条数据信号线(SDIO_D[3:0])上将传输4位数据;如果没有选择宽总线模式,则每个时钟周期只在SDIO_D0上传输1位数据。(数据传输可以选择1根或4根数据线关于SD卡)