• 沒有找到結果。

1028h R/W 為一啟動 MMC_CMD 裡 state machine 的暫存器,

不管填入值為何,都會讓底層電路 MMC_CMD 發送出 48 位元的時序

STATUS Register

1029h R/W MMC.VHD 這個電路內部的狀態暫存器。

Bit0 :1 表示發送 command 出現 CRC 錯誤 Bit1 :1 表示 data 傳輸出現 CRC 錯誤

Bit2 :1 表示發送 command 包含接收 response 的 過程結束

Bit3 :1 表示讀寫 MMC 的過程結束 其餘 bit 則保留未用

48 位元的 command response Register

102Ah

~ 102Eh

R 從 102Ah 至 102Eh 的 5 個 8 位元暫存器主要是依 序儲存前 40 位元的 response,最後的 7 位元 CRC 和 end bit 則不予以儲存

136 位元的 command response Register

102Fh

~ 103Eh

R 從 102Fh 到 103Eh 的 16 個 8 位元暫存器主要是依 序儲存 136 位元的 response 裡頭的後 128 位元的 CID 或 CSD

表 5-1 MMC.VHD 電路裡定義的暫存器

表 5-1 裡的暫存器,關於 MMC_CMD.VHD 的是 CMD_WORD、ARG3~ARG0 這 5 個參數值,再藉由 SEND CMD Register把這些參數按照規格書[4]裡定義的 時序送出去給 MMC。而 response 則根據長度的不同,存在 102Ah~102Eh 或是 102Fh~103Eh 的暫存器裡。

而關於 MMC_DAT.VHD 的則是 MB_LEN、Control Register,分別是定義 data transfer 的長度為幾個 block,以及讀、寫 single block 或是 multiple block 等控制 MMC_DAT 裡的 state machine 的參數。

剩下的就是一個 status register,裡面可以讓 host 查詢到 command 或 data 傳 輸時是否有 CRC error,以及發送 command、接收 response、讀寫 MMC 內部資 料等過程是否已經結束,等 4 個狀態。

(一) CRC7.VHD 設計說明

bit0 bit1 bit2 bit3 bit4 bit5 bit6

data in

data out

圖 5-4 CRC7 generator/checker

在圖 5-4 我們可以看到 MMC_CMD.VHD 裡會使用的到一個編碼和解碼電 路,它的組成非常簡單,只有 7 個 Flip-Flop 和 2 個 XOR 而已,電路 reset 後,7 個 Flip-Flop 都為 0,操作的方法為,串列資料依序從 data in的地方輸入,每個 clock 來時,便依照箭頭的方向移動,當資料傳輸完畢,即暫停 clock 的輸入,7 個 Flip-Flop 內含的值就是一組錯誤檢查碼,這組錯誤檢查碼將附加在真正的資 料後面,傳遞給 MMC,MMC 內部也會有一個同樣的 CRC7 電路,用來檢查傳 輸過程中,資料是否發生錯誤,若傳輸過程無誤,則真正的資料加上 7 位元的錯 誤檢查碼,在通過 CRC7 電路後,會讓 7 個 Flip-Flop 的值都為 0,若是發生 7 個 Flip-Flop 的值有一個不為 0,則代表資料傳輸過程發生錯誤了。同樣的,在 MMC 回傳 response 給 FPGA 時,會在真正的資料後面附加一組錯誤檢查碼,

FPGA 內部的 CRC7 電路也會依照前述的方法判斷是否有資料傳輸錯誤發生。

(二) CRC16.VHD 設計說明

data in

dataout bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7bit8 bit9 bit10bit11bit12 bit13 bit14 bit15

圖 5-5 CRC16 generator/checker

CRC16 的電路則如圖 5-5 所示,由 16 個 Flip-Flop 和 3 個 XOR 所組成的,

它的操作方法和 CRC7 是一樣的,差別在於 CRC7 是用在 MMC 的 CMD 腳位,

它的資料長度為 40 個位元,而 CRC16 是用在 MMC 的 DAT 腳位,它的資料長 度為 512 bytes。

(三) MMC_CMD.VHD 設計說明

這個部分的電路設計,主體是一個 state machine,它的功能為發送 48 位元 的 command 給 MMC,以及根據發送的 command 來決定 MMC 有無 response 和 response 的長度。首先我們看到圖 5-6,它是個下給 MMC 的 command 格式的示 意圖,第 1 個位元稱為 start bit,一定為 0,第 2 個位元用來指示資料的方向,1 表示 host 下 command 到 MMC,接下來 6 個位元是用來表示目前下的是第幾個 command,因此可以表示的範圍是介於 0 到 63 這些代號的 command。然後後面 緊接著 4 個 byte 的資料,分別表示 argument 3 到 argument 0,它最大的功用在於 指定 MMC 內部資料儲存的邏輯位址,由於共有 32 位元可以用來定址 MMC,

