数据包的封装与命令协议相关
1 sd卡指令数据包
sd卡的指令被封装成48位的数据包,每次传送这48位的数据包。数据包的内容包括起始位、结束位、传输位、命令索引、传输参数和7位CRC校验码。其具体格式分布如下图
Bit 位置 | 47 | 46 | [45:40] | [39:08] | [07:01] | 00 |
Bit 宽度 | 1 | 1 | 6 | 32 | 7 | 1 |
值 | “0” | “1” | x | x | x | “1” |
说明 | Start bit | Transmission bit | Command index | Argument | CRC7 | End bit |
其中的命令索引位是[45:40],里面可以封装各种命令,具体的命令表将在下面给出。不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格式,在命令表中的选项会给出。
2 sd卡命令索引表
CMD | 简略语 | 指令说明 | SPI 模式 | |
自变量 | 回应 | |||
0 | GO_IDLE_STATE | 这是使card初始化到Idle状态的指令.CS信号设在Low的状态时,接到本指令后,card 将转换到SPI模式. | None | R1 |
1 | SEND_OP_COND | 接到本指令后,card将做R3回应(含有OCR 数据).根据OCR值,可以得知card能工作电压范围.OCR数据最高值位的1bit是用来确认card内部处理是否结束(Ready/Busy轮询). | None | R1 |
2 | ALL_SEND_CID | 接到本指令后, 处于Ready状态的card将传送CID数据.在MMC模式下,数据被送到CMD信号,在CID数据的每1bit传送后,CMD信号状态将与该card内部状态相比较,如果不一致,將中止数据传送,card返回到Ready状态.如果相一致,该card 将认为已被选中,然后转换到Identification 状态. |
|
|
3 | SET_RELATIVE_ADDR | 本指令会为已转换到Identification状态的card分配一个相对card地址(RCA).当RCA分配后,card将转换到Stand-by 状态,对以后的CMD2和CMD3不回应. |
|
|
4 | NOP | 这是用来设定DSR(DriveState寄存器)的指令,但是本car不支持DSR. |
|
|
7 | SELECT/DESELECT_CARD | 本指令是用来选择一张card,让它在Stand-by状态和Transfer状态之间转换的指令.如果给card设定已分配到的RCA地址,card将从Stand-by状态转换到Transfer状态,并将回应以后的读取指令及其他指令.如果给card设定RCA以外的地址,card将转换到Stand-by状态。当RCA=0000h时,card将无条件地转换到Stand-by状态. |
|
|
9 | SEND_CSD | 接到本指令后,将传送CSD数据. | None | R1 |
10 | SEND_CID | 接到本指令后,将传送CID数据. | None | R1 |
11 | READ_DAT_UNTIL_STOP | 接到本指令后,将从设定的地址传送P2ROM数据,直到接到指令CMD12为止. |
|
|
12 | STOP _TRANSMISSION | 本指令强行终止CMD11和CMD18的处理 | None | R1 |
13 | SEND_STATUS | 接到本指令后, 将传送状态寄存器的信息. | None | R2 |
15 | GO_INACTIVE _STATE | 接到本指令后,将转换到休止(inactive)状态. |
|
|
16 | SET_BLOCKLEN | 本指令用来设定Block长度.对象是以后的指令CMD17和CMD18. | 31:00] block length | R1
|
17 | READ_SINGLE _BLOCK | 接到本指令后,将从自变量设定的地址传送1个block 长度的数据.(block长度由指令CMD16设定). | [31:00] data address | R1 |
18 | READ_MULTIPLE _BLOCK | 接到本指令后,将从自变量设定的地址连续传送block长度的数据,直到接到指令CMD12为止.(block长度由指令CMD16设定). | [31:00] data address | R1 |
23 | SET_BLOCK _COUNT | 本指令是给紧跟的指令CMD18设定要传送的block 数量.
| [31:16]set to 0 [15:00]number of block | R1 |
24 | WRITE_BLOCK
| 接到本指令后,将写1个block 长度的数据到自变量设定的地址.(block长度由指令CMD16设定). | [31:0] data address
| R1 |
25 | WRITE_MULTIPLE_ BLOCK
| 接到本指令后,将连续写block长度的数据到自变量设定的地址,直到接到指令CMD12为止.(block长度由指令CMD16设定). | [31:0] data address
| R1 |
58 | READ_OCR | 接到本指令后,Card将传送OCR数据. | None | R3 |
59 | CRC_ON_OFF | 本指令是用来设定CRC 选项为ON或OFF.在SPI模式下,CRC的初始值设定为OFF.[CRC选项[bit=1]表示CRC ON;[CRC选项[bit=0]表示CRC OFF. | [31:01] stuff bits [00:00] CRC option | R1
|
3 命令回应repond
1) R1模式
对象指令
CMD0 : GO_IDLE_STATE
CMD1 : SEND_OP_COND
CMD9 : SEND_CSD
CMD10:SEND_CID
CMD12:STOP_TRANSMISSION
CMD16:SET_BLOCKLEN
CMD17:READ_SINGLE_BLOCK
CMD18:READ_MULTIPLE_BLOCK
CMD23:SET_BLOCK_COUNT
CMD59:CRC_ON_OFF
2) R2模式
对象指令
CMD13:SEND_STATUS
3) R3模式
对象指令
CMD58:READ_OCR
4. sd卡的配置信息
4.1卡识别寄存器——CID(card identification register )
CID-slice | 名称 | 栏目 | Bit宽度 | 值 | OKI 原创 |
[127:120] | Manufacture ID | MID | 8 | 0x41 | OKI ID, 由MMCA 指定 |
[119:104] | OEM/Application ID | OID | 16 | 0x0000 | OK设备名 |
[103:56] | Product name | PNM | 48 | P2016 | 产品名 |
[55:48] | Product revision | PRV | 8 | 0x10 | 产品修订版(version 1.0) |
[47:16] | Product serial number | PSN | 32 | 0x00000001 | 产品编号 Default=1, user设定可 |
[15:8] | Manufacturing data | MDT | 8 | 收到Code 文件的月份 | OKI 收到客户Code 档案的日期,或是写入程序的日期 |
[7:1] | 7-bit CRC checksum | CRC7 | 7 | CRC | 检验和 |
[0:0] | - | - | 1 | 1 | 固定是”1” |
4.2卡特性寄存器——CSD(card specific data register)
CSD-slice | 名称 | 栏目 | Bit 宽度 | 值 | Type | 备注 | |
Bin. | Hex. |
|
| ||||
[127:126] | CSD Structure | CSD_STRUCTURE | 2 | 10 | 0x2 | R | Version 3.1 |
[125:122] | spec version | SEPC_VERS | 4 | 0011 | 0x3 | R | Version 3.1 |
[121:120] | Reserved |
| 2 | X | X | R | 不必理会 |
[119:112] | datatime1 read access | TAAC | 8 | 00001000 | 0x08 | R | 1ns |
[111:104] | datatime2 read access | NSAC | 8 | 00000001 | 0x01 | R | 100cycles |
[103:96] | max rate data transfer | TRAN_SPEED | 8 | 00101010 | 0x2A | R | 20Mb/s |
[95:84] | card command class | CCC | 12 | 000000000111 | 0x007 | R | 支持Class0,1,2 |
[83:80] | max read data block length | READ_BL_LEN | 4 | 1001 | 0x9 | R | 512 字节 |
79 | partial blocks for read allowed | READ_BL_PARTIAL | 1 | 1 | 0x1 | R |
|
78 | Reserved |
| 1 | X | X | R | 不必理会 |
77 | read block misalignment | READ_BLK_MISALIGN | 1 | 0 | 0x0 | R | 禁止跨越Block |
76 | DSR implemented | DSR_IMP | 1 | 0 | 0x0 | R | DSR: 不支持 |
[75:74] | Reserved |
| 2 | X | X | R | 不必理会 |
[73:62] | device size | C_CIZE | 12 | 111111111110 | 0xFFE | R |
|
[61:59] | min. read current | VDD_R_CURR_MIN | 3 | 000 | 0x0 | R | 0.5mA |
[58:56] | max. read current | VDD_R_CURR_MAX | 3 | 100 | 0x4 | R | 35mA |
[55:50] | Reserved |
| 6 | X | X | R | 不必理会 |
[49:47] | device size multiplier | C_SIZE_MULT | 3 | 001 | 0x1 | R |
|
[46:31] | Reserved |
| 16 | X | X | R | 不必理会 |
[30:29] | manufacture default ECC | DEFAULT_ECC | 2 | 00 | 0x0 | R | ECC: 不支持 |
[28:26] | Reserved |
| 3 | X | X | R | 不必理会 |
[25:22] | Max. write data block length | WRITE_BL_LEN | 4 | 1001 | 0x9 | R |
|
[21:16] | Reserved |
| 6 | X | X | R | 不必理会 |
15 | file format group | FILE_FORMAT_GRP | 1 | 0 | 0x0 | R |
|
14 | Copy flag (OTP) | COPY | 1 | 0 | 0x0 | R | Default=0 User 设定可 |
13 | permanent protection write | PERM_WRITE_ PROTECT | 1 | 1 | 0x1 | R |
|
12 | temporary protection write | TMP_WRITE_ PROTECT | 1 | 1 | 0x1 | R |
|
[11:10] | file format | FILE_FORMAT | 2 | 00 | 0x0 | R | Default=0 User 设定可 |
[9:8] | ECC code | ECC | 2 | 00 | 0x0 | R | ECC: 不支持 |
[7:1] | CRC | CRC | 7 | CRC | CRC | R |
|
0 | Reserved |
| 1 | 1 | 0x1 | R |
|