前面了解了隨機存取存儲器的基本原理,其主要是通過電容的充放電來保證數據的讀寫,當掉電后,其數據也丟失了,這節我們主要學習下flash的基本組成和原理。現在Flash在嵌入式系統中的地位和pc上的硬盤類似,用於保存系統運行所必須的系統,數據和應用層序,與內存掉電后丟失不同,它在掉點后仍可永久保存。
1. 閃存存儲單元
對於閃存,我們常見的有SLC和MLC兩種,細分還有eSLC和eMLC等,因為閃存式一種電壓元件,因此它是以不同的電壓范圍來代表不同的數據,現在看看兩者之間的區別。
1) SLC(single-level cell):單階存儲單元,也就是閃存的每一個存儲單元存儲1bit的數據,存儲的數據代表0還是1是基於vth的電壓閾值來判定,對於閃存寫入,就是對其進行充電,使得它的電壓值超過電壓判定點A,存儲單元就表示為0(已編程),如果沒有充電或者電壓閾值低於A點,就表示1(已擦除)。主要針對軍工,企業級應用,有着高速寫入,低出錯率和耐用性。

2)MLC(Multi-level cell)多階存儲單元,其是以每個存儲單元存儲2bit的數據,存儲的數據是"00","01","10","11"也是基於電壓的閾值的判定,其被分成4份。相對於SLC,MLC的每個單元是2bit,那么其容量也會大一些,同時其存儲單元中存放更多的數據,那么其結構也相對復雜,出錯的機會也比較大。主要針對的是消費級應用,有着高容量,低成本,使用於USB閃存,手機,數碼相機等存儲卡。

2. 閃存內部原理
由其存儲的顆粒結構,知道閃存式一種電壓元件,其靠電壓來存儲數據,那么來看看其結構以及工作原理。閃存的內部存儲結構是金屬-氧化層-半導體-場效應管(MOSFET):源極,漏極和柵極,其工作原理與場效應管類似,都是電壓利用控制源極和漏極之間的通斷,不同的是場效應管是單柵極結構,而閃存式雙柵極結構,在柵極和硅襯底之間還有一個浮置柵極,浮置柵極是有氮化物夾在二氧化硅材料之間構成。

1) 對於閃存的寫入,即控制柵極去充電,對柵極加壓,使得浮置柵極存儲的電荷越多,超過閾值,就表示0
2) 對於閃存的擦除,即對浮置柵極進行放電,低於閾值,就表示1
理解了閃存保存數據的基本原理后,我們來針對K9F1G08X0C這款芯片來看看其硬件組成和工作原理。其管腳分布如下
| 信號名稱 | 管腳名稱 | 類型 | 描述 |
| 數據線 | I/O0 ~ I/O7 | INPUTS/OUTPUTS | 用來傳輸命令/地址/數據,僅在讀操作的時候用來輸出數據 |
| 命令鎖存使能 | CLE | Input | CLE為高時,在WE#上升沿,命令通過I/O[7:0]鎖存到命令寄存器,當不傳輸命令時,CLE應該為低 |
| 地址鎖存使能 | ALE | Input | ALE為高時,在WE#下降沿,地址信息通過I/O[7:0]鎖存片內的地址寄存器。如果傳輸的不是地址信息,ALE應該為低 |
| 片選 | CE# | Input | 一旦器件進入PROGRAM或ERASE操作,CE#可以變無效 |
| 讀使能 | RE# | Input | |
| 寫使能 | WE# | Input | 在WE#上升沿命令/地址/數據鎖存 |
| 寫保護 | WP# | Input | 當為低時候,所有的PROGRAM和ERASE都被禁止 |
| 准備/忙狀態 | R/B | 集電極開路輸出。外部需要接上拉電阻,這個腳表示芯片正在進行PROGRAM或ERASE操作。在讀操作期間,表示數據正從陣列中傳輸到串行數據寄存器中,一旦這些操作完成,R/B#回到High-Z狀態。 | |
| 電源 | VCC | ||
| 地 | VSS |
由上面來看,nandflash的外圍引腳很少,沒有地址線,只有數據線,相對於由數據線和地址線的norflash,大大的減少了引腳數目,使得芯片的體積更小,硬件設計也更簡單。現在的數據線是復用的,也就是說既可以傳數據,也可以傳地址,也可以傳命令,那么是怎么做到的呢?硬件為了區分當前到底是需要傳啥?設計了了CLE/ALE命令,所以你必須先發一個CLE/ALE命令,告訴控制器,我現在是命令還是地址,這樣就能識別並做相應的處理。我們了解了硬件的連接,那么對於flash是怎么存儲的呢?下面來看看這款芯片的的存儲布局

由圖可以看出一片Nand flash為一個設備(device),其數據存儲分層為:
1. 1個設備(device)=1024個塊(Blocks),塊也是Nand flash擦除操作的最小單位。
2. 1個塊(block) = 64頁(Pages),頁是Nand flash寫入的最小單位,對於每一個頁,由數據塊區域和空閑區域。數據區,也容易理解,就是存儲一些數據,而對於空閑區,一般也叫做OOB(out of Band),這個區域,是基於Nand flash的硬件特性設計的,Nand flash在數據讀寫的時候很容易錯誤,所以為了保證數據的正確性,必須要有對應的檢測和糾錯的機制,此機制就被叫做ECC,所以設計了該多余的區域,用來放置數據的校驗值。
3. 1個頁(page) = 數據塊大小(2K)+OOB塊大小(64Bytes)
那么通過上面我們就可以計算出怎么訪問一個物理地址:塊大小*塊號+頁大小*頁號+頁內地址。
從硬件的圖來看,對於K9F1G08X0C這款芯片,其容量為132MB,那么就應該需要28條地址先,而現在只有8條地址線,對於Nand flash就導入了地址周期的概念,對於該款flash,所以需要4個周期:2個列地址(Column)周期和2個行地址(ROW)周期。從下面的功能框圖來看,對於列地址A0--A11,就是頁內地址,地址范圍就是0--4094,與頁內地址(2K+64)吻合,其實對於頁內地址,其實只需要A0-A10,而對於多出來的A11,是用來表示頁內的oob區域。那么對於A12-A27就是用來表示屬於哪一個塊和塊里面的哪一個頁號。

通過前面對於nand flash的基本原理的講解,下面來看看怎么操作nand flash,下面是K9F1G08X0C支持的命令格式。

下圖是發送一個命令/地址/數據的完整過程



通過時序圖看出,上面有很多時間參數,在設置Nand flash控制器的時候,需要確認這些時間參數是否在合適的范圍內,對於控制命令都是通過上面的幾個基礎命令組合而來,此時對於nand flash的基本控制方式和原理已經介紹完。
