SD卡(SecureDigital MemoryCard)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被普遍地于便携式装置上使用,例如数码相机、我的数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。git
SD卡按容量分类,能够分为3类:SD卡、SDHC卡、SDXC卡,以下表所示:安全
SD卡外形和接口图以下图所示:3d
SD卡由9个引脚与外部通讯,支持SPI和SDIO两种模式,不一样模式下,SD卡引脚功能描述以下表所示:blog
①高容量,最大可达2TB(目前已有512GB的SD卡)。接口
②高安全性。开发
③高速,目前已有读取速度近100MB/S的SD卡。文档
④体积小巧,标准SD卡大小只有一张邮票大小,重量仅2g。it
⑤接口简单,支持SPI和SDIO两种访问模式。pdf
注意:TF卡+卡套,组合起来也能够当SD卡用,不过,很大一部分TF卡,不支持SPI访问模式。因此,SPI驱动SD卡的时候,尽可能选择大卡(SD卡),而不要选择TF卡。基础
SD的5个寄存器
这些寄存器的详细介绍,请参考《SD卡2.0协议.pdf》第五章
要实现SDIO驱动SD卡,最重要的步骤就是SD卡的初始化,只要SD卡初始化完成了,那么剩下的(读写操做)就简单了,因此咱们这里重点介绍SD卡的初始化。
下图参见《SD卡2.0协议.pdf》这个文档。
从SD卡初始化流程可知,无论什么卡(这里咱们将卡分为4类:SD2.0高容量卡(SDHC,最大32G),SD2.0标准容量卡(SDSC,最大2G),SD1.x卡和MMC卡),首先咱们要执行的是卡上电(设置SDIO_POWER
[1:0]=11),上电后发送CMD0,对卡进行软复位,以后发送CMD8命令,用于区分SD卡2.0,只有2.0及之后的卡才支持CMD8命令,MMC卡和V1.x的卡,是不支持该命令的。CMD8命令格式以下表:
在发送CMD8的时候,经过其带的参数咱们能够设置VHS位,以告诉SD卡,主机的供电状况,让SD卡知道主机的供电范围。
VHS位定义以下表所示:
这里咱们使用参数0X1AA,即告诉SD卡,主机供电为2.7~3.6V之间,若是SD卡支持CMD8,且支持该电压范围,则会经过CMD8的响应(R7,关于SD卡响应,请参考《SD卡2.0协议.pdf》第4.9节)将参数部分本来返回给主机,若是不支持CMD8,或者不支持这个电压范围,则不响应。
在发送CMD8后,发送ACMD41(注意:发送ACMD41以前,要先发送CMD55),来进一步确认卡的操做电压范围,并经过HCS位来告诉SD卡,主机是否是支持高容量卡(SDHC)
ACMD41命令格式以下表所示:
ACMD41指令响应(R3),包含了SD卡OCR寄存器内容,其定义以下表所示:
对于支持CMD8的卡,主机设置ACMD41的参数HCS=1,告诉SD卡,主机支持SDHC卡。
对2.0的卡,OCR的CCS位用于表示SDHC仍是SDSC;对1.x的卡,则忽略该位;
对MMC卡,则不支持ACMD41,MMC卡只须要发送:CMD0和CMD1便可完成初始化。
CMD2用于获取CID寄存器数据,CID寄存器各位定义以下表:
SD卡在收到CMD2后,将返回R2长响应(136位),其中包含128位有效数据(CID寄存器内容),存放在SDIO_RESP1~4等4个寄存器里面。经过读取这四个寄存器,就能够得到SD卡的CID信息。
CMD3,用于设置卡相对地址(RCA,必须为非0),对于SD卡(非MMC卡),在收到CMD3后,将返回一个新的RCA给主机,方便主机寻址。RCA的存在容许一个SDIO接口挂多个SD卡,经过RCA来区分主机要操做的是哪一个卡。对于MMC卡,则不是由SD卡自动返回RCA,而是主机主动设置MMC卡的RCA,即经过CMD3带参数(高16位用于RCA设置),实现RCA设置。一样MMC卡也支持一个SDIO接口挂多个MMC卡,不一样于SD卡的是全部的RCA都是由主机主动设置的,而SD卡的RCA则是SD卡发给主机的。
在得到卡RCA以后,咱们即可以发送CMD9(带RCA参数),得到SD卡的CSD寄存器内容,从CSD寄存器,咱们能够获得SD卡的容量和扇区大小等十分重要的信息。CSD寄存器咱们在这里就不详细介绍了,关于CSD寄存器的详细介绍,请你们参考《SD卡2.0协议.pdf》。
至此,咱们的SD卡初始化基本就结束了,最后经过CMD7命令,选中咱们要操做的SD卡,便可开始对SD卡的读写操做了。
SD卡单块数据块读取流程
SD卡多块数据块读取流程
CMD16指令说明
CMD17指令说明
CMD18指令说明
CMD12指令说明
SD卡单块数据块写入流程
SD卡多块数据块写入流程
CMD13指令说明
R1响应:
SD卡状态,请参考《SD卡2.0协议.pdf》第63页-Table4-35
CMD24指令说明
ACMD23指令说明
注意:发送ACMD以前,必须先发送CMD55,通知SD卡,接下来要发送的是应用命令(APPCMD),而非标准命令
CMD55指令说明
CMD25指令说明