STM32F4X SDIO(三) SD卡命令与响应

2023-10-30 10:20
文章标签 命令 sd 响应 sdio stm32f4x

本文主要是介绍STM32F4X SDIO(三) SD卡命令与响应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32F4X SDIO(三)SD卡命令与响应

  • SD卡命令
    • 命令类型
    • 通用命令与特殊命令
    • 命令的格式
    • SD卡命令列表
      • 通用命令
        • 基础命令
        • 读操作命令
        • 写操作命令
        • 写保护命令
        • 擦除命令
        • 加锁命令
        • 特定应用命令
      • 特殊命令
    • SD卡响应列表
      • 短响应
        • R1响应(正常响应命令)
        • R1b响应
        • R3响应(OCR 寄存器)
        • R6响应6(发布的 RCA 寄存器响应)
        • R7响应(卡接口条件)
      • 长响应
        • R2响应(CID,CSD 寄存器)

上一节说过SD卡的操作都是基于命令与响应,写操作有写操作的命令,读操作有读操作的命令,这节就来简单看一下SD卡都有哪些命令跟响应。

SD卡命令

命令类型

SD卡定义了4种命令类型,分别是以下几种

  • 广播命令,没有响应(bc)
  • 广播命令,有响应(bcr)
  • 寻址命令,点对点(ac)
  • 寻址数据传输命令(adtc)

通用命令与特殊命令

SD卡的命令可以分为两种使用模式,分别是通用命令特殊命令

  • 通用命令:通用是所有SD卡都可以使用的命令,没有什么特殊的使用要求,直接把命令发给SD卡即可
  • 特殊命令:SD卡制造商使用的的特定命令,在使用特殊命令前,需要先发送CMD55给SD卡,代表从CMD55开始的下一条命令为特殊命令。CMD55只对紧接着的第一条命令有效,如果CMD55的下一条命令为特殊命令,则执行其特殊功能,如果CMD55的下一条命令为通用命令,则执行通用命令。

命令的格式

在这里插入图片描述

  • 所有的命令长度都是48位
  • bit47为命令的起始位,低电平有效
  • bit46命令的传输位,高电平有效,代表从控制器到SD卡
  • bit45~bit40为命令号,代表是第几个命令
  • bit39~bit8为参数,有些命令需要参数,比如传输SD卡地址
  • bit7~bit1为命令的CRC7校验码,保证命令的准确性
  • bit0为结束位,高电平有效
  • 所有命令都是通过CMD信号线传输

SD卡命令列表

通用命令

基础命令
命令序号类型参数响应缩写描述
CMD0 bc[31:0]填充位XGO_IDLE_STATE复位所有的卡到 idle 状态
CMD1 保留
CMD2 bcr[31:0]填充位R2ALL_SEND_CID通知所有卡通过CMD线返回CID值
CMD3 bcr[31:0]填充位R6SEND_RELATIVE_ADDR通知所有卡发布新 RCA
CMD4 bc[31:16]DSR [15:0]填充位XSET_DSR编程所有卡的 DSR
CMD5 保留
CMD7 ac[31:16]RCA [15:0]填充位R1bSELECT/DESELECT_CARD选择或取消RCA卡
CMD8 bcr[31:12]保留位 [11:8]VHS [7:0]检查模式R7SEND_IF_COND发送 SD 卡接口条件,包含了主机支持 的电压信息,并询问卡是否支持。保 留位应该设置为 0
CMD9 ac[31:16]RCA [15:0]填充位R2SEND_CSD选定的卡发通过命令线送卡的CSD
CMD10 ac[31:16]RCA [15:0]填充位R2SEND_CID选定的卡发通过命令线送卡的CID
CMD11 保留
CMD12 ac[31:16]RCA [15:0]填充位R1bSTOP_TRANSMISSION强制卡停止传输
CMD13 ac[31:16]RCA [15:0]填充位R1SEND_STATUS选定的卡发送状态寄存器
CMD14 保留
CMD15 ac[31:16]RCA [15:0]填充位XGO_INACTIVE_STATE使选定的卡进入“inactive”状态
读操作命令
命令序号类型参数响应缩写描述
CMD16 ac[31:0]块长度R1SET_BLOCKLEN对于标准SD卡,设置块长度,对于高容量SD卡,块长度固定为512字节
CMD17 adtc[31:0]数据地址R1READ_SINGLE_BLOCK对于标准SD卡,这个命令读取SET_BLOCK_LEN 命令①所规定的长度的一个块。对于高容量卡来说,直接读取 512字节的块
CMD18adtc[31:0]数据地址R1READ_MULTIPLE_BLOCK连续数据块传输(从卡到主机),直到被STOP_TRANSMISSION 命令停止。块长度和 CMD17 一样
CMD19 保留
CMD20保留
CMD21 保留
CMD22 保留
CMD23 保留
写操作命令
命令序号类型参数响应缩写描述
CMD16 ac[31:0]块长度R1SET_BLOCKLEN对于标准SD卡,设置块长度,对于高容量SD卡,块长度固定为512字节
CMD24 adtc[31:0]数据地址R1WRITE_BLOCK标准卡来说,写 SET_BLOCKLEN命令定义的长度的块。高容量卡,写 512 字节长度的块,不管 SET_BLOCKEN
CMD25adtc[31:0]数据地址R1WRITE_MILTIPLE_BLOCK连 续 写 数 据 块 直 到STOP_TRANSMISSION 命令被发送。块长度和 WRITE_BLOCK 一致
CMD26 保留
CMD27adtc[31:0]填充位R1PROGRAM_CSD对 CSD 的可编程位进行编程
写保护命令
命令序号类型参数响应缩写描述
CMD28ac[31:0]数据地址R1bSET_WRITE_PROT如果卡支持写保护功能,这个命 令设置地址组中的写保护位,高容量卡不支持这个功能
CMD29 adtc[31:0]数据地址R1bCLEAR_WRITE_PROT如果卡支持写保护,这个命令清除寻址组的写保护位。高容量卡不支持这个功能
CMD30adtc[31:0]写保护数据地址R1SED_WRITE_PROT如果卡支持写保护,这个命令要求卡返回写保护位的状态。高容量卡不支持这个功能
CMD31 保留
擦除命令
命令序号类型参数响应缩写描述
CMD32ac[31:0]数据地址R1ERASE_WR_BLK_START设置要擦除的第一个块的地址
CMD33 ac[31:0]数据地址R1ERASE_WR_BLK_END设置要擦除的最后一个块的地址
CMD38ac[31:0]填充位R1bERASE擦除所有预先选定的写块
CMD39保留
CMD40保留
CMD41保留
加锁命令
命令序号类型参数响应缩写描述
CMD16 ac[31:0]块长度R1SET_BLOCKLEN对于标准SD卡,设置块长度,对于高容量SD卡,块长度固定为512字节
CMD42adct[31:0]保留全 0R1LOCK_UNLOCK用来设置/复位密码,或者加锁/解锁卡。数据块的长度是通过 SET_BLOCK_LEN 命令设置的。
CMD43~CMD49保留
CMD51保留
特定应用命令
命令序号类型参数响应缩写描述
CMD55 ac[31:16]RCA [15:0]填充位R1APP_CMD告诉卡,下个命令是特定应用命令,而不是标准 命令
CMD56adct[31:1]填充位 [0]读/写R1GEN_CMD通用命令,或者特定应用命令中,用于传输一个数据块到卡,或者卡获取一个数据块。通用卡数据块长度由SET_BLOCK_LEN命令设置。高容量卡为固定512Byte。[Bit0]1为读数据,0表示写数据到卡。
CMD58~CMD63保留

