JimOrange 发表于 2024-2-22 15:13:50

SD卡读取笔记

本帖最后由 JimOrange 于 2024-2-24 15:10 编辑

只从有了在论坛写学习笔记的习惯后,发觉对自己学习很有帮助,坚持下去~
///////////////////////////////////////////////////////////////////////////////////////////
SD卡驱动方法:

1. 格式:
6个字节
第一字节|第二~第五字节    |      第六字节
0 1 命令   | 参数(高位在前)|       CRC    1


比如CMD0 (命令0,复位):
01 000000          00000...0000            1001010       1
|命令   |            参数            |CRC(校验位) |
   0x40      0x00 0x00 0x00 0x00         0x95
如果单片机收到0x01,则复位成功,否则一直收到高电平,0xff;


比如CMD1 (命令1,初始化):
01 000001          00000...0000         1111111   1
|命令   |            参数         |    CRC   |
   0x41      0x00 0x00 0x00 0x00       0xff
如果单片机收到0x00,则初始化成功,否则一直收到高电平,0xff;




比如CMD24 (命令24,写扇区):
01 011000   xxxxxxxx xxxxxxxx xxxxxxx0 00000000    1111111   1
|命令   |地址(前23位有效,所以只支持4GB) |    CRC   |
   0x58               0x00 0x00 0x00 0x00                     0xff

如果单片机收到0x00,则写地址成功,否则一直收到高电平,0xff;
进接着就是写入512个字节数据,以0xFE开头,两个0xFF结尾,表示写入结束;
如果单片机收到0x00,则写SD正在写入中,需要不断检测是否完成,完成为0xff。



比如CMD17 (命令17,读扇区):
01 010001   xxxxxxxx xxxxxxxx xxxxxxx0 00000000    1111111   1
|命令   |地址(前23位有效,所以只支持4GB) |    CRC   |
   0x51               0x00 0x00 0x00 0x00                     0xff


如果单片机收到0x00,则读地址成功,否则一直收到高电平,0xff;
进接会收到数据(以512个字节数据为例),以0xFE开头,当完成512个字节读取后,两个字节的校验位需读取,读取结束;

SD卡的命令集是SD卡与主机之间通信的指令集合。SD卡命令集根据SD卡的版本和规范而有所不同,但通常可以分为几个不同的类别。以下是一些常见的SD卡命令类别和示例命令:
[*]基本命令:

[*]CMD0:复位SD卡。
[*]CMD1:读OCR(操作条件寄存器)寄存器。
[*]CMD9:读CSD(卡特定数据)寄存器。
[*]CMD10:读CID(卡识别)寄存器。
[*]CMD12:停止读多块数据。
[*]CMD13:读Card_Status(卡状态)寄存器。
[*]读命令:

[*]CMD16:设置块长度。
[*]CMD17:读单块。
[*]CMD18:读多块,直到主机发送CMD12为止。
[*]写命令:

[*]CMD24:写单块。
[*]CMD25:写多块。
[*]CMD27:写CSD寄存器。
[*]擦除命令:

[*]CMD32:设置擦除块的起始地址。
[*]CMD33-38:保留用于擦除命令。
[*]应用特定命令:

[*]CMD55:应用特定命令(ACMD)的开始。
[*]ACMD41:SD卡识别电压范围。
[*]其他ACMD命令用于特定应用或功能。

SD卡的命令格式通常由6个字节组成:
[*]Byte 1:命令索引(Command Index),指定要执行的命令。
[*]Byte 2-5:命令参数(Command Arguments),某些命令可能需要这些参数。
[*]Byte 6:循环冗余校验(CRC)校验位和停止位。
需要注意的是,不同的SD卡版本和规范可能会有不同的命令集和命令格式。因此,在实际应用中,应根据SD卡的版本和规范来正确理解和使用命令集。
对应CMD 代码
///////////////////////////////////////////////////////////////////////////////////////////

    unsigned char pCMD0[6] ={0x40,0x00,0x00,0x00,0x00,0x95}; //CMD0,将SD卡从默认上电后的SD模式切换到SPI模式,使SD卡进入IDLE状态
    unsigned char pCMD1[6] ={0x41,0x00,0x00,0x00,0x00,0x01}; //CMD1,MMC卡使用CMD1命令进行初始化
    unsigned char pCMD8[6] ={0x48,0x00,0x00,0x01,0xAA,0x87}; //CMD8,用于鉴别SD卡的版本,并可从应答得知SD卡的工作电压
    unsigned char pCMD16[6]={0x50,0x00,0x00,0x02,0x00,0x01}; //CMD16,设置扇区大小为512字节,此命令用于在初始化完成之后进行试探性的操作,如果操作成功,说明初始化确实成功
    unsigned char pCMD55[6]={0x77,0x00,0x00,0x00,0x00,0x01}; //CMD55,用于告知SD卡后面是ACMD,即应用层命令 CMD55+ACMD41配合使用,MMC卡使用CMD1来进行初始化,而SD卡则使用CMD55+ACMD41来进行初始化
    unsigned char pACMD41H[6]={0x69,0x40,0x00,0x00,0x00,0x01}; //ACMD41,此命令用于检测SD卡是否初始化完成,MMC卡,不适用此命令,针对2.0的SD卡
    unsigned char pACMD41S[6]={0x69,0x00,0x00,0x00,0x00,0x01}; //ACMD41,此命令用于检测SD卡是否初始化完成,MMC卡,不适用此命令,针对1.0的SD卡
    unsigned char pCMD58[6]={0x7A,0x00,0x00,0x00,0x00,0x01}; //CMD58,用于鉴别SD2.0到底是SDHC,还是普通的SD卡,二者对扇区地址的寻址方式不同


页: [1]
查看完整版本: SD卡读取笔记