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


上一节说过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卡常用的命令和响应,当然这些命令和响应不用全部记住,只需要在使用的时候再查找就行。

STM32F4基于SDIO总线的读写SD卡需要使用FATFS文件系统。要实现这个功能,首先需要配置STM32F4的SDIO接口以及相应的GPIO引脚。接下来,我们可以按照以下步骤进行读写SD卡: 1. 初始化SDIO接口:初始化SDIO控制器,并设置时钟和数据传输属性。 2. 初始化GPIO引脚:配置SDIO通信需要使用的GPIO引脚,包括CMD线、CLK线、以及数据线(D0-D3)。 3. 初始化SD卡:使用SDIO发送SD卡初始化命令,以便与SD卡进行通信。这个过程包括等待SD卡响应、发送上电命令、以及读取SD卡的OCR(操作条件寄存器)。 4. 检查SD卡状态:通过发送CMD13命令,读取SD卡状态信息。这个过程可以确保SD卡正常工作并准备好读取或写入数据。 5. 挂载文件系统:使用FATFS库中的函数,将SD卡上的文件系统挂载到指定的逻辑驱动器。 6. 打开文件:使用FATFS库中的函数,打开指定的文件。 7. 读取或写入数据:使用FATFS库中的函数,读取或写入数据到SD卡上的文件。 8. 关闭文件:使用FATFS库中的函数,关闭文件。 9. 卸载文件系统:使用FATFS库中的函数,卸载SD卡上的文件系统。 需要注意的是,在进行读写操作时,需要确保SD卡已经插入并且正确连接到SDIO接口上。此外,还需要根据SD卡的规格以及相应的存储格式,进行适当的读写操作。 以上就是基于SDIO总线的读写SD卡的基本步骤。通过使用FATFS库,我们可以很方便地实现对SD卡的读写操作,以便进行数据存储和读取。希望这个回答能够对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值