NAND Flash 內存放資料的方式,也和HD類似,是以塊狀的方式存放,但是和HD不一樣的是,NAND Flash 保有Nor Flash 的特性,只能一塊一塊的erase。
NAND Flash 內的儲存單位有一些名稱:
Block : 最大的單位,也是erase的單位。
Pages: 內部buffer讀取的單位,一個Block有64 個Pages。
一個Page 內含 2k Bytes 的一般data,和額外64 bytes 的輔助資料空間。
雖然有這樣的區分,但是實際上2k和64 bytes之間並沒有區動作,64 byte的功能是讓programmer自行運用的。一般用來存放ECC,或是wearing 資料..NAND Flash 內部和HD一樣 有一個buffer,buffer大小剛好是一個pages,buffer作為NAND Flash 內部儲存元件與外界溝通的空間,所有 data I/O 動作都要藉由buffer完成:
- 讀取動作:下command要求buffer將某一pages的內容讀入buffer,MCU再一一將buffer的資料讀出。
- 寫入動作:先告訴buffer要作write動作,接著輸入1個page的資料,完成後,請buffer將資料寫入(某一)page。
programming guid 有說明:也可以不做erase 動作,只要你知道你要寫入的區域都是1111..也就是未曾使用過的區域。MCU Interface Protocol
同樣的,寫入資料時,"1"應視為"don't change",也就是不改變該bit內容的意思。
如前所述,靠著CLE/ALE/RE/WE 來決定IOx8 的內容
- CLE : Command Latch Enable - 目前IOx8的內容是command
- ALE:Address Latch Enable - 目前IOx8的內容是Address
- RE : Read Enable - 目前IOx8 作read 動作
- WE: Write Enable - 目前IOx8 作write動作
RE/WE除了指示IOx8 的"方向"外,同時作 latch 的signal。Protocol 區分為以下幾段:
- Command : 送出Command Code,表示目前的操作
- Address : 該Command 操作的 Address
- Data : 資料
- Command : 第二個command,通常代表command確認,結束。
Address
Address的指定方式和內部構造一樣,分為 Block Index (address), Pages Index (address) 和 Byte Address。 分別指定:第幾個Block,該Block中的第幾個Pages,和該Page中的第幾個Byte。
由於IO只有8條,所以address要分成多次輸入:
- Byte Address 0-7
- Byte Address 8-11
- Page Address 0-5 + Block Address 0 -1
- Block Address 2-9
- Block Address 10
這5個Address不是每一個command都需要,有些需要1, 2,有些需要4,5,有些command不需要Address資料。
以下針對各動作的protocol說明
Read
- 送出Command 00h
- 送出要讀取的Address ,如:的3個block,的100個pages的第34 bytes開始。-
- 送出Command 30h - Read Confirm
- 等NAND buffer將該page的資料讀進buffer中
- 每一個RE依序輸出一個byte的資料,從Address指定的位置開始,可以讀任意個,但是只能在同一個page中,當讀取超出該page時,會讀到錯的資料。
在剛剛的Read 過程中,RE輸出data的階段,如果想跳到同一個pages的其他位置去讀取,可以在用 Command 05 插入RE的讀取動作中,修改讀取的address:
- RE.....
- Command 05h
- Address - 2 cycles就可以,因為限定在同一個page中,所以不用送pages 和block address。
- Command E0h - Confirm
- RE...從新的位置開始讀取...
和Read 類似,對整個page動作:
- Command 80h
- Address - 5 cycles, 指定從block-pages-start address開始..
- Data - 開始輸入要write的資料, WE clock..依次輸入...
- Command 10h - Confirm
Command 80h 會將NAND Flash 內部的buffer 清為FFh,接下來的Address,代表你要對從哪一個Block的哪一個page的哪一個位址開始"修改資料",然後data cycle 就開始從那個位置開始將buffer的data update成你輸入的data。Random input
和Random Read一樣,在輸入資料的階段 WR...,可以用Command 85 + 2 Address cycle 改變要輸入的位址,接著繼續輸入資料。
以上可以看出 NAND Flash 內部buffer有一個pointer,代表buffer R/W的位址,每次R/W後會自動+1, 85h command就是更動該pointer資料的command。
2 則留言:
感謝分享
很棒歐 幫了大忙 感謝
張貼留言