找回密码
 立即注册
查看: 1055|回复: 0

SD卡读取笔记

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-04-22 08:32:33

9

主题

76

回帖

537

积分

高级会员

积分
537
发表于 2024-2-22 15:13:50 | 显示全部楼层 |阅读模式
本帖最后由 JimOrange 于 2024-2-24 15:10 编辑

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

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

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

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


截屏2024-02-22 16.19.37.png

比如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。


截屏2024-02-22 16.40.49.png
比如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卡,二者对扇区地址的寻址方式不同


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 03:41 , Processed in 0.106801 second(s), 47 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表