一、SD初始化flow
CMD8: 区分SD卡2.0,只有2.0及以后的卡才支持CMD8命令。
使用参数0x1aa,即告诉SD卡,主机供电为2.7~3.6V之间。如果SD卡支持CMD8,且支持该电压范围,则会通过CMD8的响应。
ACMD41: abbreviation: sd_send_op_cond
发送(APP CMD)ACMD41之前,要先发送CMD55。
进一步确认卡的操作电压范围; 并通过HCS位来告诉SD卡,主机是不是支持高容量卡(SDHC)。
CMD2: 用于获取CID寄存器数据。
SD卡在收到CMD2后,将返回R2长响应(136位)。
其中包含128位有效数据(CID寄存器内容),存放在SDIO_RESP1~4等4个寄存器里面。通过读取这四个寄存器,就可以获得SD卡的CID信息。
CMD3: 用于设置RCA(卡相对地址,必须为非0)。
对于SD卡(非MMC卡),在收到CMD3后,将返回一个新的RCA给主机,方便主机寻址。
对于MMC卡,则不是由SD卡自动返回RCA,而是主机主动设置MMC卡的RCA,即通过CMD3带参数(高16位用于RCA设置),实现RCA设置。
CMD9:获得卡RCA之后,我们便可以发送CMD9(带RCA参数),获得SD卡的CSD寄存器内容(SD卡的容量和扇区大小等十分重要的信息)。
CMD7:选中我们要操作的SD卡,即可开始对SD卡的读写操作了。
二、SD读写操作
2.1 读操作
2.1.1 单块读
2.1.2 连续块读
CMD16(读/写): 设置SD卡的块大小(bytes);
CMD17(读): 读取SD卡的单个块的数据(该指令带一个参数,表示读取数据块的首地址);
CMD18(读):连续读取SD卡多数据块数据(该指令带一个参数,表示读取数据块的首地址);
CMD12: 强制结束当前SD的数据传输(用于多数据块读写);
2.2 写操作
2.2.1 单块写
2.2.2 连续块写
ACMD23:设置需要预擦除的数据块个数,以提高SD卡多数据块写入性能(速度)。
CMD24(写):写入SD卡的单个块的数据(该指令带一个参数,表示读取数据块的首地址);
CMD25(写):连续写入SD卡多数据块数据(该指令带一个参数,表示读取数据块的首地址);
CMD13:返回被选中的卡的状态。
CMD55:通知SD卡,接下来要发送的应用命令(APP CMD)。