EMMC 基本命令
CMD0
cmd0带参数0xF0F0F0F0,GO_PRE_IDLE_STATE是软件reset命令,使得设备进入pre_idle状态
cmd0带参数0xFFFFFFFA,该命令使得device进入boot operation mode,device将主动发送数据到总线上,数据区域和大小由ECSD寄存器控制。
cmd0带参数0x00000000, GO_IDLE_STATE,reset 设备,使得设备进入Idle状态。
为了兼容,如果设备收到CMD0,并且参数不是0xFFFFFFFA或者0xF0F0F0F0,那么该命令会被看做reset命令
CMD1
CMD1 如果设备不支持boot mode,或者BOOT_PARTITION_ENABLE位被清除,power up后设备会立刻进入idle状态。在idle状态,除非收到CMD1,设备会忽略所有传输。对于EMMC4.2之前的版本,device在上电后会立刻进入idle状态。
CMD1是一个特定的同步命令,用来协商操作电压范围以及查看设备是否仍处在power-up序列。CMD1的响应除了包含操作电压profile,还包含一个busy标记,用来指明设备是否仍然处在power-up序列,没有准备号identification
设备应该在收到CMD1 1s内完成初始化,
CMD1 带参数0x00FF8000或者0x00000800,表示host要使用的电压值。
host发送CMD1后,会从device收到R3,如果R3中busy bit为0,表示device还没准备好。host重复发送CMD1,接收R3这个过程。
CMD2
CMD2 ALL_SEND_CID 用来从device获取CID,R2用来用来返回device’s CID。
CMD3
CMD3 SET_RELATIVE_ADDR 用来给设置设备的relative device address(RCA),设备收到CMD3后,会立刻从identification mode进入Stand-by State,并且不会再响应任何identification。
CMD4
CMD4 用来设置device的DSR(device stage register)寄存器
CMD5
CMD5 SLEEP/AWAKE
用来切换设备到Sleep state或者Standby state。设备在Sleep state的电源消耗是最小的,在这个状态下设备仅响应RESET命令(CMD0 参数为0x00000000或者0xF0F0F0F0)和SLEEP/AWAKE命令(CMD5),其他命令都会被忽略。
Sleep command: CMD5 参数bit15为1; Awake command: CMD参数bit15为0
CMD6
CMD6 SWITCH
切换设备的操作模式或者修改EXT_CSD寄存器,SWITCH命令可以用来写EXT_CSD或者改变命令集。如果SWITCH命令用来改变命令集,那么Index和Value被忽略不会修改EXT_CSD; 如果SWITCH用来写EXT_CSD寄存器,Cmd Set被忽略。
CMD6参数
[31:26] Set to 0
[25:24] Access, 00 切换command set; 01 设置Value中指定的位; 10 清除Value中指定的位; 11 写入Value指定的值。
[23:16] Index, EXT_CSD的索引值,index值为0255,但是仅仅0191为有效索引值。
[15:8] Value,
[7:3] Set to 0
[2:0] Cmd Set ,要切换的command set
CMD7
CMD7 SELECT/DESELECT_CARD
当设备处在Stand-by状态,CMD7把设备从Stand-by State切换到Transfer State;也可以把设备从Transfer State切换回Stand-by State.
当设备处在Disconnect状态,CMD7把设备从Disconnect State切换到Programming State
在以上两种情况下,使用当前的RCA会选择设备,任何其他RCA 地址都会取消选择。使用RCA 0x0000表示取消选择。
CMD8
CMD8 SEND_EXT_CSD
请求设备发送它的EXT_CSD寄存器,通过数据块的方式发送。
CMD9
CMD9 SEND_CSD
参数指定设备的RCA [31:16] RCA
请求设备发送它的Device-specific data(CSD)到CMD line上。
CMD10
CMD10 SEND_CID
参数指定设备的RCA [31:16] RCA
请求设备发送它的Device identification(CID)到CMD line上
CMD12
CMD12 STOP_TRANSMISSION
参数指定设备的RCA [31:16]
所有的read commands: CMD17 CMD18 CMD21 CMD30,都可以在任意时刻被CMD12打断。设备会返回到Transfer State
所有的write commands: CMD24 CMD25 CMD26 CMD27,都可以被CMD12中止,但是要求在发送CMD7之前发送。
CMD13
CMD13 SEND_STATUS
参数 [31:16] 设备的RCA, [0] HPI flags。
请求设备发送它的状态寄存器,如果设置了HPI flag,那么设备会在一个定义良好的时间内中断。
CMD14
CMD14 BUSTEST_R
主机从设备端读取测试模式数据
CMD15
CMD15 GO_INACTIVE_STATE
参数[31:16]指定设备的RCA
设置设备状态为inactive
CMD19
CMD19 BUSTEST_W
Host发送总线测试模式数据到device
面向块的读命令
CMD16
CMD16 SET_BLOCKLEN
参数[31:0] block长度
设置接下来所有block命令(读和写)的block尺寸。缺省的块长度在CSD中指定。
CMD17
CMD17 READ_SINGLE_BLOCK
参数[31:0] data block地址
读取参数指定地址的数据块,块长度是CMD16设置的(或者使用缺省block size)
CMD18
CMD18 READ_MULTIPLE_BLOCK
参数[31:0] data block的首地址
连续从设备读取数据块到host,直到被stop命令中断,或者已经达到请求的数据块数量
CMD21
CMD21 SEND_TUNING_BLOCK
HS200模式专用,用来优化HOST采样点,HOST发送CMD21命令,device发送tuning模式数据块。Host会在不同采样点采集数据,找到最佳采样点。
面向块的写命令
CMD23
CMD23 SET_BLOCK_COUNT
参数:
[30] ‘0’ non-packed ‘1’ packed
[24] forced programming, 设置为1,强迫数据直接写入存储介质,而不是仅写入cache
[15:0] number of blocks,
定义读写块数目
CMD24
CMD24 WRITE_BLOCK
参数[31:0] 数据块地址
协议个数据块到设备中,尺寸由之前的CMD16 SET_BLOCKLEN定义
CMD25
CMD25 WRITE_MULTIPLE_BLOCK
参数[31:0] 数据块起始地址
连续数据块,直到STOP_TRANSMISSION或者已经写完了请求的数据块。
CMD26
CMD26 PROGRAM_CID
写设备CID寄存器。这个命令只能烧写一次,正常情况下是制造商使用这个命令。
CMD27
CMD27 PROGRAM_CSD
更改CSD中的可编程位
CMD49
CMD49 SET_TIME
设置device的real time clock,device使用这个时钟做一些内部维护工作。
这个命令类似CMD24 WRITE_BLOCK,会发送一个RTC information 数据块。
面向块的写保护命令
CMD28
CMD28 SET_WRITE_PROT
参数 [31:0] 数据块地址
如果设备支持写保护功能,这个命令设置指定地址组的写保护位
CMD29
CMD29 CLR_WRITE_PROT
参数[31:0] 数据块地址
如果设备提供了写保护功能,这个命令清除指定地址组的写保护位
CMD30
CMD30 SEND_WRITE_PROT
参数 [31:0] 写保护数据地址
CLASS_6_CTRL=0x00: 如果设备支持写保护功能,这个命令请求设备发送写保护位状态
CLASS_6_CTRL=0x01: 命令用来请求设备发送released组状态,0表示给定的组有效可访问,1表示给定组被released无法使用。
CMD31
CMD31 SEND_WRITE_PROT_TYPE
参数[31:0] 写保护起始地址
CLASS_6_CTRL=0x00: 请求设备发送不同写保护组的写保护类型,64个写保护位(代表32个写保护组),通过数据线传递。如果组的有效地址已经在有效范围之外,那么被填充为0
CLASS_6_CTRL=0x01:
删除命令
CMD35
CMD35 ERASE_GROUP_START
参数[31:0] 对于=<2G的介质,表示32bits byte地址,对于>2GB介质,是32bits sector地址,会按照Erase group对齐。
该命令设置erase操作的首earse group地址。
CMD36
CMD36 ERASE_GROUP_END
参数[31:0]对于=<2G的介质,表示32bits byte地址,对于>2GB介质,是32bits sector地址,会按照Erase group对齐。
该命令设置erase操作的最后一个erase group地址。
CMD38
CMD38 ERASE
删除前面选择的所有earse block
IO模式命令
CMD39
CMD39 FAST_IO
参数
[31:16] RCA,
[15:15] 寄存器写标志
[14:8] 寄存器地址
[7:0] 寄存器值
这个命令用来读写8bit寄存器数据,R4响应用来返回读数据。这个命令访问应用特定的寄存器(未在EMMC标准中定义的)
CMD40
CMD40 GO_IRQ_STATE
设置设备进入中断模式
EMMC 进入boot模式
通用的是第一种开启Boot的方式:
主要步骤如下:
1、发送CMD0 参数:0xf0f0f0f0,进行Reset操作。
2、将CMD拉低。(要求至少经过74 clock周期,一直拉低进行DATA传输)
EMMC4.4即以上版本可支援第二种
1、发送CMD0 参数:0xf0f0f0f0,进行Reset操作。
2、再发送CMD0参数:0xfffffffa,进入boot mode。(两个CMD0的时间间隔文档要求经过74 clock周期,实际中小于这个时间也可以。)
EMMC 正常初始化流程:
(和SD不同,EMMC不需要切电压)
CMD0 -> CMD1 ->CMD2…
EMMC work State