stm32驱动驱动SDHC卡卡 (SPI方式方式) 一一
SD卡是比较常见的存储设备了。SD卡也有分类,按照容量有三类。1、 SD卡,小容量的卡。容量小于2G。现
在用得比较少了。2、 SDHC卡。中容量的卡,容量大于2G,小于32G。目前用得普遍。3、 SDXC卡。大容量
的卡,容量大于32G。
不同的卡,使用的协议标准是不一样的。小容量的SD卡,用的是SD1.0的标准。而中容量的SD卡。用的是SD2.0的标准。至
于大容量,没有研究,不清楚。
手里面有一个8G的SD卡,属于中容量。所以以下内容都是关于中容量SD卡,即使用标准SD2.0。
SD卡的传输模式有两种,一种是SDIO模式,一种是SPI模式。两种模式区别在于协议不一样而已。这里用的是SPI模式。
其实SD的驱动还是比较简单的。就是向SD卡发各种命令,然后接受命令判断。最后在发数据,读数据。
首先说下SD卡命令格式。
SD卡的指令由6字节(Byte)组成,如下:
Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD39第一字节为
01100111,即0x27+0x40)
Byte2-5:Command Arguments,命令参数,有些命令没有参数
Byte6:前7位为CRC(Cyclic Redundacy Check,循环冗余校验)校验位,最后一位为停止位0.
这里如果是用SPI模式的话,CRC效验是不重要的,即什么都可以(我设置为0xff)。除了CMD0.CMD0的CRC是一定要正确
的。
SD卡的命令非常的多,在不同的时候就要发送不同的命令。命令是很多,但是有很多我们都用不上,经常用的有
CMD0,CMD8,CMD55,ACMD41和读取和写入的命令
SD卡命令共分为12类,分别为class0到class11
Class0 :(卡的识别、初始化等基本命令集)
CMD0:复位SD 卡.
CMD1:读OCR寄存器.
CMD9:读CSD寄存器.
CMD10:读CID寄存器.
CMD12:停止读多块时的数据传输
CMD13:读 Card_Status 寄存器
Class2 (读卡命令集):
CMD16:设置块的长度
CMD17:读单块.
CMD18:读多块,直至主机发送CMD12为止 .
Class4(写卡命令集) :
CMD24:写单块.
CMD25:写多块.