11.08.2006

NAND Flash

NAND Flash 使用類似HD一樣的操作方式來動作,他和MCU 的interface是 8(some use 16) 條 command/Data/Address 控制線(稱為IO),配上CLE/ALE/CE/RE/WE 控制線來辨別目前IO 傳遞的內容。

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。
和NOR Flash 一樣,寫入的動作需要先作erase,Erase將所有data bit社為1,program是把bit 清為0。
programming guid 有說明:也可以不做erase 動作,只要你知道你要寫入的區域都是1111..也就是未曾使用過的區域。
同樣的,寫入資料時,"1"應視為"don't change",也就是不改變該bit內容的意思。
MCU Interface Protocol

如前所述,靠著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 區分為以下幾段:
  1. Command : 送出Command Code,表示目前的操作
  2. Address : 該Command 操作的 Address
  3. Data : 資料
  4. Command : 第二個command,通常代表command確認,結束。
不是所有的動作都需要有這四段,有些動作不需要Address,有些不需要Data。

Address

Address的指定方式和內部構造一樣,分為 Block Index (address), Pages Index (address) 和 Byte Address。 分別指定:第幾個Block,該Block中的第幾個Pages,和該Page中的第幾個Byte。
由於IO只有8條,所以address要分成多次輸入:
  1. Byte Address 0-7
  2. Byte Address 8-11
  3. Page Address 0-5 + Block Address 0 -1
  4. Block Address 2-9
  5. Block Address 10
這5個Address不是每一個command都需要,有些需要1, 2,有些需要4,5,有些command不需要Address資料。

以下針對各動作的protocol說明

Read
  1. 送出Command 00h
  2. 送出要讀取的Address ,如:的3個block,的100個pages的第34 bytes開始。-
  3. 送出Command 30h - Read Confirm
  4. 等NAND buffer將該page的資料讀進buffer中
  5. 每一個RE依序輸出一個byte的資料,從Address指定的位置開始,可以讀任意個,但是只能在同一個page中,當讀取超出該page時,會讀到錯的資料。
Random Read

在剛剛的Read 過程中,RE輸出data的階段,如果想跳到同一個pages的其他位置去讀取,可以在用 Command 05 插入RE的讀取動作中,修改讀取的address:
  1. RE.....
  2. Command 05h
  3. Address - 2 cycles就可以,因為限定在同一個page中,所以不用送pages 和block address。
  4. Command E0h - Confirm
  5. RE...從新的位置開始讀取...
Write (Program)

和Read 類似,對整個page動作:
  1. Command 80h
  2. Address - 5 cycles, 指定從block-pages-start address開始..
  3. Data - 開始輸入要write的資料, WE clock..依次輸入...
  4. 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 則留言:

匿名 提到...

感謝分享

匿名 提到...

很棒歐 幫了大忙 感謝