SD卡命令简介

SD卡命令在网上可以看到很多资料,本文仅为笔记用途。平时使用场景都是基于 SD3.0的版本,虽然现在 Physical Layer Simplified Specification已经发展到 8.0版本,但这里基于 3.01版本进行介绍。具体协议可以查看 Physical Layer Simplified Specification 3.01的 4.7 Commands、4.8 Card State Transition Table、4.9 Responses。

命令类型

类型缩写描述
Broadcast commandsbc没有 response的广播命令
Broadcast commands with responsebcr有 response的广播命令
Addressed(point-to-point)commandsac点对点(指定地址)无数据传输
Addressed(point-to-point)data transfer commandsadtc点对点数据传输

注:在 SPI mode下可以通过 CS管脚去选择具体的卡进行通信。个人理解,SPI mode下 CMD、DAT、CLK线复用,在识别过程和数据传输阶段才使得广播和点对点命令区分有意义。不过我没接触过 SPI mode的 SD卡,不确定是否有该场景存在。在 SD mode,当前大多数 SD控制器都不支持挂载多个 card,SD Card Association也不建议,感觉广播和点对点命令的区分没啥意义。

命令格式

命令长度为 48 bits,结构如下图。软件主要配置 Transmission Bit(读/写),Command Index(命令序号),Argument(命令参数),其余由逻辑处理。与 eMMC的完全一致(mmc的控制器 IP一般都是 eMMC/SD/SDIO复用的,例如 synopsys的 dwc_mshc)。

CMD_format

命令集

SD卡的命令集总共有 12种(class 9只用于 SDIO设备,正常涉及为 11种),每种 class代表一类功能,包含相关命令。具体可以查看协议 Table 4-18。SD卡具体支持的命令集可以通过 CSD寄存器的 bit [95:84],CCC field来确定。

命令分类描述
class 0basic,基础命令,如 CMD0、CMD2、CMD3、CMD4、CMD7、CMD8、CMD9、CMD10、CMD11(UHS-I mode支持)、CMD12、CMD13、CMD15
class 1reserved,保留
class 2block read,设置块长度、读取单块、多块数据、发送 tuning数据块、设置读取块数量,如 CMD16、CMD17、CMD18、CMD19、CMD20、CMD23、
class 3reserved,保留
class 4block write,设置块长度、设置写入块数量、写取单块、多块数据、写 CSD寄存器,如 CMD16、CMD23、CMD24、CMD25、CMD27
class 5erase,设置擦除开始、结束地址、擦除操作,如 CMD32、CMD33、CMD38
class 6write protection,设置写保护、清除写保护、获取 card写保护状态,如 CMD28、CMD29、CMD30(该命令集在 SDHC和 SDXC卡都已经不支持)
class 7lock card,设置需要上/解锁的块长度、card上锁、解锁,如 CMD16、CMD42
class 8Application-specific,表示下一个命令是一个特定应用命令,如 CMD55
class 10用于 SDIO设备,CMD52-54
class 10Switch Function,功能查询、变更速度模式、驱动能力等,如 CMD6
class 11reserved,保留

常用命令

