sdio2.0学习心得个人记录贴|附波形文件
sdio是SD卡的通信协议里面规定了两种与sd卡通信的方式,sd和spi,本贴讲的是SD中的部分内容
sdio2.0总线包括一条命令线(CMD),一条时钟线(CLK),四条DAT线(DAT0-DAT3)
sdio重要性质:
(一)所有总线低电平为占用,高电平为空闲,这个性质与iic类似。sd卡利用这个性质标识所有数据(包括命令,响应及其他)的开始位(0)和结束位(1),标识卡的忙状态,还有实现多卡识别。
(二)数据和命令发送时时钟线是低电平时驱动,高电平时采样。跟半双工spi是一样的只不过多了几条线,数据不一定会根据时钟迅速响应而已。
(三)SD卡是一个状态机
注:不注册SD卡协会的会员你只能在官网下到简化规范,里面没有时序图还缺了其他很多东西。网上找规范的时候,Physical Layer Simplified Specification是简化规范,Physical Layer Specification是详细规范
我不会提供这个详细规范的PDF,请自行到其他地方下载,比如翻一翻好心人的GitHub项目,或者在搜索引擎上搜sd3.0中文协议
规范可以是sdio3.0的与sdio2.0兼容
大部分波形已标注,2024-11-16-22:08
sd_wave.sr记录了从初始化到使用cmd17读取单块数据的波形,可以用pulseview打开,以放大细致的观看。2025-2-19
↓↓↓↓↓↓↓
不明觉厉 不明觉厉+1 蹲更新!我也一直想学习SD卡协议 本帖最后由 zrl 于 2024-11-17 13:05 编辑
命令
sdio的命令有两种CMD和ACMD,是用来控制卡工作的,比如切换卡的工作电压(CMD11),切换卡的数据线数量(ACMD6),他们的结构都相同
1位开始位(固定为0),1位传输方向位(主机到卡为1),6位命令索引,32位参数,7位crc7,1位结束位(固定为1),总共6个字节
其中crc7是对前面5个字节(开始位,传输方向位,命令索引,参数)使用crc7-MMC算法得到的结果
命令只在CMD线上发送,发送时统一高位在前
有的命令只有一张卡响应,有的命令总线上的所有卡都会响应
以下是一个发送CMD8的例子
由于CMD和ACMD的命令结构相同,要想卡识别ACMD命令必须先发送CMD55,发送CMD55后,卡会自动将后一个命令识别为ACMD,发送完一个ACMD还想发ACMD,就要再发送一次CMD55.
为初始化时,CMD55的参数中的RCA不用管,填0即可。
一般会用到的命令只有几个CMD0,CMD2,CMD3,CMD7,CMD8,CMD17,CMD24,CMD55,ACMD41,ACMD6只要掌握常用的就好了
{:4_250:} 本帖最后由 zrl 于 2024-11-17 13:19 编辑
响应
主机在发送命令后,继续发送时钟,在几个或几十个时钟后,卡会在CMD线产生响应。不同的命令有不同的响应(有的命令没有响应比如CMD0)
响应按长度分有两种,在CMD上发送的6字节响应,在CMD上发送的17字节响应
在在CMD上发送的6字节响应格式为
1位开始位(固定为0),1位传输方向位(卡到主机为0),6位响应命令的索引,39位的响应数据,1位结束位(固定为1)
下面是CMD55的在CMD上发送的6字节响应
本帖最后由 zrl 于 2024-11-16 22:30 编辑
在CMD上发送的17字节响应格式为
1位开始位(固定为0),1位传输方向位(卡到主机为0),6位响应命令的索引,127位的响应数据,1位结束位(固定为1)
下面是CMD2的在CMD上发送的17字节响应 本帖最后由 zrl 于 2024-11-17 11:44 编辑
响应按功能分6种:R1,R1b,R2,R3,R6,R7,R指的是respond,b指的是busy。
不同命令对应不同的响应,比如CMD8对应R7,CMD55对应R1,ACMD44对应R3,具体哪个对应哪个,可以查阅sdio物理层简化规范里的命令表(简化规范没有时序图)