SD卡是一种基于NAND Flash的存储卡,由于它具有安全性高、容量大、体积小、功耗低、非易失性等优点,在嵌入式系统中得到了广泛的应用。
SD卡支持两种接口模式:SD模式和SPI模式。SD模式采用4根数据线并行传输,速度快,但协议实现复杂。SPI模式以串行方式传输数据,速度性能与SD模式相比有所欠缺,但协议实现简单,操作方便。SD卡作为SPI设备,SPI通道由以下4个信号组成:CS(片选)、CLK(时钟)、DI(主机到SD卡的数据信号)和DO(卡到主机的数据信号)。片选信号CS在整个SPI操作过程中,必须保持低电平有效;CLK时钟用于同步;DI不但传输数据,还发送命令;DO除了传输数据外,还发送应答信号。本节主要介绍SD卡在SPI模式下与LPC2138的接口及应用。
图5-15所示为SD卡的引脚排列,共有9个引脚,SD模式下与SPI模式下各引脚的定义不相同。在SPI模式下,SD卡1~7引脚依次为片选引脚CS、数据输入DI、地、电源VDD、时钟信号CLK、地、数据输出DO,8脚与9脚在SPI模式下保留未用。
上电后SD卡默认工作于SD模式,切换到SPI模式的方法是,上电后保持片选信号CS为低电平并延时大于74个CLK时钟周期的时间,然后发送复位命令CMD0,复位成功(当接收到0x01的响应)后,再连续发送CMD55和ACMD41,直到接收到响应0x00为止,此时SD卡已经进入SPI模式。上述所说的CMD55和ACMD41都是SD卡特有的命令。SD卡命令由6个字节共48位组成,其格式如表5-14所列。
图5-15 SD卡引脚排列
表5-14 SD卡命令格式
应用时可以按以下顺序连续发送6个字节来实现上述SD卡命令格式。
字节1:01xxxxxx(命令号,由指令标志定义,如CMD39为00100111,即十六进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)。
字节2~5:Command Arguments(命令参数,有些命令没有参数)。
字节6:前7位为CRC(循环冗余校验位),最后一位为停止位1。
SD卡命令共分为12类,分别为Class0~Class11。不同的SD卡,主机根据其功能,支持不同的命令集。
①Class0(卡识别、初始化等基本命令集):
CMD0:复位SD卡。
CMD1:读OCR寄存器。
CMD9:读CSD寄存器。
CMD10:读CID寄存器。
CMD12:停止读多块时的数据传输。
CMD13:读Card_Status寄存器。
②Class2(读卡命令集):
CMD16:设置块的长度。(www.daowen.com)
CMD17:读单块。
CMD18:读多块,直至主机发送CMD12为止。
③Class4(写卡命令集):
CMD24:写单块。
CMD25:写多块。
CMD27:写CSD寄存器。
④Class5(擦除卡命令集):
CMD32:设置擦除块的起始地址。
CMD33:设置擦除块的终止地址。
CMD38:擦除所选择的块。
⑤Class6(写保护命令集):
CMD28:设置写保护块的地址。
CMD29:擦除写保护块的地址。
CMD30:查询SD卡写保护位的状态。
⑥Class7(卡的锁定,解锁功能命令集)。
⑦Class8(申请特定命令集)。
⑧Class10~11(保留)。
其中Class1、Class3、Class9不支持SPI模式。
SD卡的所有操作都必须由命令完成,通过向SD卡发送相关命令并读取相应的响应来实现对SD卡的控制。在对SD卡进行读写之前,先要进行初始化操作,这是确保SD卡能在SPI模式下进行正常数据读写的前提。SD卡的基本读写操作命令有:数据块读命令(CMD17)、多数据块读命令(CMD18)、数据块写命令(CMD24)、多数据块写命令(CMD25)等。需要注意的是,在发送使SD卡空闲命令(CMD0)之前,应至少等待74个CLK时钟周期,确保SD卡进入SPI模式。初始化完成之后,如果采用默认的块读写长度512B,则可以直接进行SD卡的读写;也可以采用CMD16命令来设置SD卡的块读取长度,可以是1~512B之间的任意值,但是对SD卡的写过程则要求快,长度必须为512B。无论读写操作,都要求在读写命令发出后,有1个字节的数据起始令牌FEH,数据传输结束后,有2个字节的CRC循环冗余校验编码。
完成SD卡的底层驱动之后,就可以按照FAT文件系统,对SD卡上的数据进行操作,进而在SD卡上创建文件、读写文件、删除文件等,从而实现文件的管理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。