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

SD卡读取笔记

[复制链接]
  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 50 天

    [LV.5]常住居民I

    8

    主题

    74

    回帖

    408

    积分

    中级会员

    积分
    408
    发表于 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, 2024-5-4 15:15 , Processed in 0.054314 second(s), 31 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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