SD卡的控制方法与时序

时间:2024-03-30 07:38:22

1

  1.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


   2.SD卡的命令

  SD卡命令共分为12类,分别为class0到class11,

不同的SDd卡,主控根据其功能,支持不同的命令集 如下:

Class0 :(卡的识别、初始化等基本命令集)

CMD0:复位SD 卡.

CMD1:读OCR寄存器.

CMD9:读CSD寄存器.

CMD10:读CID寄存器.

CMD12:停止读多块时的数据传输

CMD13:读 Card_Status 寄存器

Class2 (读卡命令集):

CMD16:设置块的长度

CMD17:读单块.

CMD18:读多块,直至主机发送CMD12为止 .

Class4(写卡命令集) :

CMD24:写单块.

CMD25:写多块.

CMD27:写CSD寄存器 .

Class5 (擦除卡命令集):

CMD32:设置擦除块的起始地址.

CMD33:设置擦除块的终止地址.

CMD38: 擦除所选择的块.

Class6(写保护命令集):

CMD28:设置写保护块的地址.

CMD29:擦除写保护块的地址.

CMD30: Ask the card for the status of the write protection bits

class7:卡的锁定,解锁功能命令集

class8:申请特定命令集 。

class10 -11 :保留

其中 class1,    class3,class9:SPI模式不支持

了解了指令的形式和具体的控制内容,下面主要解决的就是MCU与SD卡的通信问题,通信主要需要注意下面的问题:

   (1)供电电压:必须是3.3V

   (2) 通信模式的切换:SD卡有两种通信模式:SPI模式和SD模式,默认情况下的通信模式是SD模式,但是我们常用的模式是SPI模式,这就需要一个切换模式的方法,具体的实现方法在其他地方也都有介绍,其关键的地方就是先上电延时大于74个时钟周期后发送复位命令,复位成功(接收到0x01的响应)后,连续发送CMD55和ACMD41,直到响应0X00为止,此时SD卡已经进入SPI模式。

  (3)上面所说的发送复位命令(CMD0)以及CMD55和ACMD41要有具体的实现方法,需要解决的就是时序问题,


2

    

    下图就为复位的时序图,只要能够按照下图的时序进行操作,肯定能够复位成功.

    SD卡的复位和初始化


SD卡的控制方法与时序

   

  当 SD 卡完成上电后,主机FPGA先对从机SD卡发送74 个以上的同步时钟(且保持拉高CS和(CMD)IN),然拉低CS,然后向SD 卡发送第1字节的命令字CMD0 命令(因命令号的最高位始终为0,次高位为1,因此发送给SD 卡的命令是0 与0x40 进行或运算的结果)。命令字的第2、3、4、5 字节皆为0x00。命令字的第6 字节为CRC 校验字节,固定为0x95。


  主机FPGA命令字发送完成后,发送若干个8 位的同步时钟(即FPGA等待),直至FPGA接收到SD 卡发出响应字节0x01。接收完SD 卡的响应字节后,主机FPGA把CS 线拉高,再发送8 个空时钟,复位过程完成。

SD卡的控制方法与时序


 当 SD卡执行完复位过程后,主机FPGA接着向从机SD卡发送初始化指令CMD1,以**SD 卡SPI 方式。


    首先发送指令号CMD1(0x01|0x40=0x41),然后发送4 个0x00 字节,最后发送CRC 校验码,此处为0xFF,原因是此时SD卡已经工作在SPI 模式,在SPI 模式下,SD卡默认为不进行CRC 校验,因此我们可以随意写入一个0xFF字节以填充满整个命令字的结构。


     当主机FPGA向SD卡发送完CMD1 指令后,发送若干个8 位的同步时钟(即FPGA等待),直至FPGA接收SD卡发出响应字节0x00。接收完SD卡的响应字节后,FPGA拉高CS线,再发送8个空时钟,初始化过程完成。


     至此,完成了SD卡的复位、初始化而进入到SPI方式的所有步骤。


3


  五、SD卡的SPI方式读写

   SD卡读写一次的数据量必须为512 字节的整数倍,亦即,对SD卡读写操作的最少数据量为512 字节。我们也可以通过向SD 卡写修改扇区大小的指令CMD16(CMD16—为接下来的块操作指令设置块长度)以使每次读写的数据量变为(n×512)字节(n≥1),本文中我们使用SD卡默认的一次操作512 字节的模式对SD 卡进行读写操作。


SD卡的控制方法与时序

 对SD卡读操作的时序为:

(1) 写入读单数据块命令CMD17(0x11|0x40=0x51)。

(2) 写4 个地址参数,4 个字节凑成一个32 位的地址值,第一个字节是32 位地址值的最高8 位数据,第4 个字节          是32 位地址值的最低8 位数据。(与写操作不同)

(3) 写CRC 校验位0xFF。

(4) 写若干个0xFF 的空操作。

(5) SD 卡发送0x00 响应。

(6) 写若干个0xFF 的空操作(等待)。

(7) SD 卡发送0x FE 数据头。

(8) SD 卡发送指令指定地址的512 字节数据块。

(9) SD 卡发送两字节的CRC 校验码,由于SPI 模式默认不需要CRC 校验,因此这两个字节的数据可丢弃不用。

(10)拉高CS,发送8 个空时钟。

 至此,完成了对SD卡指定地址数据块的读操作。


SD卡的控制方法与时序


 对SD卡写操作的时序为:

(1) 写入读单数据块命令CMD24(0x18|0x40=0x58)。

(2) 写4 个地址参数,4 个字节凑成一个32 位的地址值,第一个字节是32 位地址值的最低8 位数据,第4 个字节          是32 位地址值的最高8位数据。(与读操作不同)

(3) 写CRC 校验位0xFF。

(4) 写若干个0xFF 的空操作。

(5) SD 卡发送0x00 响应。

(6) 写若干个0xFF 的空操作。

(7) 写0x FE 数据头,表示接下来要发送512 字节的数据块。

(8) 写512 字节数据块。

(9) 写两字节的0xFF 作为CRC 校验码的填充字节。

(10)SD 卡发送xxx00101B 响应码。

(11)在SD 卡将512 字节数据向指定地址写完之前,其数据输出断时钟被拉低。

(12)SD 卡释放数据输出线DataOut。

(13)拉高CS,发送8 个空时钟。

 至此,完成了对SD 卡指定地址数据块的写操作。