MMC/SD 分析

这里我并不是要讨论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在工作的整个过程中分为两个阶段和十种状态。下面使用图形来描述一下在两个阶段中这十种状态之间的转换关系。

242dd42a2834349b8468966cc9ea15ce37d3bee9.jpg

80cb39dbb6fd5266df6bc4fdab18972bd5073692.jpg

sd卡指令数据包

sd卡的指令被封装成48位的数据包,每次传送这48位的数据包。数据包的内容包括起始位、结束位、传输位、命令索引、传输参数和7CRC校验码。其具体格式分布如下图

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

其中的命令索引位是[4540],里面可以封装各种命令,具体的命令表将在下面给出。不同的命令会对应不同的回应(respond),回应有三种(R1R2R3)格式,在命令表中的选项会给出。

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 状态,对以后的CMD2CMD3不回应.

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

本指令强行终止CMD11CMD18的处理

None

R1

13

SEND_STATUS

接到本指令后, 将传送状态寄存器的信息.

None

R2

15

GO_INACTIVE _STATE

接到本指令后,将转换到休止(inactive)状态.

16

SET_BLOCKLEN

本指令用来设定Block长度.对象是以后的指令CMD17CMD18.

31:00]

block

length

R1

17

READ_SINGLE _BLOCK

接到本指令后,将从自变量设定的地址传送1block 长度的数据.(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

接到本指令后,将写1block 长度的数据到自变量设定的地址.(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 选项为ONOFF.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

CMD10SEND_CID

CMD12STOP_TRANSMISSION

CMD16SET_BLOCKLEN

CMD17READ_SINGLE_BLOCK

CMD18READ_MULTIPLE_BLOCK

CMD23SET_BLOCK_COUNT

CMD59CRC_ON_OFF

1338216308_3692.jpg

模式

对象指令

CMD13SEND_STATUS

1338216504_2567.JPG

模式

对象指令

CMD58READ_OCR

1338216563_3682.JPG

卡的配置信息

卡识别寄存器——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