天天看點

eMMC協定 - 技術手冊彙總大全

部落客福利:100G+電子設計學習資源包!

​​http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect​​ --------------------------------------------------------------------------------------------------------------------------

一、時鐘

1.1 eMMC時鐘部分

最基礎的部分還是時鐘,eMMC支援的時鐘分為好多種比如26M 52M HS200 HS400,當然eMMC越高端支援的時鐘模式也就越多。

怎麼知道eMMC支援的時鐘模式,查一下Extended CSD Register 的 [196] 位元組即可,這裡的這款B031晶片讀數為0x57,那麼這個0x57中的每一位含義是什麼呢,查閱文檔 [2] 的7.4.54節:

eMMC協定 - 技術手冊彙總大全

對照後0 1 2 4 6 位為1,即支援HS400 HS200 HS52-DDR HS52 HS26,4412可以選用任意一種時鐘模式操作eMMC。

這裡還有不同的模式需要的時鐘速率及最大傳輸速率。

eMMC協定 - 技術手冊彙總大全

1.2 4412 eMMC控制器部分

從CMU(Clock Management Unit)子產品中找到MMC控制器時鐘圖,如下:

eMMC協定 - 技術手冊彙總大全

系統上電預設使用XusbXTI時鐘源,但是在實際使用中24M時鐘是遠遠不夠的,是以我們按照手冊推薦将時鐘源選擇到SCLKmpll_user_t ,選擇方法請參考​​《exynos 4412 時鐘配置》​​。

MUXmmc0-3涉及的寄存器:

    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指令,

eMMC協定 - 技術手冊彙總大全

這樣可以得出這款B031不支援的指令有CMD11 CMD20 CMD39 CMD40 CMD53~56。

四、CMD清單

eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全

五、CMD回複格式

先看上面表格的第4列Resp列,代表eMMC回複給4412控制器的消息,他們的含義如下:

5.1 R1回複格式

eMMC協定 - 技術手冊彙總大全

共48bit,最高bit永遠是0,後緊接0代表從eMMC傳給控制器,而後[45:40]共6bit代表回複的哪個CMD(0 ~ 63),而後的[39:8]共32bit代表eMMC的裝置狀态,而後就是CRC和結束位。Device status的含義如下:

eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全

5.2 R1b回複格式

eMMC協定 - 技術手冊彙總大全

5.3 R2回複格式

R2用來回複CMD2 9 10這三個指令,當回複CMD2 10的時候内容是CID寄存器的值,當回複CMD9的時候内容是CSR寄存器的值。

eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全

5.4 R3回複格式

eMMC協定 - 技術手冊彙總大全

5.5 R4回複格式

eMMC協定 - 技術手冊彙總大全

5.6 R5回複格式

eMMC協定 - 技術手冊彙總大全

六、幾種常用CMD 

6.1 CMD0

這個指令用來複位eMMC,沒有回複:

eMMC協定 - 技術手冊彙總大全

6.2 CMD1

這個指令得到eMMC的OCR寄存器值:

eMMC協定 - 技術手冊彙總大全
eMMC協定 - 技術手冊彙總大全

在這裡[31]位比較重要,如果是1代表eMMC複位完成了,0x40FF8080複位未完成,0xC0FF8080複位完成。

6.3 CMD2

這個指令得到eMMC的CID寄存器值,共128bit,16位元組:

eMMC協定 - 技術手冊彙總大全

下面是在實際操作過程中讀取到的資料:

eMMC協定 - 技術手冊彙總大全

與文檔(1)中CID寄存器對照後就會發現完全一緻。

6.4 CMD3

此指令用來設定eMMC的相對位址,相對位址是為一條總線挂接多個eMMC準備的,如果隻有一個eMMC這個指令沒有很大意義。

eMMC協定 - 技術手冊彙總大全

eMMC回複R1給控制器。 

6.5 CMD6

這個指令用來設定eMMC中EXT_CSR中寄存器的值:

eMMC協定 - 技術手冊彙總大全

[31:26]:為0

[25:24]:見下表,

eMMC協定 - 技術手冊彙總大全

[23:16]:為将要操作的寄存器索引

[15:8]:為将要寫入寄存器的值

[7:3]:為0

[2:0]:如果[25:24]為00b,那麼這三位含義如下,

eMMC協定 - 技術手冊彙總大全

6.6 CMD7

此指令用來設定eMMC的狀态,因為當使用CMD0使eMMC複位後,eMMC處于idle或pre_idle狀态,如果需要資料傳輸,必須将eMMC置于transfer_state,CMD7就是這個作用。

eMMC協定 - 技術手冊彙總大全

eMMC回複R1給控制器。

6.7 CMD8

此指令用來擷取EXT_CSD的值,雖然回複為R1,但是EXT_CSD的512位元組值會被讀取并存儲到記憶體裡,然後使用者可以根據這些資料分析出eMMC目前支援的各種參數和狀态。

eMMC協定 - 技術手冊彙總大全

注意由于EXT_CSD是eMMC4之後才引入的寄存器組,是以隻有判斷eMMC版本大于4之後,才會發出這條指令讀取EXT_CSD。

6.8 CMD13

要求eMMC發送自己的狀态。

eMMC協定 - 技術手冊彙總大全

七、操作順序

 eMMC上電後首先需要複位,CMD0實作,然後eMMC會進入自行複位busy狀态,循環發送CMD1來檢測busy狀态,當busy狀态結束後,eMMC進入ready狀态,然後發送CMD2進行認證(擷取CID),然後發送CMD3,之後eMMC進入stby狀态,最後使用CMD7進入transfer狀态,這時候就可以使用CMD16讀取單塊,CMD17讀取多塊了。

以上是一般的操作順序,包括最關鍵的指令,當然也可以在這中間插入一些不是必需的指令,比如CMD6、CMD13等等。

詳細的狀态切換圖見下: