命令类型
Host发送给SD卡的命令分为两大类共计四个小类。
命令格式
所有的命令有固定48Bit编码长度,需要传输时间1.92us@25MHz和0.96us@50MHz
比特位 | 47 | 46 | [45:40] | [39:8] | [7:1] | 0 |
位宽 | 1 | 1 | 6 | 32 | 7 | 1 |
值 | 0 | 1 | X | X | X | 1 |
描述 | 开始位 | 传输端位 | 命令索引 | 参数位 | CRC位 | 结束位 |
一个命令总是开始于起始位(总为0),跟随用于指示传输方向的Bit(Host=1)。下面6Bit是命令索引,这个值被解释为一个二进制编码数字(在0到63)。一些命令需要一个参数(例如,地址),它由32Bit编码。上表中的‘X’值表示这个变量值取决于命令。左右命令用一个CRC保护。每个命令编码字由一个结束位终止(总为1)
响应类型
所有的响应是通过CMD信号线发送。响应传输总是开始于响应编码字对应的Bit串的左Bit。编码字长度取决于响应类型。
响应总是开始于一个起始位(总为0),跟随用于指示传输方向的Bit(卡=0)。下表中‘X’表示的值是一个变量输入。除了类型R3(R3的CRC全部为1)外,所有的响应都用CRC保护。每一个响应编码字用结束位来结束(总为1)。
SD卡有5个类型的响应。SDIO卡支持另外名叫R4和R5的响应类型(对应于SDIO命令CMD5和CMD52)。
响应的格式定义如下:
R1(正常响应命令)
编码长度是48Bit。Bit45:40表示要响应的命令索引,此值用二进制编码数值解释(在0到63之间)。卡的状态用32Bit编码。注意,如果涉及有向卡传输数据,那么在每块数据传输后,Data信号线上可能出现Busy信号。
比特位 | 47 | 46 | [45:40] | [39:8] | [7:1] | 0 |
位宽 | 1 | 1 | 6 | 32 | 7 | 1 |
值 | 0 | 0 | X | X | X | 1 |
描述 | 开始位 | 传输端位 | 命令索引 | 参数位 | CRC位 | 结束位 |
R1b
R1b相同于R1,带有一个可选Busy信号在数据线上(DAT0)。基于先于接受命令之前的状态,卡可能在接受这些命令后变成Busy。Host应该Check响应的Busy。
R2(CID,CSD寄存器)
编码长度是136Bit。CID寄存器的内容作为命令CMD2和CMD10的响应发送。CSD寄存器的内容作为CMD9的响应发送。只有CID和CSD的[127-1]Bit传输,这两个寄存器的保留Bit[0]用响应的结束位代替。
比特位 | 135 | 134 | [133:128] | [127:1] | 0 |
位宽 | 1 | 1 | 6 | 127 | 1 |
值 | 0 | 0 | 111111 | X | 1 |
描述 | 开始位 | 传输端位 | 保留 | CID或CSD寄存器内容 CRC位 | 结束位 |
R3(OCR寄存器)
编码长度是48Bit。OCR寄存器的内容作为ACMD41的响应发送。
47 | 46 | [45:40] | [39:8] | [7:1] | 0 | |
位宽 | 1 | 1 | 6 | 32 | 7 | 1 |
值 | 0 | 0 | 111111 | X | 1111111 | 1 |
描述 | 开始位 | 传输端位 | 保留 | OCR寄存器 | 保留 | 结束位 |
R6(发布RCA响应)
编码长度是48Bit。Bit45:40表示要响应的命令索引——一般为‘000011’(结合状态位的Bit5,表示=CMD3)。参数域的高16MSB用于发布RCA数据。
47 | 46 | [45:40] | [39:8] | [7:1] | 0 | ||
1 | 1 | 6 | 16 | 16 | 7 | 1 | |
值 | 0 | 0 | X | X | X | X | 1 |
描述 | 开始位 | 传输端位 | 命令索引 | RCA地址 | 卡片状态[[1]] | CRC | 结束位 |
R7(卡接口条件)
编码长度是48Bit。通过CMD8的响应发送卡支持的电压信息。Bit19-16用于表示卡支持的电压范围。接受供电电压的卡返回R7响应。在响应中,卡返回命令参数的电压范围和Check方案。
比特位 | 47 | 46 | [45:40] | [39:20] | [19:16] | [15:8] | [7:1] | 0 |
位宽 | 1 | 1 | 6 | 20 | 4 | 8 | 7 | 1 |
值 | 0 | 0 | 001000 | 00000h | X | X | X | 1 |
描述 | 开始位 | 传输端位 | 命令索引 | 保留 | 电压支持 | 回显[[2]] | CRC | 结束位 |
命令类别
SD卡命令集共分为11类(Class0~Class11),每张SD卡支持命令不尽相同,但在其中Class 0 2 4 5 8 是每张SD卡强制支持的。对于SDHC和SDXC卡而言,Class 7除CMD40命令外,也是强制支持的。其他集合是可选的。支持卡命令类别(CCC)作为参数编在SCD寄存器中,以提供给Host如果访问卡的信息。
以下按Class类别分别介绍CMD命令(转下页):
CMD索引 | 命令类型 | 携带参数 | 返回类型 | 简写 | 命令描述 |
基础命令(Class 0) | |||||
CMD0 | bc | [31:0]填充位 | - | 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]填充位 | - | SET_DSR | 编程所有卡的DSR |
CMD5 | 保留给I/O卡使用(参阅SDIO规范) | ||||
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卡接口条件、支持电压信息,询问卡是否支持 |
CMD9 | ac | [31:16]RCA [15:0]填充位 | R2 | SEND_CSD | 选定卡通过CMD线发送CSD内容 |
CMD10 | ac | [31:16]RCA [15:0]填充位 | R2 | SEND_CID | 选定卡通过CMD线发送CSD内容 |
CMD11 | ac | [31:0]保留位(全0) | R1 | VOLTAGE_SWITCH | 切换至1.8V电压总线模式 |
CMD12 | ac | [31:0]填充位 | R1b | TRANSMISSION | 强制卡停止传输 |
CMD13 | ac | [31:16]RCA [15:0]填充位 | R1 | SEND_STATUS | 选定卡通过CMD线发送状态寄存器内容 |
CMD14 | 保留 | ||||
CMD15 | ac | [31:16]RCA [15:0]填充位 | - | GO_INACTIVE_STATE | 选定卡进入“inactive” 状态 |
面向块的读取命令(Class 2) | |||||
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCKLEN | 对于标准SD卡,设置块长度。 对于SDHC,设置该值无效,固定为512 |
CMD17 | adtc | [31:0]数据地址[[3]] | R1 | READ_SINGLE_BLOCK | 对于标准卡,读取其单块长度。 对于SDHC,固定返回512字节 |
CMD18 | adtc | [31:0]数据地址[3] | R1 | READ_MULTIPLE_BLOCK | 连续读取SD卡数据块,直至被CMD12中断,块长度同CMD17 |
CMD19 | adtc | [31:0]保留位(全0) | R1 | SEND_TUNING_PATTERN | 为SDR50和SDR104发送64位协调模式 |
CMD20 | ac | [31:28]速度集合控制 [27:0]保留(全0) | R1b | SPEED_CLASS_CONTROL | 速度集控制命令 |
CMD21 | 保留 | ||||
CMD22 | 保留 | ||||
CMD23 | ac | [31:0]记块数 | R1 | SET_BLOCK_COUNT | 为CMD18和CMD25指定块计数 |
面向块的写命令(Class 4) | |||||
CMD16 | 同上 | ||||
CMD20 | |||||
CMD23 | |||||
CMD24 | adtc | [31:0]数据地址[3] | R1 | WRITE_BLOCK | 对于标准SD卡,写入SET_BLOCK_LEN长度 对于SDHC,写入512字节 |
CMD25 | adtc | [31:0]数据地址[3] | R1 | WRIT_MULTIPLE_BLOCK | 连续写入SD卡数据块,直至被CMD12中断,块长度同CMD17 |
CMD26 | 保留给制造商 | ||||
CMD27 | adtc | [31:0]填充位 | R1 | PROGRAM_CSD | 对CSD寄存器可编程位进行编程 |
擦除命令(Class 5) | |||||
CMD32 | ac | [31:0]数据地址[3] | R1 | ERASE_WR_BLK_START | 设置擦除的起始块地址 |
CMD33 | ac | [31:0]数据地址[3] | R1 | ERASE_WR_BLK_END | 设置擦除的结束块地址 |
CMD38 | ac | [31:0]填充位 | R1b | ERASE | 擦除选定块 |
CMD39 | 保留 | ||||
CMD41 | 保留 | ||||
面向块的写保护命令(Class 6) | |||||
CMD28 | ac | [31:0]数据地址 | R1b | SET_WRITE_PROT | 若卡具有写保护功能,该命令将设置地址组的写保护位 |
CMD29 | ac | [31:0]数据地址 | R1b | CLR_WRITE_PROT | 若卡具有写保护功能,该命令将清除地址组的写保护位 |
CMD30 | adtc | [31:0]写保护数据地址 | R1 | SEND_WRITE_PROT | 若卡具有写保护功能,该命令告知SD卡发送写保护位状态 |
CMD31 | 保留 | ||||
锁卡(Class 7) | |||||
CMD16 | 同上 | ||||
CMD40 | adtc | 保留给安全规范 | |||
CMD42 | adtc | [31:0]保留位(全0) | R1 | LOCK_UNLOCK | 设置/重置密码,加锁/解锁卡 |
CMD43-49 | 保留 | ||||
CMD51 | 保留 | ||||
程序特殊命令(Class 8) | |||||
CMD55 | ac | [31:16]RCA [15:0]填充位 | R1 | APP_CMD | 向卡指示下一个命令是特定于应用程序的命令,而不是标准命令 |
CMD56 | adtc | [31:1]填充位 [0]读/写 | R1 | GEN_CMD | 用于将数据块传输到卡或从卡中获取数据块,用于通用/特定应用程序命令。 在标准容量SD存储卡的情况下,数据块的大小应由SET_BLOCK_LEN命令设置。 在大容量SD存储卡的情况下。数据块的大小被固定为512字节。 主机设置RD/RW=1用于从卡读取数据,设置为0用于向卡写入数据。 |
CMD58-59 | 保留 | ||||
CMD60-63 | 保留给制造商 | ||||
I/O 模式控制(Class 9) | |||||
CMD52-54 | 用于SDIO的命令 | ||||
SD存储卡使用/保留的特定应用程序命令(发送ACMD命令前需先发送CMD55) | |||||
ACMD6 | ac | [31:2]填充位 [1:0]总线宽度 | R1 | SET_BUS_WIDTH | 定义数据总线宽度(00h为1bit位宽,10h为4bit位宽),SCR寄存器给出了数据总线宽度 |
ACMD13 | adtc | [31:0]填充位 | R1 | SD_STATUS | 发送卡当前所在状态 |
ACMD22 | adtc | [31:0]填充位 | R1 | SEND_NUM_WR_BLOCKS | 发送已写入(没有错误)的写入块的数量。由32位CRC数据块进行响应 如果WRITE_BL_PARTIAL=0,则ACMD22的单位总是512字节。 如果WRITE_BL_PARTIAL=ACMD22的单位是执行写入命令时使用的块长度。 |
ACMD23 | ac | [31:23]填充位 [22:0]块数量 | R1 | SET_WR_BLK_ERASE_COUNT | 设置写入前要预先擦除的写入块的数量(用于更快的多块WR命令)。 1=默认值(一个WR块) |
ACMD41 | bcr | [31]保留位 [30]HCS(CCS){OCR[30]} [29]为eSD保留 [28]XPC [27:25]保留 [24]S18R [23:0]VDD电压限定[[4]] | R3 | SD_SEND_OP_COND | 要求从机发送它支持的电压信息和OCR寄存器的内容。 |
ACMD42 | ac | [31:1]填充位 [0]设置卡(set_cd) | R1 | SET_CLR_CARD_DETECT | 连接(1)/不连接(0)在CD/DAT3上的50KΩ上拉电阻 |
ACMD51 | adtc | [31:0]填充位 | R1 | SEND_SCR | 读取SCR寄存器 |
[[1]]详见卡状态部分内容
[[2]]返回CMD命令参数的电压范围和Check方案
[[3]]数据地址在标准容量SD存储卡中以字节为单位,在高容量SD存储卡内以块(512字节)为单位。
[[4]] OCR第[23:0]位