本帖最后由 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卡,二者对扇区地址的寻址方式不同
|