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的下一条命令为通用命令,则执行通用命令。

命令的格式

STM32F4X SDIO(三) SD卡命令与响应_第1张图片

  • 所有的命令长度都是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响应(正常响应命令)

STM32F4X SDIO(三) SD卡命令与响应_第2张图片
R1响应会返回32位的卡状态。

R1b响应

STM32F4X SDIO(三) SD卡命令与响应_第3张图片
R1b响应跟R1响应差不多,但是R1b响应在数据线上会有busy信号,主机在发送完数据后,应该检查 busy 信号。

R3响应(OCR 寄存器)

STM32F4X SDIO(三) SD卡命令与响应_第4张图片
R3响应会返回32位的OCR寄存器

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

STM32F4X SDIO(三) SD卡命令与响应_第5张图片
[45:40]是响应的命令号,这里就是‘000011’,即 CMD3。参数中的16 位MSB 用于产生 RCA 号。

R7响应(卡接口条件)

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

长响应

R2响应(CID,CSD 寄存器)

STM32F4X SDIO(三) SD卡命令与响应_第6张图片
R2响应会返回SD卡饿CID或者CSD寄存器的值

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

你可能感兴趣的:(STM32学习,stm32,嵌入式硬件,单片机)