返回列表 发帖

[站长原创] eMMC device的数据传输模式学习之一 - cmd6,cmd7,cmd8,9

[站长原创] eMMC device的数据传输模式学习之一 - cmd6,cmd7,cmd8,9

eMMC device的数据传输模式

本站我们学习emmc的数据传输模式,我在之前的章节中我们学习了emmc的初始化识别模式,之后emmc device就准备进入到数据传输模式了,下面上一个经典的图:

在emmc开始读写数据之前,emmc需要做哪些准备呢?通过上面的图我们做以下分析:
首先在emmc初始化识别模式完成后,它处于standby状态,需要通过cmd7切到数据传输模式。
其次,在emmc开始传输数据之前host需要知道emmc device的CSD,eCSD的值,例如block length,容量大小,速度模式等等。这个需要cmd8,9命令。
再次需要使用cmd6切换bus宽度等一系列需要修改CSD寄存器的操作。下面我一一学习这几个命令的原理:

我们先看一下这几个命令的基本格式和参数:

我们可以看出cmd6的参数中:
bit23-16 index:表示的事CSD寄存器的index,关于这个CSD请参考B50的pdf 7.4章节。
bit15-8 value:就是你要修改的相应CSD的位域的值。
bit25-24 Access:这个要好好说说,给大家上张图:

说白了就是bit25:bit24的值就是上图的access bits相应的值,我们主要关注:Set Bits, Clear Bits ,Write Byte。顾名思义这些bit值得意义就是修改相应的CSD域的值Set Bits, Clear Bits是按bits来设置和清除的,而Write Byte就是按着字节来设置和清除的,这个应该跟你要修改的CSD的域相关,详情还是查看下B50的手册吧。linux里面只会用到Write Byte,而其他bit值都没有用到。
举个例子比如你想切换emmc的bus 宽度,那么我们查看手册发现:

一个字节宽度的CSD[185]寄存器,不同的值代表不同的bus宽度,所以如果你想切换bus宽度,就要通过cmd6命令来写相应的value,并设置bit25:bit24为Write Byte。

大家主要到了读CSD和ECSD分别用的是不同的命令cmd9和cmd8,这两个命令的参数格式也不相同,cmd9需要设置emmc的RCA相对地址,而cmd8的命令则不需要这个RCA,因为它必须在cmd7设置之后才能下发,而这个cmd7就是select card,使这个card进入到数据传输模式之后cmd8才能被下发。还要注意的是cmd9读CSD的值,这个值是存放在emmc的response中的,也是通过cmd line传输,并不是从data数据线传输的,而cmd8读出来的extcsd数据则必须通过数据线传输,这也是为什么它必须在cmd7命令之后才能下发的原因。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

非常感謝

TOP

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服