特殊命令

命令序号类型参数响应缩写描述
ACMD6ac[31:2]填充位 [1:0]总线宽度R1SET_BUS_WIDTH 定义数据总线的宽度(‘00’=1bit,‘10’=4bit)。接受的数据总线定义在 SCR 寄存器中
ACMD13adct[31:0]填充位R1SD_STATUS发送 SD 状态
ACMD17保留
ACMD18保留
ACMD19保留
ACMD21保留
ACMD22adct[31:0]填充位R1SEND_NUM_WR_BLOCK发送已经写入的块(没有错误的)的数 目。响应 32bit + CRC 数据块。如果 WRITE_BL_PARTIAL=0,ACMD22 的单位总是 512Byte。如果=1,ACMD22 的单位就是写命令使用的单块的长度
ACMD23ac[32:23]填充位 [22:0]块数R1SET_WR_BLK_ERASE_COUNT设置需要擦除的块的数目(提高速度)。 默认值=1
ACMD24保留
ACMD25保留
ACMD26保留
ACMD38保留
ACMD39保留
ACMD40保留
ACMD41bcr[31]保留位 [30]HCS(OCR30) [29:24]保留位 [23:0]Vdd 电 压 (OCR[23:0])R3SD_SEND_OP_COND发送卡的支持信息(HCS),并要求卡通 过命令线返回 OCR 寄存器内容。当卡收到 SEND_IF_COND 时,HCS 是有效的。保留位设为 0。CCS位对应OCR[30]
ACMD42ac[31:1]填充位 [0]设置卡检测R1SET_CLR_CARD_DETECT1-connect,0-discon,50k 欧姆上拉电阻,DAT3/CD
ACMD43保留
ACMD49保留
ACMD51adct[31:0]填充位R1SEND_SCR读取配置寄存器 SCR

注意:数据地址在标准卡中是以字节为单位的,而高容量卡(SDHC)中,是以块(512byte)为单位的

SD卡响应列表

SD卡的响应分为两种,分别是短响应和长响应,其中短响应长度为48bit,长响应长度为136bit,所有响应都是通过CMD信号线发送。

短响应

R1响应(正常响应命令)

在这里插入图片描述
R1响应会返回32位的卡状态。

R1b响应

在这里插入图片描述
R1b响应跟R1响应差不多,但是R1b响应在数据线上会有busy信号,主机在发送完数据后,应该检查 busy 信号。

R3响应(OCR 寄存器)

在这里插入图片描述
R3响应会返回32位的OCR寄存器

R6响应6(发布的 RCA 寄存器响应)

在这里插入图片描述
[45:40]是响应的命令号,这里就是‘000011’,即 CMD3。参数中的16 位MSB 用于产生 RCA 号。

R7响应(卡接口条件)

在这里插入图片描述
卡支持的电压信息通过 CMD8 的响应发送。Bit[19:16]表明卡支持的电压范围。卡接受提供的电压范围就返回 R7 响应。卡会在响应的参数中返回电压范围和检查模式。

长响应

R2响应(CID,CSD 寄存器)

在这里插入图片描述
R2响应会返回SD卡饿CID或者CSD寄存器的值

以上就是SD卡常用的命令和响应,当然这些命令和响应不用全部记住,只需要在使用的时候再查找就行。

这篇关于STM32F4X SDIO(三) SD卡命令与响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/307248

相关文章

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不