CMD indextypeargumentrespabbr.description
class 0
CMD0bc[31:0] 0000 0000noneGO_IDLE_STATE重置 card进入 idle状态
CMD2bcr[31:0] stuff bitsR2ALL_SEND_CIDcard从 CMD线发送其 CID编号给 host
CMD3ac[31:16] RCA
[15:0] stuff bits
R6SET_RELATIVE_ADDR为 card分配相对地址
CMD8bcr[31:12] reserved bits(0)
[11:8] supply voltage(VHS)
[7:0] check pattern
R7SEND_IF_COND发送 host支持的工作电压给 card,询问 card是否支持相关工作电压。SDSC卡无法正常响应该命令,识别流程中,用于区分 SDSC与 SDHC和SDXC卡
CMD9ac[31:16] RCA
[15:0] stuff bits
R2SEND_CSDcard从 CMD线发送其 CSD寄存器内容给 host
CMD11ac[31:0] reserved bits(0)R1VOLTAGE_SWITCH切换总线信号电平到 1.8V
CMD12ac[31:0] stuff bitsR1bSTOP_TRANSMISSION强制 card停止传输。
CMD13ac[31:16] RCA
[15:0] stuff bits
R1SEND_STATUScard发送其状态寄存器给 host。
CMD15ac[31:16] RCA
[15:0] reserved bits(0)
noneGO_INACTIVE_STATE使 card进入 inactive状态
class 2
CMD16ac[31:0] block lengthR1SET_BLOCKLEN设置块读写操作的块长度,SDHC/SDXC card默认值都是 512bytes。对于 LOCK_UNLOCK命令,如果设置的长度大于 512bytes,BLOCK_LEN_ERROR bit将会置位。
CMD17adtc[31:0] data addressR1READ_SINGLE_BLOCK读取单块数据,SDSC卡块长度取决于 CMD16,SDHC卡和 SDXC卡为 512bytes
CMD18adtc[31:0] data addressR1READ_MULTIPLE_BLOCK连续读取多块数据,直到 host发送 STOP_TRANSMISSION命令,块长度与 CMD17情况一致
CMD19adtc[31:0] reserved bits(0)R1SEND_TUNING_BLOCK在 tuning模式下,发送 64 bytes特定数据块,用于 SDR50和 SDR104模式最佳采样点的检测
CMD23ac[31:0] Block CountR1SET_BLOCK_COUNT指定 CMD18和 CMD25的传输块数量
class 4
CMD16ac[31:0] block lengthR1SET_BLOCKLEN设置块读写操作的块长度,SDHC/SDXC card默认值都是 512bytes。对于 LOCK_UNLOCK命令,如果设置的长度大于 512bytes,BLOCK_LEN_ERROR bit将会置位。
CMD23ac[31:0] Block CountR1SET_BLOCK_COUNT指定 CMD18和 CMD25的传输块数量
CMD24adtc[31:0] data addressR1WRITE_BLOCK写入单块数据,SDSC卡块长度取决于 CMD16,SDHC卡和 SDXC卡为 512bytes
CMD25adtc[31:0] data addressR1WRITE_MULTIPLE_BLOCK连续写入多块数据,直到 host发送 STOP_TRANSMISSION命令,块长度与 CMD24情况一致
CMD27adtc[31:0] stuff bitsR1PROGRAM_CSD写 CSD寄存器
ACMDs
ACMD6ac[31:2] stuff bits
[1:0] bus width
R1SET_BUS_WIDTH定义用于数据传输的数据总线宽度,00b为 1bit,10b为 4bits,可以在 SCR寄存器确认 card允许的数据总线宽度
ACMD13adtc[31:0] stuff bitsR2SD_STATUScard向 host发送卡状态寄存器内容(SD Status)
ACMD41bcr[31] reserved bit
[30] HSC(OCR[30])
[29] reserved for eSD
[28] XPC
[27:25] reserved bits
[24] S18R
[23:0] VDD Voltage Window(OCR[23:0])
R3SD_SEND_OP_CONDhost发送其支持的容量信息(bit[30] HSC)给 card,并且 card将在 CMD线返回其 OCR寄存器内容。HSC需要在 card已经接收过 CMD8才有效。
bit [28] XPC 用于控制 SDXC卡在默认速度模式下的最大电流,XPC=0,表示最大电流为 100mA,不支持速度等级,XPC=1,表示最大电流为 150mA,支持速度等级。
bit [24] S18R为 1时,用于请求将信号切换到 1.8V。
bit [23:0] 提供给 card检查其工作电压是否匹配,不匹配则进入 Inactive state
ACMD42ac[31:1] stuff bits
[0] set_cd
R1SET_CLR_CARD_DETECT控制 card CD/DAT3管脚的 50kΩ的上拉电阻,1b为连接,0b为断开
ACMD51adtc[31:0] stuff bitsR1SEND_SCR读取 card的 SD配置寄存器(SCR)
class 10
CMD6adtc[31] Mode
0 : Check function
1 : Switch function
[30:24] reserved (0)
[23:20] reserved for function group 6 (0h or Fh)
[19:16] reserved for function group 5 (0h or Fh)
[15:12] function group 4 for current limit
[11:8] function group 3 for drive strength
[7:4] function group 2 for command system
[3:0] function group 1 for access mode
R1SWITCH_FUNCbit [31] 0b为功能检查,1b为功能切换
bit [15:12] 切换 UHS-I mode下主机提供的最大电流
bit [11:8] 切换 UHS-I mode下主机的驱动能力
bit [7:4] 切换到特定命令系统,实现特殊功能如
bit [3:0] SD总线速度模式选择
具体可以查看图 ‘Available Functions’
CMD6详细信息可以查看 4.3.10 Switch Function Command

Available Functions

Responses

Response总共有 6种类型,分别是 R1,R1b,R2,R3,R6,R7。所有的 responses都是从 CMD线返回的,其长度和格式与类型相关,但都是以 0为起始位,1为结束位,传输方向位紧接着起始位,0表示 card到 host。除 R3类型外,所有的 responses都受到 CRC7保护。

R1(normal response command)

一般命令都是响应 R1,长度为 48 bit。bit [45:40] 描述响应的命令,bit [39:8] 描述 card的状态,详细状态可以查看 4.10 Two Status Information of SD Memory Card。

R1

R1b

R1b与 R1格式上完全一样,只是会在数据线 DAT0 传输 busy信号,card接受到部分命令会变得忙碌,例如 CMD12,忙碌时 DAT0会被 card拉低。

R2(CID,CSD register)

R2长度为 136 bit,用于响应 CMD2和 CMD10,返回 CID寄存器的值,以及响应 CMD9,返回 CSD寄存器的值。CID和 CSD的 bit [0]会被结束位替代,即实际传输 bit [127:1],不过它们两个的 bit [0]也没有使用上,默认为 1。

R2

R3(OCR register)

R3长度为 48 bit,用于响应 ACMD41,返回 card的 OCR寄存器值。

R3

R6(Published RCA response)

R6长度为 48 bit,用于响应 CMD3。bit [45:40] 默认为 ‘000011b’,bit [39:24] 是给 card设置的 RCA,bit [23:8] 表示 card的状态,具体查看 Table 4-36 Card Status,包括 bit 23,22,19,12:0这几个状态。

R6

R7(Card interface condition)

R7长度为 48bit,用于响应 CMD8。bit [19:16](voltage accepted)是返回 card支持的工作电压范围,bit [15:8] 返回 host发送的 check pattern。

R7

Voltage Accepted


SD卡命令简介
http://xxxdk.xyz/xxx/2021/01/SD卡命令简介/
作者
sni
发布于
2021年1月26日
许可协议