这里我并不是要讨论MMC/SD的整个通信协议(详细的协议请看MMC/SD规范),而是遵循MMC/SD协议了解一下MMC/SD在被驱动的过程中卡所处的各种阶段和状态。根据协议,MMC/SD卡的驱动被分为:卡识别阶段和数据传输阶段。在卡识别阶段通过命令使MMC/SD处于:空闲(idle)、准备(ready)、识别(ident)、等待(stby)、不活动(ina)几种不同的状态;而在数据传输阶段通过命令使MMC/SD处于:发送(data)、传输(tran)、接收(rcv)、程序(prg)、断开连接(dis)几种不同的状态。所以可以总结MMC/SD在工作的整个过程中分为两个阶段和十种状态。下面使用图形来描述一下在两个阶段中这十种状态之间的转换关系。
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)格式,在命令表中的选项会给出。
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
命令回应repond
模式
对象指令
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
模式
对象指令
CMD13:SEND_STATUS
模式
对象指令
CMD58:READ_OCR
卡的配置信息
卡识别寄存器——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”
卡特性寄存器——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
SD卡MMC卡规范协议.pdf