因此可以知道理論上 MMC 最大的容量可以支援到 232=4G Byte,當然也有些 command 用不到這 4 個參數,因此這 4 個參數送出去什麼值就不重要了。緊接 著 argument 0 的是 7 位元的 CRC 錯誤檢查碼,用來讓 MMC 檢查 command 是否 有傳輸錯誤的情形發生,最後跟著 1 個位元,稱為 end bit,一定為 1,代表 command 已經發送結束了。

0 1 index argument 3 argument 2 argument 1 argument 0 CRC 7 1

6 bits 8 bits 8 bits 8 bits 8 bits 7 bits

圖 5-6 MMC command format

MMC 的 command response,從實際的內容來看,可以分成 5 種,但從硬體的角 度來看只有分成兩種而已,一種長度為 48 位元,另一種長度為 136 位元,所以 這個電路所要支援的便是在送出去 command 之後,判斷這個 command 是否有 response,若有則再判斷 response 的長度是 48 位元還是 136 位元,根據判斷的結 果,來控制 state machine 的運作流程。圖 5-7 列出 48 位元的 R1 type response 格 式,其餘的 R3、R4、R5 也都是跟 R1 屬於同一類型的,只不過內容不相同罷了,

不過這並不影響硬體的設計。圖 5-8 則列出 136 位元的 R2 type response 格式。

0 0 index card status CRC7 1

6 bits 32 bits 7 bits

圖 5-7 R1 type response

0 0 111111 CID or CSD Include internal CRC7 1

6 bits 127 bits

圖 5-8 R2 type response

不管是何種 type 的 response,回傳的第 1 個位元一定是 0,代表 strat bit,第 2 個位元一定是 0,表示現在 CMD 腳位的資料方向是由 MMC 回傳給 host,R1 type 接下來的 32 位元為記憶卡的內部狀態,R2 type接下來的 127 位元則為 CID 或 是 CSD,這儲存著記憶卡內部的許多重要規格和資訊。而不管是何種 type 的 response 最後也都跟著 1 位元的 end bit,表示 response 的結束。

知道要發送的 command 和接收的 response 的格式後,圖 5-9 表示的就是 MMC 的 CMD 腳位會出現的兩種時序,左邊的是沒有 response 的 command,例如:

command 0,右邊的是有 response 的 command,例如:command 17。

圖 5-9 MMC 的 CMD 腳位時序示意圖

而硬體電路方面的設計,基本上就是在 CMD 腳位上,製造出這樣的時序,

host 端在 MMC clock時脈的下降緣丟出資料,則 MMC 會在時脈上升緣接收到 資料,同樣的,回傳 response 時,MMC 也是在 clock 時脈的下降緣時丟出資料,

host 就可以在時脈上升緣接收到資料了。

M M C _C M D .V H D

R e g ister In p u t R e g iste r O u tp u t

S ta rt se n d C o m m a n d S yste m C lo c k In p u t

n R e se t

C M D

M M C C lo c k E n a b le C M D P ro c e ss F in ish C o m m a n d C R C e rro r

圖 5-10 MMC_CMD 的輸入輸出

最後來看圖 5-10,它是 MMC_CMD 這個電路的輸入輸出示意圖,圖中的 register input 是 MMC.VHD 裡頭為 MMC_CMD.VHD 所定義的暫存器,也 就是在 發送 command 前,host 必須把這些暫存器填入欲發送的值,這些值也就是參數,

就會依照時序送出了。而 register output 也就是 state machine 接收到的 48 位元或 136 位元的 response,輸出到上層的 MMC.VHD 裡頭,讓 host 可以讀取。當然這 個電路也會有 clock 和 reset 等基本的訊號,start send command則是啟動發送 command 的訊號。輸出訊號方面,CMD 則是對應到實際 MMC 的 CMD 腳位,

MMC Clock enable 則是一個輸出到 MMC.VHD 的訊號,當發送 command、接收 response 的過程中,這個訊號為 1,其餘時刻則為 0,同樣的在下節裡介紹的 MMC_DAT 這個電路裡,也會有一個 MMC clock enable,當這兩個訊號其中一 個訊號為 1 時,系統的時脈就會接到實際 MMC 的 clock 腳位,當兩者都為 0 時,

MMC 的 clock 腳位就為 0,這樣做可以減少硬體消耗的 power。剩下的兩個輸出 訊號,Command process finish 和 Command CRC error 便是接到上層的 MMC.VHD 裡頭的 status register 裡,用途如表 5-1。

