zrl
发表于 2024-11-16 13:29:45
本帖最后由 zrl 于 2024-11-16 22:14 编辑
卡工作状态
SD卡工作时像一个状态机,不同的工作状态处理不同的命令,处理不同的命令后跳转到不同的工作状态
比如向总线发送CMD0后,总线所有卡(除了ina状态)进入idle状态。我们想要读取SD卡数据,必须使SD进入tran状态,发送CMD17(单块读)进入data状态。
配置SD卡并进入tran状态的过程,称为卡的初始化
SD卡有10种状态,idle(空闲状态),ready,ident,stby,tran,data,rcv,prg,dis,ina(禁用状态)
zrl
发表于 2024-11-16 13:31:53
本帖最后由 zrl 于 2024-11-17 00:17 编辑
具体哪个工作状态跳转到哪个工作状态,哪些工作状态处理哪些命令,就需要查看简化规范中的卡状态转换表
比如CMD2只在ready状态处理,其他状态不处理,处理后进入到ident,卡的状态可以发送带R1响应或R1b响应的命令获取,比如CMD55
zrl
发表于 2024-11-16 14:53:33
本帖最后由 zrl 于 2024-11-17 11:24 编辑
SD卡寄存器
SD卡有六个寄存器OCR(32位卡运行条件寄存器),CID(128位卡唯一ID寄存器),CSD(128位卡特殊数据寄存器),RCA(16位卡临时通信地址寄存器),
DSR(16位驱动能力寄存器),SCR(64位SD卡配置寄存器)
一般用到的寄存器有OCR,CID,RCA。
CID和CSD的分别通过发送CMD10和CMD9读取响应R2获取,OCR寄存器通过发送CMD8读取响应R3获取,RCA寄存器通过发送CMD3读取响应R6获取
zrl
发表于 2024-11-16 15:08:13
本帖最后由 zrl 于 2024-11-16 19:38 编辑
响应R1
R1标明当前卡的运行状态
zrl
发表于 2024-11-16 15:10:28
本帖最后由 zrl 于 2024-11-17 11:15 编辑
响应R1的39:8数据对应功能,其中读清除可以理解为阅后即焚,发送完响应就清除,表中12:9位为SD卡当前工作状态
zrl
发表于 2024-11-16 15:35:26
R1b比R1多一个忙信号在DAT0上
比如发送CMD20,设置SD卡的速度等级
DAT0会被拉低
zrl
发表于 2024-11-16 15:48:17
响应R2和CSD
一般CSD寄存器里的数据不怎么会用到,每个位段数据的使用都需要查看规范,比如挂载SD卡时一般都需要计算容量,计算的公式就在规范里。
zrl
发表于 2024-11-16 16:01:03
本帖最后由 zrl 于 2024-11-16 16:09 编辑
响应R3和OCR寄存器
OCR寄存器可以配置SD卡的工作电压,里面还记录了SD卡的工作电压和工作状态
其中第31位指示了SD卡的上电状态,必须等待卡将其置1才能发送后续的命令
卡的初始过程,大部分时间都是发送ACMD41等待其第31位置1
第30位指示其是否为SDHC(high capacity 大容量SD卡),是就为1.
第24位SDIO2.0不支持默认写0
可以使用ACMD41来获取R3响应以读取OCR寄存器
angalp
发表于 2024-11-16 16:03:14
跟着学习{:4_174:}
zrl
发表于 2024-11-16 16:12:23
响应R6和RCA
R6响应的高16位就是RCA寄存器的内容
后面16位是R1响应的部分内容