|
LH79520 DMAC(DMA控制器)將數(shù)據(jù)送入/送出片上SSP。
LH79520 SSP的驅(qū)動(dòng)為lh79520_ssp_driver.c。MMC接口的驅(qū)動(dòng)為lh79520_mmc_driver.c。
4.2 時(shí)鐘控制
SPI主機(jī)使用SPI總線時(shí)鐘信號(hào)將卡設(shè)置為節(jié)能模式,或者控制總線的數(shù)據(jù)流(避免under-run 或over-run的狀態(tài))。主機(jī)可以改變時(shí)鐘頻率或者將之完全停止。
以下是幾個(gè)SPI主機(jī)必須遵守的原則:
•主機(jī)頻率可以隨時(shí)改變,但是由MMC定義的最大的數(shù)據(jù)傳送頻率除外。
•時(shí)鐘必須為MMC輸出數(shù)據(jù)或者響應(yīng)令牌工作。在完成最后的SPI總線程序之后,主機(jī)還需要提供8個(gè)時(shí)鐘周期,使卡可以在關(guān)閉時(shí)鐘前完成操作。
在這8個(gè)時(shí)鐘周期中,CS信號(hào)的狀態(tài)是不相關(guān)的。
4.3 SPI總線程序
以下是不同SPI總線程序的例子
•一個(gè)命令/響應(yīng)程序。在卡響應(yīng)最后位之后必須輸出8個(gè)時(shí)鐘。
•一個(gè)讀取數(shù)據(jù)程序。在最后數(shù)據(jù)塊的尾位必須輸出8個(gè)時(shí)鐘。
•一個(gè)寫入數(shù)據(jù)程序。在最后一個(gè)數(shù)據(jù)塊的尾位必須輸出8個(gè)時(shí)鐘。
•一個(gè)寫入數(shù)據(jù)程序。在CRC狀態(tài)令牌后必須輸出8個(gè)時(shí)鐘。
•主機(jī)可以停止處于“BUSY”狀態(tài)下卡的時(shí)鐘。在沒有主機(jī)時(shí)鐘的條件下,MMC也可以完成編程操作,但是主機(jī)必須提供一個(gè)時(shí)鐘邊沿,是卡切斷BUSY信號(hào)。如果沒有這個(gè)時(shí)鐘邊沿,MMC將使DataOut線位低,且一直保持下去。
4.4 模式選擇
在本文中,我們使用的使MMC的SPI模式。在本文中描述的所有程序都是基于這個(gè)SPI模式的。
在MultiMedia-Card模式下,MMC被喚醒。在接收Reset命令中,如果CS信號(hào)(MMC的引腳1)被斷言為“低”,那么將進(jìn)入SPI模式。如果卡是處于MultiMediaCard模式,那么它不會(huì)對(duì)以SPI為基礎(chǔ)的命令做出響應(yīng)。
如果要求進(jìn)入SPI模式,那么卡將響應(yīng)SPI模式。
重啟卡回復(fù)到MultiMediaCard模式。在SPI模式下,不使用MultiMediaCard協(xié)議狀態(tài)。SPI模式支持下的MultiMediaCard命令也可以執(zhí)行。
當(dāng)一個(gè)電源回路后卡沒有回到MultiMediaCard模式,引腳1(CS)必須為“低”,CMD0(CRC隨后)將送到CMD(DataIn,引腳2),知道卡進(jìn)入SPI模式。
在SPI模式下,不能進(jìn)行CRC檢測。但是,因?yàn)榭ń?jīng)常在MultiMediaCard模式下啟動(dòng),所以CMD0必須跟一個(gè)空CRC字節(jié)(即使命令使用SPI結(jié)構(gòu)傳送也是如此)。一旦卡進(jìn)入SPI模式,CRC可能無法使用。
這個(gè)CMD0命令(0x40 0x00 0x00 0x00 0x00 0x95)和將MMC從MultiMediaCard模式轉(zhuǎn)換到SPI模式的命令是一樣的。在傳送出這個(gè)命令之后,CRC檢查無法使用,除非你強(qiáng)制進(jìn)行。當(dāng)CRC檢測重視,6字節(jié)命令的最后以為將被視為讀取/寫入命令。
4.5 命令和響應(yīng)
在MMC命令格式中,一個(gè)命令由6字節(jié)組成,先傳送MSB。一旦SPI模式設(shè)置為8-bit數(shù)據(jù)寬度,那么6字節(jié)的命令將持續(xù)的傳送。
命令響應(yīng)會(huì)有點(diǎn)復(fù)雜。響應(yīng)的開始位不會(huì)緊隨字節(jié)的第一個(gè)時(shí)鐘,而是在時(shí)鐘流的任何一個(gè)地方產(chǎn)生,主要視MMC和時(shí)鐘的速度決定。因此需要進(jìn)行軟件的人工安排。
4.6 復(fù)位程序
初始化命令如下:
1. Send 80 clocks to start bus communication
2. Assert nCS LOW
3. Send CMD0
4. Send 8 clocks for delay
5. Wait for a valid response
6. If there is no response, back to step 4
7. Send 8 clocks of delay
8. Send CMD1
9. Send 8 clocks of delay
10. Wait for valid response
11. Send 8 clocks of delay
12. Repeat from step 9 until the response shows READY.
CMD1會(huì)花費(fèi)大量周期完成這個(gè)程序。在每個(gè)電源回路之后,MC都會(huì)進(jìn)入閑置狀態(tài)(不活躍)。如果使用CMD13(SEND_STATUS)檢查狀態(tài)的話,響應(yīng)中的閑置位為1。只有當(dāng)MMC從閑置模式轉(zhuǎn)為活躍時(shí),卡才能進(jìn)行讀取和寫入操作。
4.7 數(shù)據(jù)讀取
SPI模式支持單個(gè)區(qū)塊讀取操作。一句一個(gè)有效讀取命令的接收,卡將發(fā)出一個(gè)響應(yīng)令牌,長度由之前的SET_BLOCK_LENGTH命令決定。開始地址可以是卡中有效地址中的任意一個(gè)。。但是每個(gè)區(qū)塊必須保存在單個(gè)物理扇區(qū)里。在微控制器將數(shù)據(jù)讀取的命令傳送到卡后,微控制器監(jiān)督數(shù)據(jù)流的輸入,等待數(shù)據(jù)令牌0xFE。當(dāng)響應(yīng)開始位0在時(shí)鐘流中任意一個(gè)時(shí)間產(chǎn)生,我們必須使用軟件來安排字節(jié)讀取的順序。
4.8 數(shù)據(jù)寫入
數(shù)據(jù)寫入操與數(shù)據(jù)讀取一樣。在SPI模式下,MMC支持單個(gè)區(qū)塊的寫入。
卡在接受到有效的寫入命令之后,會(huì)產(chǎn)生一個(gè)響應(yīng)令牌,等到數(shù)據(jù)區(qū)塊從主機(jī)傳送過來。但是唯一有效的區(qū)塊長度位512字節(jié)。在接收一個(gè)數(shù)據(jù)區(qū)塊后,卡將產(chǎn)生數(shù)據(jù)響應(yīng)令牌。如果數(shù)據(jù)區(qū)塊接收沒有問題,那么馬上將進(jìn)行編程。
微控制器必須發(fā)出第一個(gè)寫入命令。在所有的字節(jié)都被送出之后,微控制器等待響應(yīng)。收到響應(yīng)之后,微控制器會(huì)檢查響應(yīng)中是否有錯(cuò)誤。在響應(yīng)被送回到卡之后,卡將DataOut設(shè)置為“低”,開始寫入操作。
4.9 數(shù)據(jù)擦除
數(shù)據(jù)擦除與數(shù)據(jù)讀取和寫入的程序相似。
4.10 讀取FAT16文件系統(tǒng)
雖然MMC撮弄初期空間可進(jìn)通過0到最后一個(gè)字節(jié)的地址范圍對(duì)字節(jié)進(jìn)行編碼,但是這并不是一個(gè)簡單的排列,而是應(yīng)該分成若干個(gè)分支。
存儲(chǔ)字節(jié)粉為512字節(jié)的區(qū)塊,稱為扇區(qū)。每個(gè)區(qū)塊可以獨(dú)立讀取、寫入和擦除。
扇區(qū)根據(jù)卡的容量分為16或32個(gè)扇區(qū)。任何分組扇區(qū)或者擦除扇區(qū)的組合都可以由一個(gè)單獨(dú)的擦除命令進(jìn)行擦除。一個(gè)寫入命令在寫入新的數(shù)據(jù)之前都將存儲(chǔ)器先擦除。對(duì)未進(jìn)行擦除的存儲(chǔ)器先進(jìn)行擦除可以加速緊接著的寫入操作。
FAT16文件系統(tǒng)通常在PC上使用,也很容易找到讀卡器對(duì)Multi- MediaCard進(jìn)行格式化。在MMC被格式化為FAT16后,字節(jié)0到字節(jié)0x200都會(huì)被用作為FAT16格式,在扇區(qū)0中的512字節(jié)也被成為Master Boot Record (MBR),具體格式見表13。
表13:FAT16 Master Boot Record
在MBR中,每個(gè)分區(qū)項(xiàng)目見表14。
表14:FAT分區(qū)項(xiàng)目
結(jié)論:使用LH79520的SPI接口對(duì)MMC卡進(jìn)行讀取和寫入是很實(shí)用的一種應(yīng)用。本文為你提供一種使用LH79520進(jìn)行MMC設(shè)計(jì)的基礎(chǔ)。
|