本文主要是介绍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]填充位 | X | GO_IDLE_STATE | 复位所有的卡到 idle 状态 |
CMD1 | 保留 | ||||
CMD2 | bcr | [31:0]填充位 | R2 | ALL_SEND_CID | 通知所有卡通过CMD线返回CID值 |
CMD3 | bcr | [31:0]填充位 | R6 | SEND_RELATIVE_ADDR | 通知所有卡发布新 RCA |
CMD4 | bc | [31:16]DSR [15:0]填充位 | X | SET_DSR | 编程所有卡的 DSR |
CMD5 | 保留 | ||||
CMD7 | ac | [31:16]RCA [15:0]填充位 | R1b | SELECT/DESELECT_CARD | 选择或取消RCA卡 |
CMD8 | bcr | [31:12]保留位 [11:8]VHS [7:0]检查模式 | R7 | SEND_IF_COND | 发送 SD 卡接口条件,包含了主机支持 的电压信息,并询问卡是否支持。保 留位应该设置为 0 |
CMD9 | ac | [31:16]RCA [15:0]填充位 | R2 | SEND_CSD | 选定的卡发通过命令线送卡的CSD |
CMD10 | ac | [31:16]RCA [15:0]填充位 | R2 | SEND_CID | 选定的卡发通过命令线送卡的CID |
CMD11 | 保留 | ||||
CMD12 | ac | [31:16]RCA [15:0]填充位 | R1b | STOP_TRANSMISSION | 强制卡停止传输 |
CMD13 | ac | [31:16]RCA [15:0]填充位 | R1 | SEND_STATUS | 选定的卡发送状态寄存器 |
CMD14 | 保留 | ||||
CMD15 | ac | [31:16]RCA [15:0]填充位 | X | GO_INACTIVE_STATE | 使选定的卡进入“inactive”状态 |
读操作命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCKLEN | 对于标准SD卡,设置块长度,对于高容量SD卡,块长度固定为512字节 |
CMD17 | adtc | [31:0]数据地址 | R1 | READ_SINGLE_BLOCK | 对于标准SD卡,这个命令读取SET_BLOCK_LEN 命令①所规定的长度的一个块。对于高容量卡来说,直接读取 512字节的块 |
CMD18 | adtc | [31:0]数据地址 | R1 | READ_MULTIPLE_BLOCK | 连续数据块传输(从卡到主机),直到被STOP_TRANSMISSION 命令停止。块长度和 CMD17 一样 |
CMD19 | 保留 | ||||
CMD20 | 保留 | ||||
CMD21 | 保留 | ||||
CMD22 | 保留 | ||||
CMD23 | 保留 | ||||
写操作命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCKLEN | 对于标准SD卡,设置块长度,对于高容量SD卡,块长度固定为512字节 |
CMD24 | adtc | [31:0]数据地址 | R1 | WRITE_BLOCK | 标准卡来说,写 SET_BLOCKLEN命令定义的长度的块。高容量卡,写 512 字节长度的块,不管 SET_BLOCKEN |
CMD25 | adtc | [31:0]数据地址 | R1 | WRITE_MILTIPLE_BLOCK | 连 续 写 数 据 块 直 到STOP_TRANSMISSION 命令被发送。块长度和 WRITE_BLOCK 一致 |
CMD26 | 保留 | ||||
CMD27 | adtc | [31:0]填充位 | R1 | PROGRAM_CSD | 对 CSD 的可编程位进行编程 |
写保护命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD28 | ac | [31:0]数据地址 | R1b | SET_WRITE_PROT | 如果卡支持写保护功能,这个命 令设置地址组中的写保护位,高容量卡不支持这个功能 |
CMD29 | adtc | [31:0]数据地址 | R1b | CLEAR_WRITE_PROT | 如果卡支持写保护,这个命令清除寻址组的写保护位。高容量卡不支持这个功能 |
CMD30 | adtc | [31:0]写保护数据地址 | R1 | SED_WRITE_PROT | 如果卡支持写保护,这个命令要求卡返回写保护位的状态。高容量卡不支持这个功能 |
CMD31 | 保留 | ||||
擦除命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD32 | ac | [31:0]数据地址 | R1 | ERASE_WR_BLK_START | 设置要擦除的第一个块的地址 |
CMD33 | ac | [31:0]数据地址 | R1 | ERASE_WR_BLK_END | 设置要擦除的最后一个块的地址 |
CMD38 | ac | [31:0]填充位 | R1b | ERASE | 擦除所有预先选定的写块 |
CMD39 | 保留 | ||||
CMD40 | 保留 | ||||
CMD41 | 保留 | ||||
加锁命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCKLEN | 对于标准SD卡,设置块长度,对于高容量SD卡,块长度固定为512字节 |
CMD42 | adct | [31:0]保留全 0 | R1 | LOCK_UNLOCK | 用来设置/复位密码,或者加锁/解锁卡。数据块的长度是通过 SET_BLOCK_LEN 命令设置的。 |
CMD43~CMD49 | 保留 | ||||
CMD51 | 保留 | ||||
特定应用命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD55 | ac | [31:16]RCA [15:0]填充位 | R1 | APP_CMD | 告诉卡,下个命令是特定应用命令,而不是标准 命令 |
CMD56 | adct | [31:1]填充位 [0]读/写 | R1 | GEN_CMD | 通用命令,或者特定应用命令中,用于传输一个数据块到卡,或者卡获取一个数据块。通用卡数据块长度由SET_BLOCK_LEN命令设置。高容量卡为固定512Byte。[Bit0]1为读数据,0表示写数据到卡。 |
CMD58~CMD63 | 保留 | ||||
特殊命令
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
---|---|---|---|---|---|
ACMD6 | ac | [31:2]填充位 [1:0]总线宽度 | R1 | SET_BUS_WIDTH | 定义数据总线的宽度(‘00’=1bit,‘10’=4bit)。接受的数据总线定义在 SCR 寄存器中 |
ACMD13 | adct | [31:0]填充位 | R1 | SD_STATUS | 发送 SD 状态 |
ACMD17 | 保留 | ||||
ACMD18 | 保留 | ||||
ACMD19 | 保留 | ||||
ACMD21 | 保留 | ||||
ACMD22 | adct | [31:0]填充位 | R1 | SEND_NUM_WR_BLOCK | 发送已经写入的块(没有错误的)的数 目。响应 32bit + CRC 数据块。如果 WRITE_BL_PARTIAL=0,ACMD22 的单位总是 512Byte。如果=1,ACMD22 的单位就是写命令使用的单块的长度 |
ACMD23 | ac | [32:23]填充位 [22:0]块数 | R1 | SET_WR_BLK_ERASE_COUNT | 设置需要擦除的块的数目(提高速度)。 默认值=1 |
ACMD24 | 保留 | ||||
ACMD25 | 保留 | ||||
ACMD26 | 保留 | ||||
ACMD38 | 保留 | ||||
ACMD39 | 保留 | ||||
ACMD40 | 保留 | ||||
ACMD41 | bcr | [31]保留位 [30]HCS(OCR30) [29:24]保留位 [23:0]Vdd 电 压 (OCR[23:0]) | R3 | SD_SEND_OP_COND | 发送卡的支持信息(HCS),并要求卡通 过命令线返回 OCR 寄存器内容。当卡收到 SEND_IF_COND 时,HCS 是有效的。保留位设为 0。CCS位对应OCR[30] |
ACMD42 | ac | [31:1]填充位 [0]设置卡检测 | R1 | SET_CLR_CARD_DETECT | 1-connect,0-discon,50k 欧姆上拉电阻,DAT3/CD |
ACMD43 | 保留 | ||||
ACMD49 | 保留 | ||||
ACMD51 | adct | [31:0]填充位 | R1 | SEND_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卡命令与响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!