Flash編程原理都是只能將1寫為0,而不能將0寫成1.所以在Flash編程之前,必須將對應的塊擦除,而擦除的過程就是將所有位都寫為1的過程,塊內的所有字節變為0xFF.因此可以說,編程是將相應位寫0的過程,而擦除是將相應位寫1的過程,兩者的執行過程完全相反.
(1)閃存芯片讀寫的基本單位不同
應用程序對NorFlash芯片操作以“字”為基本單位.為了方便對大容量NorFlash閃存的管理,通常將NOR閃存分成大小為128KB或64KB的邏輯塊,有時塊內還分扇區.讀寫時需要同時指定邏輯塊號和塊內偏移.應用程序對NandFlash芯片操作是以“塊”為基本單位.NAND閃存的塊比較小,一般是8KB,然后每塊又分成頁,頁大小一般是512字節.要修改NandFlash芯片中一個字節,必須重寫整個數據塊.
(2)NorFlash閃存是隨機存儲介質,用於數據量較小的場合;NandFlash閃存是連續存儲介質,適合存放大的數據.
(3)由於NorFlash地址線和數據線分開,所以NorFlash芯片可以像SDRAM一樣連在數據線上.NOR芯片的使用類似於通常內存芯片,傳輸效率高,可執行程序可以在芯片內執行(XI P, eXecute In Place),這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中.由於NorFlash的這個特點,嵌入式系統中經常將NOR芯片做啟動芯片使用.NandFlash共用地址和數據總線,需要額外聯結一些控制的輸入輸出,所以直接將NAND芯片做啟動芯片比較難.
(4)NandFlash閃存芯片因為共用地址和數據總線的原因,不允許對一個字節甚至一個塊進行的數據清空,只能對一個固定大小的區域進行清零操作;NorFlash芯片可以對字進行操作.所以在處理小數據量的I/O操作的時候的速度要快與NorFlash的速度.比如一塊NorFlash芯片通常寫一個字需要10us,在32位總線上寫512字節需要1280us;NandFlash閃存寫512字節需要的時間包括:512×每字節50ns+10us的尋頁時間+200us的片擦寫時間=234us.
(5)NandFlash閃存的容量比較大,最大容量己達到8G字節.為了方便管理,NandFlash的存儲空間使用了塊和頁兩級存儲體系,也就是說它的存儲空間是二維的,比如K9F5608UOA閃存塊的大小為16K,每頁大小是512字節,每頁還16字節空閑區用來存放錯誤校驗碼空間(也稱為out-of-band,OOB空間).在進行寫操作時,NandFlash閃存每次將一個字節的數據放入內部的緩存區,然后再發出“寫指令”進行寫操作.由於對NandFlash閃存的操作都是以塊和頁為單位的,所以在向NandFlash閃存進行大量數據的讀寫時,NAND的速度要快於NOR閃存.
(6)NorFlash閃存的可靠性要高於NandFlash閃存,是因為NorFlash型閃存的接口簡單,數據操作少,位交換操作少,因此可靠性高,極少出現壞區塊,一般用在對可靠性要求高的地方.NandFlash型閃存接口和操作均相對復雜,位交換操作也很多,關鍵性數據更是需安錯誤探測/錯誤更正(EDC/ECC)算法來確保數據的完整性,因此出現問題的幾率要大得多,壞區塊也是不可避免的,而且由於壞區塊是隨機分布的,連糾錯也無法做到.
(7)NANDFlash一般地址線和數據線共用,對讀寫速度有一定影響;NORFlash閃存數據線和地址線分開,相對而言讀寫速度快一些.NANDFlash和NORFlash芯片的共性
首先表現在向芯片中寫數據必須先將芯片中對應的內容清空,然后再寫入,即先擦后寫.只不過NORFlash芯片只用擦寫一個字,而NAND需要擦寫整個塊.其次,閃存擦寫的次數都是有限的.當閃存使用接近使用壽命時,經常會出現寫操作失敗;到達使用壽命時,閃存內部存放的數據雖然可以讀,但不能再進行寫操作了.所以為了防止上面問題的發生,不能對某個特定的區域反復進行寫操作.通常NANDFlash可擦寫次數高於NORFlash芯片,但是由於NANDFlash通常是整塊擦寫,塊內的頁面中如果有一位失效整個塊就會失效,而且由於擦寫過程復雜,失敗的概率相對較高,所以從整體上來說NOR的壽命較長.
另一個共性是閃存的讀寫操作不僅僅是一個物理操作,實際上在閃存上存放數據必須使用算法實現,這個模塊一般在驅動程序的MTD'(Memory Technology Drivers)模塊中或者在FTLZ (Flash Translation Layer)層內實現,具體算法和芯片的生產廠商以及芯片型號有關系.通過比較可以發現,NAND更適用於復雜的文件應用,但是由於NAND芯片的使用相對復雜,所以對文件系統有較高的要求.
(8)接口對比
NorFlash帶有通用的SRAM接口,可以輕松地掛接在CPU的地址、數據總線上,對CPU的接口要求低。NorFlash的特點是芯片內執行(XIP,eXecute In Place),這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中.如uboot中的ro段可以直接在NorFlash上運行,只需要把rw和zi段拷貝到RAM中運行即可.
NandFlash器件使用復雜的I/O口來串行地存取數據,8個引腳用來傳送控制、地址和數據信息。由於時序較為復雜,所以一般CPU最好集成NandFlash控制器.另外由於NandFlash沒有掛接在地址總線上,所以如果想用NandFlash作為系統的啟動盤,就需要CPU具備特殊的功能,如s3c2410在被選擇為NandFlash啟動方式時會在上電時自動讀取NandFlash的4k數據到地址0的SRAM中.如果CPU不具備這種特殊功能,用戶不能直接運行NandFlash上的代碼,那可以采取其他方式,比如好多使用NandFlash的開發板除了使用NandFlash以外,還用上了一塊小的NorFlash來運行啟動代碼.
(9)容量和成本對比
相比起NandFlash來說,NorFlash的容量要小,一般在1~16MByte左右,一些新工藝采用了芯片疊加技術可以把NorFlash的容量做得大一些.在價格方面,NorFlash相比NandFlash來說較高,如目前市場上一片4Mbyte的AM29lv320 NorFlash零售價在20元左右,而一片128MByte的k9f1g08 NandFlash零售價在30元左右. NandFlash生產過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,這樣也就相應地降低了價格.
(10)可靠性性對比
NandFlash器件中的壞塊是隨機分布的,以前也曾有過消除壞塊的努力,但發現成品率太低,代價太高,根本不划算.Nand器件需要對介質進行初始化掃描以發現壞塊,並將壞塊標記為不可用.在已制成的器件中,如果通過可靠的方法不能進行這項處理,將導致高故障率。而壞塊問題在NorFlash上是不存在的.
在Flash的位翻轉(一個bit位發生翻轉)現象上,NAND的出現幾率要比NorFlash大得多.這個問題在Flash存儲關鍵文件時是致命的,所以在使用NandFlash時建議同時使用EDC/ECC等校驗算法.
(11)升級對比
NorFlash的升級較為麻煩,因為不同容量的NorFlash的地址線需求不一樣,所以在更換不同容量的NorFlash芯片時不方便.通常我們會通過在電路板的地址線上做一些跳接電阻來解決這樣的問題,針對不同容量的NorFlash. 而不同容量的NandFlash的接口是固定的,所以升級簡單.
(12)讀寫性能對比
寫操作:任何flash器件的寫入操作都只能在空或已擦除的單元內進行.NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為1.擦除NOR器件時是以64~128KB的塊進行的,執行一個擦除/寫入操作的時間約為5s.擦除NAND器件是以8~32KB的塊進行的,執行一個擦除/寫入操作最多只需要4ms. 讀操作:NOR的讀速度比NAND稍快一些.
(13)文件系統比較
Linux系統中采用MTD來管理不同類型的Flash芯片,包括NandFlash和NorFlash.支持在Flash上運行的常用文件系統有cramfs、jffs、jffs2、yaffs、yaffs2等.cramfs文件系統是只讀文件系統.如果想在Flash上實現讀寫操作,通常在NorFlash上我們會選取jffs及jffs2文件系統,在NandFlash上選用yaffs或yaffs2文件系統.Yaffs2文件系統支持大頁(大於512字節/頁)的NandFlash存儲器.