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 commands | bc | 没有 response的广播命令 |
Broadcast commands with response | bcr | 有 response的广播命令 |
Addressed(point-to-point)commands | ac | 点对点(指定地址)无数据传输 |
Addressed(point-to-point)data transfer commands | adtc | 点对点数据传输 |
注:在 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)。
命令集
SD卡的命令集总共有 12种(class 9只用于 SDIO设备,正常涉及为 11种),每种 class代表一类功能,包含相关命令。具体可以查看协议 Table 4-18。SD卡具体支持的命令集可以通过 CSD寄存器的 bit [95:84],CCC field来确定。
命令分类 | 描述 |
---|---|
class 0 | basic,基础命令,如 CMD0、CMD2、CMD3、CMD4、CMD7、CMD8、CMD9、CMD10、CMD11(UHS-I mode支持)、CMD12、CMD13、CMD15 |
class 1 | reserved,保留 |
class 2 | block read,设置块长度、读取单块、多块数据、发送 tuning数据块、设置读取块数量,如 CMD16、CMD17、CMD18、CMD19、CMD20、CMD23、 |
class 3 | reserved,保留 |
class 4 | block write,设置块长度、设置写入块数量、写取单块、多块数据、写 CSD寄存器,如 CMD16、CMD23、CMD24、CMD25、CMD27 |
class 5 | erase,设置擦除开始、结束地址、擦除操作,如 CMD32、CMD33、CMD38 |
class 6 | write protection,设置写保护、清除写保护、获取 card写保护状态,如 CMD28、CMD29、CMD30(该命令集在 SDHC和 SDXC卡都已经不支持) |
class 7 | lock card,设置需要上/解锁的块长度、card上锁、解锁,如 CMD16、CMD42 |
class 8 | Application-specific,表示下一个命令是一个特定应用命令,如 CMD55 |
class 10 | 用于 SDIO设备,CMD52-54 |
class 10 | Switch Function,功能查询、变更速度模式、驱动能力等,如 CMD6 |
class 11 | reserved,保留 |
常用命令
CMD index | type | argument | resp | abbr. | description |
---|---|---|---|---|---|
class 0 | |||||
CMD0 | bc | [31:0] 0000 0000 | none | GO_IDLE_STATE | 重置 card进入 idle状态 |
CMD2 | bcr | [31:0] stuff bits | R2 | ALL_SEND_CID | card从 CMD线发送其 CID编号给 host |
CMD3 | ac | [31:16] RCA [15:0] stuff bits | R6 | SET_RELATIVE_ADDR | 为 card分配相对地址 |
CMD8 | bcr | [31:12] reserved bits(0) [11:8] supply voltage(VHS) [7:0] check pattern | R7 | SEND_IF_COND | 发送 host支持的工作电压给 card,询问 card是否支持相关工作电压。SDSC卡无法正常响应该命令,识别流程中,用于区分 SDSC与 SDHC和SDXC卡 |
CMD9 | ac | [31:16] RCA [15:0] stuff bits | R2 | SEND_CSD | card从 CMD线发送其 CSD寄存器内容给 host |
CMD11 | ac | [31:0] reserved bits(0) | R1 | VOLTAGE_SWITCH | 切换总线信号电平到 1.8V |
CMD12 | ac | [31:0] stuff bits | R1b | STOP_TRANSMISSION | 强制 card停止传输。 |
CMD13 | ac | [31:16] RCA [15:0] stuff bits | R1 | SEND_STATUS | card发送其状态寄存器给 host。 |
CMD15 | ac | [31:16] RCA [15:0] reserved bits(0) | none | GO_INACTIVE_STATE | 使 card进入 inactive状态 |
class 2 | |||||
CMD16 | ac | [31:0] block length | R1 | SET_BLOCKLEN | 设置块读写操作的块长度,SDHC/SDXC card默认值都是 512bytes。对于 LOCK_UNLOCK命令,如果设置的长度大于 512bytes,BLOCK_LEN_ERROR bit将会置位。 |
CMD17 | adtc | [31:0] data address | R1 | READ_SINGLE_BLOCK | 读取单块数据,SDSC卡块长度取决于 CMD16,SDHC卡和 SDXC卡为 512bytes |
CMD18 | adtc | [31:0] data address | R1 | READ_MULTIPLE_BLOCK | 连续读取多块数据,直到 host发送 STOP_TRANSMISSION命令,块长度与 CMD17情况一致 |
CMD19 | adtc | [31:0] reserved bits(0) | R1 | SEND_TUNING_BLOCK | 在 tuning模式下,发送 64 bytes特定数据块,用于 SDR50和 SDR104模式最佳采样点的检测 |
CMD23 | ac | [31:0] Block Count | R1 | SET_BLOCK_COUNT | 指定 CMD18和 CMD25的传输块数量 |
class 4 | |||||
CMD16 | ac | [31:0] block length | R1 | SET_BLOCKLEN | 设置块读写操作的块长度,SDHC/SDXC card默认值都是 512bytes。对于 LOCK_UNLOCK命令,如果设置的长度大于 512bytes,BLOCK_LEN_ERROR bit将会置位。 |
CMD23 | ac | [31:0] Block Count | R1 | SET_BLOCK_COUNT | 指定 CMD18和 CMD25的传输块数量 |
CMD24 | adtc | [31:0] data address | R1 | WRITE_BLOCK | 写入单块数据,SDSC卡块长度取决于 CMD16,SDHC卡和 SDXC卡为 512bytes |
CMD25 | adtc | [31:0] data address | R1 | WRITE_MULTIPLE_BLOCK | 连续写入多块数据,直到 host发送 STOP_TRANSMISSION命令,块长度与 CMD24情况一致 |
CMD27 | adtc | [31:0] stuff bits | R1 | PROGRAM_CSD | 写 CSD寄存器 |
ACMDs | |||||
ACMD6 | ac | [31:2] stuff bits [1:0] bus width | R1 | SET_BUS_WIDTH | 定义用于数据传输的数据总线宽度,00b为 1bit,10b为 4bits,可以在 SCR寄存器确认 card允许的数据总线宽度 |
ACMD13 | adtc | [31:0] stuff bits | R2 | SD_STATUS | card向 host发送卡状态寄存器内容(SD Status) |
ACMD41 | bcr | [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]) | R3 | SD_SEND_OP_COND | host发送其支持的容量信息(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 |
ACMD42 | ac | [31:1] stuff bits [0] set_cd | R1 | SET_CLR_CARD_DETECT | 控制 card CD/DAT3管脚的 50kΩ的上拉电阻,1b为连接,0b为断开 |
ACMD51 | adtc | [31:0] stuff bits | R1 | SEND_SCR | 读取 card的 SD配置寄存器(SCR) |
class 10 | |||||
CMD6 | adtc | [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 | R1 | SWITCH_FUNC | bit [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 |
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。
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。
R3(OCR register)
R3长度为 48 bit,用于响应 ACMD41,返回 card的 OCR寄存器值。
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这几个状态。
R7(Card interface condition)
R7长度为 48bit,用于响应 CMD8。bit [19:16](voltage accepted)是返回 card支持的工作电压范围,bit [15:8] 返回 host发送的 check pattern。