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存儲器.