(四) MMC_DAT.VHD 設計說明

MMC 在 DAT 腳位上傳送資料,主要有分成兩種模式,一種為 serial mode,

另一種則為 block mode,serial mode 和 block mode 主要差別是在於,用 serial mode 讀寫的資料長度沒有限制,資料讀取的長度取決於何時下達 stop transfer 這個 command,否則 MMC 會認為 host 還要讀寫資料,但是 block mode 一次讀寫的資料長度是可以設定的,一般來說我們習慣把一個 block 設定為 512 byte,這在配合檔案格式時 會比較方便,而在 block 長度設定後,

MMC 每次傳輸資料便以 block 為最小單位,host 可以選擇下 single block 類 別的 command,一次只讀寫一個 block 長度的資料,也可以下 multiple block 類別的 command,一下讀寫好幾個 block 長度資料。而一個 block 的資料格 式如圖 5-11,起始有個 start bit 0,表示跟隨其後的為真正欲讀寫的資料,在 序列傳輸完 block length x 8 個位元後,緊接跟著 16 位元的 CRC,來檢查資 料傳輸過程中是否有錯誤發生,最後以一個 end bit 1,當作最後一個 block 資料傳輸結束的標記。

圖 5-11 block data 格式

瞭解格式之後,我們來看傳輸資料的時序圖,從 MMC 讀資料和寫資料到 MMC 的時序有幾個不同點,首先我們看到圖 5-12 是從 MMC 讀取三個 block 出 來的示意圖,當 host 下 multiple block read 的 command 之後,不用等到 response 接收完,就可以在 DAT 腳位上等待收取資料了,每個 block 資料傳輸完畢,後 面都會緊跟著 16 位元的 CRC,同樣的情形,重複幾次就表示讀取幾個 block 的 資料回來,最後 host 要下 stop transfer 的 command 來結束整個讀取動作,但是一 旦下了 stop transfer 這個 command 後,正在傳輸中的資料會被破壞掉,這裡個人 認為是 MMC 本身設計上的一個缺點,不過這個問題稍後可以在設計 host 端的 硬體時解決掉。

圖 5-12 MMC multiple block read 示意圖

而在寫資料進入 MMC 的時序方面,則必須等到接收完 response 之後,才可以開 始寫資料,而每寫完一個 block 的資料之後,若資料傳輸無誤,則 MMC 會回傳 010,若傳輸檢查發現 CRC 有誤,則會回傳 101,因此 host 可以根據此點來判斷。

若資料傳輸無誤,由於 MMC 內部要把資料 program 到 flash memory 裡面,這需 要花一些時間,因此 MMC 會把 DAT 腳位拉 low,表示內部正在忙碌狀態,直 到資料被寫進去 flash memory 完畢後,DAT 腳位才會拉 high,結束一個 block 的 寫入動作,而 multiple block 的時序,就是重複上述的動作,直到 host 下 stop transfer 的 command 之後,才會結束整個 multiple block write 的命令。和 multiple block read 一樣,multiple block write在最後一個 block 資料還沒傳輸完畢時,就下 stop

transfer 的命令,會使得最後一個 block 的資料被破壞,因此關於這點,我們在設 計 host 的電路時,也有個解決辦法,這在稍後會介紹。

圖 5-13 MMC multiple block write 示意圖

MMC_DAT.VHD

Register Input Register Output

Satrt Data transfer DAT

MMC Clock Enable System Clock

nReset Buffer Input Full Buffer Output Full Buffer Data Bus Input

Bufferus Data Bus Output Write Buffer Strobe Read Buffer Strobe

MMC2BUF_DIR BUF2MMC_DIR

圖 5-14 MMC_DAT 的輸入輸出

由圖 5-14 我們可以看到 MMC_DAT 這個電路的設計需要的輸入與輸出,首先和 MMC_CMD 一樣的有個 register input 和 register output,register input 給的是控制 這個電路運作模式的訊號,包括:

‧Start:為一啟動訊號,當為 1 時,MMC_DAT 這個 state machine 就啟動,為 0 時,則關閉 state machine。

‧RnW:為一資料流動方向的指示訊號, 1 表示 state machine 走 block read 流程,

0 表示走 block write 的流程。

‧MB: 1 的話表示 host 要作 mulitple block 的 access,0 則表示 single block 的 access。

‧MB_LEN:為一個 16 位元的暫存器,表示 host 欲執行的 block 次數,最大可 支援到 65535 個 block 的 read/write。

Register output 則是輸出以下兩個訊號:

Register output 則是輸出以下兩個訊號:

相關文件