SD-scard-对应CMD指令集讲解
https://blog.csdn.net/qq_42856778/article/details/118517617
目录:
SD的基本寄存器和基础信息描述:
SCR 寄存器:
<该寄存器保存的SD的特殊性信息(例如支持的总线位宽,SD卡的版本),MMC卡没有此寄存器,获取该寄存器的数据需要从数据线读的>
CSD寄存器:
<SD的相对地址(SD卡已经保存在芯片内部) ,嵌入在SD卡内部>
OCR 寄存器:
<该寄存器保存着SD的可供电范围,并且区别是否为HC卡(根据返回的ORC回应第30位是否置1).>
CIA 参数描述:
<CIA (Card I/O Area)>
CID参数描述:
<SD卡的唯一ID号 也叫CID码>
CIS参数描述:
<标识号和长度加后续内容表示一个节点>
Card_Status寄存器
状态寄存器
SD卡的插入检测一般都是对应的中断触发脚,作为检测当前SD卡有没有被插入卡槽。
SD卡中的CMD命令子集:
CMD_0
当前指令位,进入空闲状态,该指令无灰度
1
2
CMD_1
读OCR寄存器,获取OCR寄存器里面的必要信息
1
2
CMD_2
发送CMD2,验证SD卡是否接入,长反馈(CID),广播获取卡的CID信息
1
2
CMD_3
发送CMD3,读取SD卡是否接入RCA (地址),短反馈 , 广播获取SD卡所分配的相对地址
1
2
CMD_4
可选项: SDIO不支持DSR
1
2
CMD_6
选择服务: 在第1部分v1.10中添加了部分强制服务
1
2
CMD_7
发送CMD7,使能SD卡,如果参数值为0 , 即使取消所有选中SD卡
根据获取指定的RCA,选中SD卡,如果在选中一个卡的状态下,又选中其他的卡,那么之前的卡会自动取消选中,
如果发送地址0,则表示取消选中全部卡
1
2
3
4
CMD_8
(CMD8): 发送CMD8指令过去,CRC校验值与发送的值相同,说明当前SD卡支持SD2.0协议。
1
2
CMD_9
发送CMD9,读取CSD寄存器获取卡的相关信息, 获取SD相关的存储信息,如块大小,容量等
1
2
CMD_10
发送CMD10 , 读取CID信息
1
2
CMD_12
发送CMD12,强制停止所有传输. 停止多块传输操作
1
2
CMD_13
cmd13获取卡的状态,其实本质就是读 Card_Status 寄存器
1
2
CMD_16
设置SD卡的块大小,在CSD寄存器有对应的操作描述,
1
2
CMD17
设置SD卡按照单个区块进行操作, 使SD卡进入传输状态,读取单个块。这个命令需要附带对应的地址参数
也就是需要读取的那个地址,按照整块读取出来。
1
2
3
CMD18
设置SD卡按照多块进行操作 , 使SD卡进入传输状态,读取多个块,直到收到CMD12为止,当前操作
会一直按照地址顺序读下去,直到接收到停止命令。
1
2
3
CMD_24
使SD卡进入传输状态,写入单个块。
1
2
CMD_25
使SD卡进入传输状态,写入多个块
其实CMD24-25 和 CMD 17-18作为相对应的方向操作,一个进行读,一个进行写。都有对应的单块和多块分别。
1
2
3
CMD_27
写CSD寄存器/修改CSD寄存器里的数据,(不建议)
1
2
CMD_28
设置写保护块的地址
1
2
CMD_29
擦除写保护块的地址
1
2
CMD_32:
设置擦除块的起始地址,作为连续擦除机制使用
1
2
CMD_33
设置擦除块的终止地址,作为连续擦除机制使用
1
2
CMD_38
擦除所选择的块
1
2
CMD_55 ( 说明指令 )
特殊指令前命令,在发送ACMD类指令前,需要发送此命令
1
2
SD卡中的ACMD命令子集:
要注意一下ACMD和CMD之间的区别,ACMD是特殊命令,但是发送方法和SDICARG和SDICCON的
命令发送一样,但是每次发送ACMD命令之前,一定要发送一条CMD55说明命令,发送CMD55之后说明下一条命令属于特殊命令集ACMD。
ACMD_6
设置SD卡的总线位宽,这个需要读取SCR确定
1
2
ACMD_13
SD卡状态
1
2
ACMD_41
获取SD电压值,作为测试当前SD卡的支持的协议,所需的电压值是否正常。
1
2
ACMD_51
获取SD卡的SCR寄存器的值
1
2
下面SD卡状态为连续状态:
CMD55+ACMD51
SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽
1
2
CMD7 + CMD16
发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。
1
2
CMD17/CMD18
发送CMD17/CMD18,命令的参数需要根据初始化时所判断的卡类型填写,按字节或按块.
循环读取数据,
1
2
3
CMD32-CMD33
连续擦除对应连续地址块的内存
1
2
《会持续更新当前表–来源自网络整理》
————————————————
版权声明:本文为CSDN博主「小黄鸭-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42856778/article/details/118517617
2.SD卡对应的CMD命令
CMD_0:当前指令位,进入空闲状态,该指令无灰度
CMD_1:读OCR寄存器,获取OCR寄存器里面的必要信息
CMD_2:发送CMD2,验证SD卡是否接入,长反馈(CID),广播获取卡的CID信息
CMD_3:发送CMD3,读取SD卡是否接入RCA (地址),短反馈 , 广播获取SD卡所分配的相对地址
CMD_4:可选项: SDIO不支持DSR
CMD_6:选择服务: 在第1部分v1.10中添加了部分强制服务
CMD_7发送CMD7,使能SD卡,如果参数值为0 , 即使取消所有选中SD卡
根据获取指定的RCA,选中SD卡,如果在选中一个卡的状态下,又选中其他的卡,那么之前的卡会自动取消选中,
如果发送地址0,则表示取消选中全部卡
CMD_8: 发送CMD8指令过去,CRC校验值与发送的值相同,说明当前SD卡支持SD2.0协议。
CMD_9:发送CMD9,读取CSD寄存器获取卡的相关信息, 获取SD相关的存储信息,如块大小,容量等
CMD_10:发送CMD10 , 读取CID信息
CMD_12:发送CMD12,强制停止所有传输. 停止多块传输操作
CMD_13:cmd13获取卡的状态,其实本质就是读 Card_Status 寄存器
CMD_16:设置SD卡的块大小,在CSD寄存器有对应的操作描述,
CMD17:设置SD卡按照单个区块进行操作, 使SD卡进入传输状态,读取单个块。这个命令需要附带对应的地址参数
也就是需要读取的那个地址,按照整块读取出来。
CMD18:设置SD卡按照多块进行操作 , 使SD卡进入传输状态,读取多个块,直到收到CMD12为止,当前操作
会一直按照地址顺序读下去,直到接收到停止命令。
CMD_24:使SD卡进入传输状态,写入单个块。
CMD_25:使SD卡进入传输状态,写入多个块
其实CMD24-25 和 CMD 17-18作为相对应的方向操作,一个进行读,一个进行写。都有对应的单块和多块分别。
CMD_27:写CSD寄存器/修改CSD寄存器里的数据,(不建议)
CMD_28:设置写保护块的地址
CMD_29:擦除写保护块的地址
CMD_32::设置擦除块的起始地址,作为连续擦除机制使用
CMD_33:设置擦除块的终止地址,作为连续擦除机制使用
CMD_38:擦除所选择的块
CMD_55 ( 说明指令 ):特殊指令前命令,在发送ACMD类指令前,需要发送此命令
3.SD卡对应的ACMD命令子集:
要注意一下ACMD和CMD之间的区别,ACMD是特殊命令,但是发送方法和SDICARGSDICCON的命令发送一样,但是每次发送ACMD命令之前,一定要发送一条CMD55说明命令,发送CMD55之后说明下一条命令属于特殊命令集ACMD。
ACMD_6:设置SD卡的总线位宽,这个需要读取SCR确定
ACMD_13:SD卡状态
ACMD23:设置需要预擦除的数据块个数,提高SD卡多数据块写入速度
ACMD_41:获取SD电压值,作为测试当前SD卡的支持的协议,所需的电压值是否正常。
ACMD_51 :获取SD卡的SCR寄存器的值
下面SD卡状态为连续状态:
CMD55+ACMD51:SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽
CMD7 + CMD16:发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。
CMD17/CMD18:发送CMD17/CMD18,命令的参数需要根据初始化时所判断的卡类型填写,按字节或按块.循环读取数据,
CMD32-CMD33:连续擦除对应连续地址块的内存
————————————————
版权声明:本文为CSDN博主「凉城~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45640197/article/details/126618265
浙公网安备 33010602011771号