開(kāi)發(fā)板:
原理圖:
開(kāi)發(fā)工具:S32 Design Studio for Power Architecture
調(diào)試內(nèi)容:MPC5748G通過(guò)SDHC模塊讀寫eMMC
eMMC:
? ? ? ? 嵌入式多媒體卡?(Embedded Multi Media Card)是MMC協(xié)會(huì)訂立、主要針對(duì)手機(jī)或平板電腦等產(chǎn)品的內(nèi)嵌式存儲(chǔ)器標(biāo)準(zhǔn)規(guī)格树酪。eMMC在封裝中集成了一個(gè)控制器恨樟,提供標(biāo)準(zhǔn)接口并管理閃存港庄。eMMC的應(yīng)用是對(duì)存儲(chǔ)容量有較高要求的消費(fèi)電子產(chǎn)品蒲赂。
? ? ? ? 帶有MMC(多媒體卡)接口碳锈、快閃存儲(chǔ)器設(shè)備及主控制器混稽。所有都在一個(gè)小型的BGA 封裝缤言。接口速度高達(dá)每秒52MBytes宝当,eMMC具有快速、可升級(jí)的性能胆萧。同時(shí)其接口電壓可以是1.8v 或者是3.3v庆揩。
SDHC:
? ? ? ? MPC5748G支持一個(gè)超安全數(shù)字主機(jī)控制器(uSDHC:ultra Secure Digital Host Controller)模塊,uSDHC提供主系統(tǒng)與SD/SDIO/ MMC卡通信的接口跌穗。uSDHC充當(dāng)橋梁的作用订晌,以發(fā)送命令的方式,通過(guò)主機(jī)總線傳輸?shù)絊D/SDIO/ MMC卡中蚌吸,執(zhí)行數(shù)據(jù)訪問(wèn)(讀寫操作)锈拨,它遵循SD/SDIO/MMC卡的傳輸協(xié)議。
注意:為了 uSDHC 外部接口的正常運(yùn)行套利,uSDHC_VEND_SPEC [ CMD_OE_PRE_EN ] ?【Vendor Specific Register :此寄存器包含供應(yīng)商特定的控制/狀態(tài)寄存器位應(yīng)該被編程為 1 推励。
設(shè)備寄存器的特定復(fù)位值如下表所示:
uSDHC_BLK_ATT:Block Attributes (uSDHC_BLK_ATT),這個(gè)寄存器用于配置數(shù)據(jù)塊的數(shù)量和每一塊的字節(jié)數(shù)肉迫。
uSDHC_PRES_STATE:Present State (uSDHC_PRES_STATE)验辞,該只讀寄存器獲得uSDHC的狀態(tài)。當(dāng)一個(gè)數(shù)據(jù)發(fā)送期間喊衫,DAT lines 處于忙狀態(tài)跌造,主驅(qū)動(dòng)可以發(fā)送?CMD0, CMD12, CMD13 (for memory) ?和 CMD52 (for SDIO)。這些命令能夠被發(fā)送族购,當(dāng) Command Inhibit (DAT)【命令抑制位壳贪,uSDHC_PRES_STATE[CIHB]:如果此狀態(tài)位為0,則表示CMD線未使用寝杖,uSDHC可以使用CMD線發(fā)出SD/MMC命令违施。在寫入傳輸類型寄存器Command Transfer Type (uSDHC_CMD_XFR_TYP)后立即設(shè)置此位。當(dāng)接收到命令響應(yīng)時(shí)瑟幕,此位被清除磕蒲。即使這個(gè)Command Inhibit (DAT) 【CDIHB】被設(shè)置為 1,僅僅 CMD 線能用于發(fā)送命令(如果該位為0)只盹。
打開(kāi)調(diào)試工程:
安裝完成開(kāi)發(fā)工具:S32DS_Power_Win32_v2017.R1_b171019.exe
1辣往、雙擊打開(kāi)開(kāi)發(fā)工具:
2、打開(kāi)File --> New --> S32DS Project ?from Example殖卑,選擇如下工程站削。
3、打開(kāi)SDHC調(diào)試工程如下:
一孵稽、配置SDHC工程:
1许起、配置SDHC的引腳
2、配置SDHC時(shí)鐘
3肛冶、配置uSDHC參數(shù)信息
二街氢、SDHC ?Pads ?初始化:
1、設(shè)置 Pins?Output Buffer:
(1)?調(diào)用接口描述
(2)?寄存器描述
MSCR(Multiplexed Signal Configuration Register):多路信號(hào)配置寄存器睦袖,選擇哪一個(gè)信號(hào)源連接到寄存器相關(guān)聯(lián)的目的地珊肃,即這是一個(gè)芯片引腳拳球,是或可以配置為一個(gè)輸出毁欣。對(duì)于相關(guān)聯(lián)的芯片引腳目的地,該寄存器也可以指定這個(gè)引腳的電氣屬性垄提。
MSCR?寄存器中的字段根據(jù)其關(guān)聯(lián)的目的地(芯片引腳)變化而變化董习。 對(duì)于?芯片引腳?的?MSCR 寄存器分配烈和,引腳類型,APC (Analog Pad Control)支持皿淋,SSS(Source Signal Select)等等招刹。這個(gè)寄存器只支持32位訪問(wèn)恬试。字節(jié)和半字寫訪問(wèn)不支持。
注:參見(jiàn)I/O信號(hào)描述和輸入多路復(fù)用附屬于 MPC5748GRM 手冊(cè)的表格(excel文件)疯暑。
2、設(shè)置 Pins?Input Buffer:
(1)?調(diào)用接口描述
(2)?寄存器描述
IMCR(Input Multiplexed Signal Configuration Register):輸入多路復(fù)用信號(hào)配置寄存器妇拯,選擇哪一個(gè)信號(hào)源連接到寄存器相關(guān)聯(lián)的目的地幻馁,即這是一個(gè)內(nèi)部模塊端口(internal module port),是或可以配置為一個(gè)輸入越锈。
IMCR?寄存器中的字段根據(jù)其關(guān)聯(lián)的目的地(module port)變化而變化仗嗦,對(duì)于?IMCR 的分配和SSS (Source Signal Select)的值參見(jiàn)I/O信號(hào)描述和輸入多路復(fù)用表。
3稀拐、設(shè)置 Pins?Pull 選擇:
(1)?調(diào)用接口描述
(2)?寄存器描述見(jiàn)以上描述
三、SDHC ?初始化:
1对蒲、uSDHC 初始化代碼解析:
(1)去初始化:調(diào)用接口??uSDHC_DRV_Deinit();
?(2)uSDHC驅(qū)動(dòng)初始化:調(diào)用接口??uSDHC_DRV_Init(); ? ??
/* Reset ?uSDHC. */
/* Configures the usdhc protocol */
/* Disable all clock auto gated off feature because of DAT0 line logic(card buffer full status) can't be updated correctly when clock auto gated off is enabled. */
四、eMMC ?初始化:
1泛鸟、判斷 eMMC卡是否插入:
讀取?uSDHC_PRES_STATE 寄存器中的 ?CINST 位蝠咆,判斷卡是否插入。
2北滥、如果 eMMC卡插入刚操,則初始化eMMC卡:
(1)設(shè)置 uSDHC 的總線時(shí)鐘為 400KHZ
1)首先得到系統(tǒng)時(shí)鐘:srcClock ?( 例如設(shè)置的系統(tǒng)時(shí)鐘為 40MHZ = 40 000 000 HZ )
2)禁用 uSDHC時(shí)鐘。在更改 eMMC ?時(shí)鐘頻率之前再芋,應(yīng)該禁用它菊霜。
uSDHC_VEND_SPEC[ FRC_SDCLK_ON?] = 0;
3)求 prescaler 和 divisor?的大小。
Clock Frequency = (srcClock ?) / (prescaler x divisor)
例如:Clock Frequency = 400 000 hz济赎;srcClock ?=??40 000 000 HZ
即:prescaler x divisor = 100
參照 MPC5748G數(shù)據(jù)手冊(cè)鉴逞,可知:prescaler <=256;divisor <=16
并且司训,在單數(shù)據(jù)速率模式下构捡,prescaler?只允許以下設(shè)置:
??80h) Base clock divided by 256
? 40h) Base clock divided by 128
? 20h) Base clock divided by 64
? 10h) Base clock divided by 32
? 08h) Base clock divided by 16
? 04h) Base clock divided by 8
? 02h) Base clock divided by 4
? 01h) Base clock divided by 2
? 00h) Base clock divided by 1
所以,設(shè)置?divisor =16 時(shí)壳猜,求出?prescaler =100/16=6.25勾徽,按照上面分析,prescaler =8统扳;當(dāng)?prescaler =8 時(shí)喘帚,divisor =?100/8=12.5畅姊,約等于13。
即:uSDHC_SYS_CTRL[SDCLKFS]=prescaler >>1吹由;
? ? ? ? uSDHC_SYS_CTRL[DVS]=divisor-1涡匀;
同時(shí),設(shè)置?Data Timeout Counter Value:??uSDHC_SYS_CTRL[DTOCV]=0x0E溉知;
注:詳細(xì) uSDHC_SYS_CTR L描述請(qǐng)見(jiàn)手冊(cè)。
4)等待 eMMC 卡的時(shí)鐘穩(wěn)定腕够。
while ( uSDHC_PRES_STATE?[?SDSTB?] == 0?){ ?}级乍;
5)使能?uSDHC?時(shí)鐘。
uSDHC_VEND_SPEC[?FRC_SDCLK_ON?] = 1;
(2)發(fā)送80時(shí)鐘周期到卡帚湘,以至于激活卡玫荣。
1)寫1清除 uSDHC_SYS_CTRL 寄存器中的 INITA 位
即: uSDHC_SYS_CTRL [ INITA?] = 1捅厂;
2)等待卡激活资柔。
while (?uSDHC_SYS_CTRL?[?INITA?] ==?0?) { ?}贿堰;
(3)參考芯片手冊(cè)以及?emmc?協(xié)議發(fā)送 CMD 命令 初始化 eMMC卡羹与。
1)發(fā)送 CMD0 命令纵搁,設(shè)置卡?空閑狀態(tài)腾誉。
command . index =?CMD0? ? ? ? /*!< Go Idle State */
command . argument = 0;
2)host發(fā)送CMD1后妄辩,會(huì)從device收到R3眼耀,如果R3中busy bit為0哮伟,表示device還沒(méi)準(zhǔn)備好。host重復(fù)發(fā)送CMD1抡驼,接收R3這個(gè)過(guò)程肿仑。
command . index = CMD1 ? ? ? ? ?/*!< Send Operation Condition */
command?.?argument = 0xFF8000
command?.?responseType = uSDHC_RESPONSE_TYPE_R3
3)host?發(fā)送CMD2后馏锡,會(huì)從device收到獲取CID杯道,R2用來(lái)用來(lái)返回 device's CID责蝠。
command . index = CMD2 ? ? ? ? ? ?/*!< All Send CID */
command . argument = 0U;
command . responseType = uSDHC_RESPONSE_TYPE_R2;
4)host?發(fā)送?CMD3?用來(lái)給設(shè)置設(shè)備的 relative device address(RCA)
command . index = CMD3 ? ? ? ??/*!< Set Relative Address */
command . argument = 0 ? ? ? ? ?/* Relative Address */
command . responseType = uSDHC_RESPONSE_TYPE_R1;
5)host?發(fā)送?CMD9?用來(lái)請(qǐng)求設(shè)備發(fā)送它的?Device-specific data?(CSD) 到 CMD line 上齿拂。參數(shù)指定設(shè)備的RCA [31:16] RCA
command . index = CMD9 ? ? ? ? ?/*!< Send CSD */
command . argument = (card->relativeAddress << 16U) ? ?/* 參數(shù) */
command . responseType = uSDHC_RESPONSE_TYPE_R2
6)host?發(fā)送?CMD7?用來(lái)選擇或取消卡
當(dāng)設(shè)備處在Stand-by狀態(tài)创肥,CMD7把設(shè)備從Stand-by State切換到Transfer State值朋;也可以把設(shè)備從Transfer State切換回Stand-by State昨登。
當(dāng)設(shè)備處在Disconnect狀態(tài)丰辣,CMD7把設(shè)備從Disconnect State切換到Programming State。
在以上兩種情況下飘哨,使用當(dāng)前的RCA會(huì)選擇設(shè)備芽隆,任何其他RCA 地址都會(huì)取消選擇胚吁。使用RCA 0x0000表示取消選擇。
command?. index = CMD7 ? ? /*!< Select Card */
command . argument = card->relativeAddress << 16U ?//選擇卡
command . argument?=?0x0000 ? ? //取消選擇
command . responseType = uSDHC_RESPONSE_TYPE_R1
7)host?發(fā)送?CMD23 用來(lái)設(shè)置卡的讀寫塊數(shù)目
參數(shù):
[30] '0' non-packed '1' packed
[24] forced programming, 設(shè)置為1,強(qiáng)迫數(shù)據(jù)直接寫入存儲(chǔ)介質(zhì)半抱,而不是僅寫入cache
[15:0] number of blocks, 定義讀寫塊數(shù)目
command . index = CMD23 ? ? ? ? ? ? ? ?/*!< Set Block Count */
command . argument = blockCount ??
command . responseType = uSDHC_RESPONSE_TYPE_R1
8)host?發(fā)送?CMD16 設(shè)置接下來(lái)所有block命令(讀和寫)的block尺寸窿侈。缺省的塊長(zhǎng)度在CSD中指定。
參數(shù)[31:0] : block長(zhǎng)度
command . index = CMD16?; ? ? ?/*!< Set Block Length */
command . argument = blockSize
command . responseType = uSDHC_RESPONSE_TYPE_R1
9)host?發(fā)送?CMD6?切換設(shè)備的操作模式或者修改EXT_CSD寄存器,SWITCH命令可以用來(lái)寫EXT_CSD或者改變命令集乘瓤。如果SWITCH命令用來(lái)改變命令集衙傀,那么Index和Value被忽略不會(huì)修改EXT_CSD; 如果SWITCH用來(lái)寫EXT_CSD寄存器,Cmd Set被忽略危队。
參數(shù)
[31:26] Set to 0
[25:24] Access聪建, 00 切換command set; 01 設(shè)置Value中指定的位; 10 清除Value中指定的位; 11 寫入Value指定的值。
[23:16] Index茫陆, EXT_CSD的索引值,index值為0~255簿盅,但是僅僅0~191為有效索引值挥下。
[15:8] Value,
[7:3] Set to 0
[2:0] Cmd Set 桨醋,要切換的command set
command . index = CMD6 ? ? ? ? ? ? ??? ?/*!< Switch */
command . argument = 0x3b70100U ? ? ?//參數(shù)
command . responseType = uSDHC_RESPONSE_TYPE_R1b
(4)在非高速模式下設(shè)置設(shè)置?uSDHC最大頻率為?52MHZ棚瘟。參見(jiàn)(1)的設(shè)置方法。
(5)設(shè)置uSDHC的數(shù)據(jù)總線模式為4位喜最。
uSDHC_PROT_CTRL [DTW] = 0x01