现在讨论SD卡的硬件驱动:
1、首先对于SD卡,采取的是一答一应的模式(主机没发一次命令,SD卡就回应一次)。而对于SD卡的操作基于两方面:命令+内部寄存器,并且对于寄存器的操作也还是通过命令,所以命令是SD卡的心脏。SD卡只有几个寄存器而已,不过这些寄存器很重要,具体如下:
CID寄存器,有128位,用于:卡识别号,每张卡都有唯一的识别号;
RCA寄存器
DSR寄存器,有16位,用于:驱动级寄存器,配置卡的驱动输出;
CSD
SCR寄存器
OCR寄存器,32位,用于:操作状态寄存器;
SSR寄存器,
CSR寄存器,32位,用于卡状态,有关卡状态的信息。
SPI模式下使用到的命令
CMD0
CMD8
CMD9
CMD10
CMD12
CMD16
CMD17
CMD18
CMD23
CMD24
CMD25
CMD41
CMD55
CMD58
CMD59
2、如何发送命令(切记有传入命令参数的)
SPI命令格式:由六个字节组成,其中一个字节高两位是01低六位填充命令索引值CMD1:01000001;紧接着就是命令参数占4个字节,最后一个字节高七位就是CRC校验最后一位固定为1;
如果使用SPI模式,那么每一次发一条命令就通过SPI总线把上面的六个字节1bit逐一发送即可。
3、SD卡响应:
通过SPI总线可以在发完命令之后读取响应,响应有多种格式:R1、R2、R3、R6、R7。
4、初始化SD卡,对于SD卡的初始化,网上很多,协议也有一张很经典的图:Figure
第二步,获取版本信息和电压接受范围,发送CMD8(参数是1aa),这样就会响应R7(注意第一个字节和R1一样)。如果是version
第三步,如果第二步判断是version
第三步2:如果第二步判断是version
(可以通过CMD59命令禁止
总结:上面那些操作基于协议的Figure
基本操作:发命令-->通过响应判断命令执行后的结果。
5、SD卡的读写:
这里就比较简单了。
读一个扇区:
发送CMD17命令(起始地址为传入的参数),命令发送成功则开始读取数据,第一个数据是起始数据令牌
读取多个扇区:
发送CMD18命令(起始地址为传入的参数),命令发送成功则开始读取数据,可以通过循环多次读取数据(一次一个扇区),当发送CMD12命令表示停止读取。
写一个扇区:
发送CMD24命令(起始地址为传入的参数),先发送起始数据令牌
写多个扇区:
发送CMD25命令(起始地址为传入的参数),先发送起始数据令牌
擦除块:
发送CMD32命令指定擦除块的开始地址,发送CMD33命令指定擦除块的结束地址,发送CMD38命令擦除开始,接收SD卡返回的状态字。
SD卡的核心部分:命令格式、命令响应格式、读写初始化流程
附录:来自http://www.openedv.com/posts/list/6430.htm?fromAll=0
CMD0:复位SD
CMD1:读OCR寄存器。
CMD9:读CSD寄存器。
CMD10:读CID寄存器。
CMD12:停止读多块时的数据传输。
CMD13:读
3.2.2.Class2
CMD16:设置块的长度。
CMD17:读单块。
CMD18:读多块,直至主机发送CMD12为止
3.2.3.Class4(写卡命令集)
CMD24:写单块。
CMD25:写多块。
CMD27:写CSD寄存器
3.2.4.Class5
CMD32:设置擦除块的起始地址。
CMD33:设置擦除块的终止地址。
CMD38:
3.2.5.Class6(写保护命令集):
CMD28:设置写保护块的地址。
CMD29:擦除写保护块的地址。
CMD30:
class7:卡的锁定,解锁功能命令集。
class8:申请特定命令集
class10