? ? CLK_SRC_FSYS
? ? 地址:0x1003C240
? ? 默认值:0x00011111
? ? 设置后的值:0x00066666
DIVmmc0-3和DIVmmc0-3_PRe涉及的寄存器:
? ? CLK_DIV_FSYS1 &?CLK_DIV_FSYS2 &?CLK_DIV_FSYS3
? ? 地址:0x1003C544 & 0x1003C548 & 0x1003C54C
? ? 默认值:0x00000000 &?0x00000000 &?0x00000000
? ? 设置后的值:0x09010901 &?0x09010901 &?0x09010901
这样在MPLL为800MHz的情况下,先二分频再十分频,最后eMMC控制器的时钟是40MHz。但是如果eMMC芯片支持HS200或者HS400高速模式,那么随后对控制器时钟进行修改即可。?
二、确定Class我们都知道,eMMC也是分等级的,分别从Class0 ~ Class11 ,不同的Class支持的命令范围不同,不先确定Class就不敢确定发出的指令eMMC能够正确响应。查一下CSD Register的[95:84]共12bit。这里的这款B031读数为0xF5(11110101),支持Class0 Class2 Class4 Class5 Class6 Class7指令集。三、确定支持的CMD从支持的Class指令集就可以推出支持的CMD命令,?这样可以得出这款B031不支持的命令有CMD11 CMD20?CMD39?CMD40?Cmd53~56。四、CMD列表?五、CMD回复格式先看上面表格的第4列Resp列,代表eMMC回复给4412控制器的消息,他们的含义如下:5.1 R1回复格式?共48bit,最高bit永远是0,后紧接0代表从eMMC传给控制器,而后[45:40]共6bit代表回复的哪个CMD(0 ~ 63),而后的[39:8]共32bit代表eMMC的设备状态,而后就是CRC和结束位。Device status的含义如下:?5.2 R1b回复格式5.3 R2回复格式R2用来回复CMD2 9 10这三个命令,当回复CMD2 10的时候内容是CID寄存器的值,当回复CMD9的时候内容是CSR寄存器的值。5.4 R3回复格式?5.5 R4回复格式5.6 R5回复格式?六、几种常用CMD?6.1 CMD0这个命令用来复位eMMC,没有回复:6.2 CMD1这个命令得到eMMC的OCR寄存器值:在这里[31]位比较重要,如果是1代表eMMC复位完成了,0x40FF8080复位未完成,0xC0FF8080复位完成。6.3 CMD2这个命令得到eMMC的CID寄存器值,共128bit,16字节:下面是在实际操作过程中读取到的数据:与文档(1)中CID寄存器对照后就会发现完全一致。6.4 CMD3此命令用来设置eMMC的相对地址,相对地址是为一条总线挂接多个eMMC准备的,如果只有一个eMMC这个命令没有很大意义。eMMC回复R1给控制器。?6.5 CMD6这个命令用来设置eMMC中EXT_CSR中寄存器的值:[31:26]:为0[25:24]:见下表,[23:16]:为将要操作的寄存器索引[15:8]:为将要写入寄存器的值[7:3]:为0[2:0]:如果[25:24]为00b,那么这三位含义如下,6.6 CMD7此命令用来设置eMMC的状态,因为当使用CMD0使eMMC复位后,eMMC处于idle或pre_idle状态,如果需要数据传输,必须将eMMC置于transfer_state,CMD7就是这个作用。eMMC回复R1给控制器。6.7 CMD8此命令用来获取EXT_CSD的值,虽然回复为R1,但是EXT_CSD的512字节值会被读取并存储到内存里,然后用户可以根据这些数据分析出eMMC当前支持的各种参数和状态。注意由于EXT_CSD是eMMC4之后才引入的寄存器组,所以只有判断eMMC版本大于4之后,才会发出这条指令读取EXT_CSD。6.8 CMD13要求eMMC发送自己的状态。?七、操作顺序?eMMC上电后首先需要复位,CMD0实现,然后eMMC会进入自行复位busy状态,循环发送CMD1来检测busy状态,当busy状态结束后,eMMC进入ready状态,然后发送CMD2进行认证(获取CID),然后发送CMD3,之后eMMC进入stby状态,最后使用CMD7进入transfer状态,这时候就可以使用CMD16读取单块,CMD17读取多块了。以上是一般的操作顺序,包括最关键的指令,当然也可以在这中间插入一些不是必需的指令,比如CMD6、CMD13等等。详细的状态切换图见下:??参考文档:[1]?KLMxGxxEMx-B031 Spec[2] JESD84-B50(注:eMMC 5.0标准协议)新闻热点
疑难解答