好的,下面我用中文详细解释SD卡读取协议和**SDIO(Secure Digital Input Output)**的工作原理及流程。
一、SD卡读取协议简介
SD卡的通信协议主要有两种模式:
- SPI模式(串行外设接口,兼容性好,速度较低)
- SDIO模式(也叫SD模式,速度高,支持多种总线宽度)
你代码中用的是SDIO模式,即通过SDIO外设与SD卡通信。
二、SDIO协议详细解释
1. SDIO硬件连接
- 数据线:DAT0DAT3(1位/4位模式),有些卡还支持DAT4DAT7(8位模式,主要用于MMC)
- 命令线:CMD
- 时钟线:CLK
- 电源:VDD(一般3.3V)
2. 通信流程(以读取为例)
1)初始化阶段
- 上电后,主机(MCU)通过SDIO接口对SD卡进行初始化,包括:
- 发送复位命令(CMD0)
- 检查电压范围(CMD8)
- 反复发送ACMD41,等待卡准备好
- 获取卡的CID、CSD等信息(CMD2、CMD9)
- 分配RCA地址(CMD3)
- 选择卡(CMD7)
- 设置总线宽度(ACMD6)
- 设置块长度(CMD16,SDHC卡固定512字节)
2)数据传输阶段(以单块读取为例)
- 发送读命令:CMD17(READ_SINGLE_BLOCK),参数为要读取的地址
- 等待卡响应:卡返回R1响应,表示命令是否接受
- 数据传输:
- SD卡准备好后,通过数据线(DAT0~DAT3)将数据块发送给主机
- 主机通过SDIO外设接收数据,可以用DMA或轮询方式
- 数据块后面跟随CRC校验码
- 错误处理:主机检查CRC、超时等错误标志
3)多块读取
- 发送CMD18(READ_MULTIPLE_BLOCK),连续读取多个块
- 读取完成后,主机需发送CMD12(STOP_TRANSMISSION)停止传输
3. SDIO协议的命令类型
- 标准命令(CMD):如CMD0、CMD8、CMD17等
- 应用命令(ACMD):如ACMD41、ACMD6等,需先发送CMD55告知卡下一个是应用命令
4. SDIO协议的响应类型
- R1:常用,32位,包含错误标志和卡状态
- R2:长响应,128位,用于CID/CSD
- R3:OCR寄存器响应
- R6:RCA响应
- R7:接口条件响应
5. 总线宽度
- 1位模式:只用DAT0
- 4位模式:用DAT0~DAT3,速度更快
- 通过ACMD6命令切换
6. 典型SD卡读取流程时序图
三、代码中的SDIO协议实现
代码中的 sd_block_read、sd_multiblocks_read 等函数,正是按照上述协议流程实现的。
- 先发送命令(如CMD17/CMD18),
- 检查响应(R1等),
- 然后通过SDIO外设接收数据(可用DMA或轮询),
- 最后处理错误和清理中断标志。
四、总结
- SDIO协议是SD卡高速通信的标准协议,支持1位/4位总线,命令/响应机制,支持DMA。
- 读取流程包括初始化、命令发送、数据传输、错误处理等环节。

5335

被折叠的 条评论
为什么被折叠?



