EMMC 流程讲解

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命令


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周期,实际中小于这个时间也可以。)
在这里插入图片描述
在这里插入图片描述


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要使用的电压值。

对于传统的MMC卡来说,host可以通过CMD1来来判断卡的电压是否匹配。host通过CMD1的参数来指定VDD的电压范围,如果MMC卡不回,则认为不支持,这个时候MMC卡需要进入Inactive State, host将不会在访问这张卡。
如果MMC卡支持该VDD电压,则在response中返回其电压范围。
需要注意的是如果CMD1的参数设置为0,则表示host在询问MMC卡的电压范围。询问之后host 需要重发CMD1 选择一个电压范围。
note: 对于支持2.7-3.6V 和1.75-1.9V 两段电压范围的MMC卡, host 想要选择1.75-1.9V 电压,开始上电时也是建议先将VDD电压升到2.7-3.6V ,在发完CMD1之后,先关闭VDD,在开启1.75-1.9V的电压。

对于EMMC卡来说是不支持 CMD1 去check 电压范围的。其实这比较好理解,EMMC是固定在PCB上的,一开始就知道电压参数了,没必要做这些选择。
在这里插入图片描述

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。


EMMC 正常初始化流程:
(和SD不同,EMMC不需要切电压)
CMD0 -> CMD1 ->CMD2…
在这里插入图片描述


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


数据擦除

eMMC 标准提供了几种主动擦除数据的方法,以满足不同的场景需求。

擦除方式擦除单位描述
EraseErase Group按 Erase Group 擦除数据,完成后重新读取会返回全为 0 或者 1 的数据,但在物理存储介质上,可能还保留着原始数据
TRIMWrite Block按 Write Block 擦除数据,完成后重新读取会返回全为 0 或者 1 的数据,但在物理存储介质上,可能还保留着原始数据
DiscardWrite Block按 Write Block 擦除数据,完成后重新读取可能会返回擦除前的数据
Sanitize-将标记擦除的 Block 的数据在物理介质上清除
Erase

Erase 操作以 Erase Group 为单位进行一个或者多个 Group 的数据擦除,一个 Erase Group 由一个或者多个 Write Block 组成。
eMMC Device 在执行 Erase 操作时,通常并不会进行实际物理数据的擦除,只是将待擦除的 Erase Group 中的 Block 从地址空间中 unmap,然后从后台的空闲 Block 中选择已经完成物理擦除的 Block,重新 map 到该地址空间中,然后告知 Host 端已完成 Erase 操作。实际物理擦除操作则在后台选择合适的时机进行。
这样的逻辑可以减少 Host 执行 Erase 操作的等待时间,提高 eMMC Devcie 的响应速度。


IO模式命令

CMD39
CMD39 FAST_IO

参数

[31:16] RCA,

[15:15] 寄存器写标志

[14:8] 寄存器地址

[7:0] 寄存器值

这个命令用来读写8bit寄存器数据,R4响应用来返回读数据。这个命令访问应用特定的寄存器(未在EMMC标准中定义的)

CMD40

CMD40 GO_IRQ_STATE

设置设备进入中断模式


EMMC work State
在这里插入图片描述

  • 21
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值