SDIO主要功能
- 支持1位总线,4位总线,8位总线,8位总线可达48M传输速率。
- 支持MMC卡,SD卡和CE-ATA等标准
SDIO总线拓扑
总线上的通信是通过传送数据和命令实现的。
基本操作:命令/响应,某些操作还有数据令牌。
在SD存储器上是以数据块的形式进行传输。
-
当选择SDIO工作在SD4位数据总线工作模式时候,我们选中的引脚如下:
-
数据的传输操作流程如下:(以读操作为例)
- 主机发送命令,等待卡的响应。
- 卡响应以后,数据从卡发送至主机,经过CRC后(也可能是数据流,无需每次CRC).
- 继续发送下一个数据块。
- 主机发送一个STOP的命令后,卡发回一个响应,传输完成。
SDIO功能描述
- 包含两个部分,一个是SDIO适配器,一个是AHB总线接口。
- 所有的数据线都工作于推挽模式。
- 对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。
- 适配器,一共五个部分
- 寄存器
- 控制单元
电源管理和时钟分频
命令通道
发送命令和接收响应
- 命令通道状态机CPSM
- 命令固定为48位,其中包括了开始和结束位,传输位一共3位
- 6位命令索引
- 32位参数
- 7位CRC
- 响应则有两种格式,短格式如上命令格式,长格式136位包括CID和CSD
数据通道
- SD卡可以选择4位总线或者1位总线,默认为1位
- 数据通道状态机:DPSM使能后进入WAIT-S或者WAIT-R状态
- 发送状态:如果FIFO中有数据,则发送出去
- 接收状态,收到起始位进入接收状态,从卡中读数据
- DPSM一共6个状态,包括idle,busy以外,还有WAIT-S和WAIT-R,以及sending和receiving状态。
- 数据令牌格式分成两种,一种是块数据,一种是流数据,块数据包含了16位CRC,流数据则没有。
- 数据为32位+起始2位+CRC16位。
数据FIFO
- FIFO大小为32*32,根据RXACT和TXACT来分配FIFO为发送还是接收
- 发送FIFO,AHB数据写入FIFO,有TXFIFOF和TXFIFOE表示FULL和EMPTY,当8个以上的FIFO空时候,TXFIFOHE,此时可以通知DMA继续填入数据,TXDAVL和TXUNDERR用于处理异常。
- 接收FIFO类似。
总线接口
下面的例子,主机控制器使用CMD24(WRITE_BLOCK)从主机传送512字节到MMC卡,关于CMD24命令,后面有统一描述。
- 执行卡识别过程
- 提高SDIO_CK频率
- 发送CMD7命令选择卡
- 配置DMA2:清中断,设置源地址和目标地址,设置DMA2的其他参数,使能DMA
- 发送CMD24:
- 设置数据长度
- 卡的地址
- 设置命令WRITE_BLOCK
- 等待SDIO_STA中断
- 等待DBCKEND
- 查询DMA通道的使能状态
卡功能描述
卡识别模式
此模式只用到了CMD线,执行流程:复位所有卡,检测电压范围,分配地址RCA
卡复位
CMD0软件复位后,所有的卡处于闲置模式,分配默认地址,闲置模式下卡的输出端为高阻状态。
操作电压范围确认
超出操作电压的卡将进入非激活状态,存储了CID和CSD的卡,电压正常后则可以通信。
卡识别过程
MMC和SD卡的识别略有不同,MMC卡就是数码相机用的卡,而SD卡更小,而SDIO接口通常用于WIFI和蓝牙,GPS模块用,SD卡的识别过程如下:
- 总线被激活
- 主机发送SEND_OP_COND
- 主机得到响应,不兼容的卡设为非激活状态
- ALL_SEND_CID广播发送到激活卡
- 激活的卡发送CID,如果有多个竞争,则用线与仲裁
- 主机发送SET_RELATIVE_ADDR,作为刚刚CID卡的地址,然后此卡进行待机。
- 如果有多个卡,则进行下一次循环。
写数据块
- 执行CMD24-27时,主机写入数据,在数据块后跟CRC
- WRITE_BL_LEN决定了数据长度,如果CRC错误,则所有数据全部丢掉。
- 如果卡已写满,或者有对齐等错误发生时进行处理,主机可以随时发送SEND_STATUS来查询状态。
- READY_FOR_DATA表示卡还可以继续写入数据,主机才继续写入
- 有错误时,SDIO_D拉低。
读数据块
读数据块的操作有点同写数据块
数据流操作
只适用于多媒体卡,SD卡和SDIO不支持这种最快速的操作。