一、SD卡简介
1、什么是SD卡
2、SD卡的特点
3、SD卡的寄存器
CSD寄存器包括卡的容量,数据块的大小,非常重要的寄存器
二、SPI 模式如何访问SD卡
1. SPI模式下,SD卡的命令格式
2. SD卡命令介绍
CMD0用来复位SD卡。
CMD8用来区分2.0卡还是1.0卡。
CMD9读取卡的特定的数据寄存器SCR。
CMD10读取卡的标志寄存器CID。
CMD16设置块大小,对于SDHC无效,SDHC固定是512字节。
CMD17读取一个块的数据。
CMD18读取多个块的数据。
CMD24是写入一个块的数据。
CMD25是写入多个块的数据。
每个指令都有一个响应。SD卡和单片机的通信过程
R2到R7响应,请参照《SD卡2.0协议.pdf》7.3.2节
3、SD卡初始化
初始化步骤:
此流程图为SPI模式
流程解读:
先Power-on上电,然后延时大于74个CLK,然后使CS=0,发送CMD0,这样就进入SPI模式,然后发送CMD8(通常带个参数0x1AA)1为代表主机的供电范围为2.7V到3.6V和AA为检查通信,这个指令最重要的作用是用来区分是2.0的卡还是1.x的卡或是MMC卡,如果这个指令有响应,就是说明卡是2.0的卡或者是以后版本的卡,如果没有响应就说明是1.x的卡或是MMC卡,如果是2.0的卡就会有响应,然后检查卡的电压,CMD58是可选的指令,这里用不到,就不发送CMD58,发送ACMD41指令(注意在发送这个指令之前要先发送CMD55),如果主机支持高容量的卡就设置HCS位等于1,如果不支持,设置HCS=0,发送完ACMD41指令后,卡有个R1响应,如果R1响应中idle_state = 1,就是空闲状态=1,如果空闲状态=1,就不停发送ACMD41指令,知道空闲状态标志位idle_state=0,再进行下面的步骤,发送一个CMD58指令,通过CMD58指令,返回一个OCR寄存器的值(CMD58指令是读取OCR寄存器的值),OCR寄存器中有个CCS位,如果CCS=1,说明是一个2.0的SDHC高容量的卡,如果CCS=0,说明是 一个2.0的标准容量的卡,也就是0到2GB的卡。
另外一个如果不响应CMD8,是一个1.x的卡或是MMC卡,然后同样CMD58指令不用,发送ACMD41指令,这里注意对于1.x的卡,HCS位是无效的,所以参数为0,对于ACMD41没有响应的话,就是一个MMC卡,如果对于ACMD41有响应,就判断idle_state位空闲状态是不是等于0,等于0以后这个就是1.x的标准容量的卡。
VHS位一般设置为0001b,CMD8使用的参数一般是0x1AA。
一般设置HCS位=1
ACMD41指令只有第30位有效。
这里重点关心CCS位,如果是会SDHC卡,CCS=1,如果是SDSC卡,CCS= 0。通过CCS位可以区分是SDHC还是SDSC卡。
4. 单块数据读取512字节
接收512个字节的数据。
5. SD卡多块读取流程
注意:地址的单位跟卡的类型有关,数据地址如果是SDSC卡,地址单位是字节,如果是SDHC卡,是以512字节为单位,表示读取第几个512字节,2^32=4GB,对于SDSC卡足够寻址,SDSC卡最大为2GB,对于SDHC卡,寻址范围是2^32*512=2TB,所以SDHC卡最大为2T容量。
6. SD卡单块数据块写入流程
MCU可以读取MISO上的电平,如果读到是0,表示SD卡还在编程,就不能发新的数据,知道0xff,才能发送下一批数据。
7. SD卡多块数据块写入流程
注意:在发送结束令牌0xfd后,还要多写入一个512个字节的数据,然后才能完成写入。
发送完0xfd令牌以后,还要发送一个512字节的数据,然后才结束写入。