nand flash 裸板驅動,介紹的比較精闢

來源:互聯網
上載者:User
NAND Flash的驅動程式設計

http://www.usr.cc/html/99/n-599.html

1. 硬體特性:
【Flash的硬體實現機制】
Flash全名叫做Flash Memory,屬於非易失性存放裝置(Non-volatile Memory Device),與此相對應的是易失性存放裝置(Volatile Memory Device)。關於什麼是非易失性/易失性,從名字中就可以看出,非易失性就是不容易丟失,資料存放區在這類裝置中,即使斷電了,也不會丟失,這類裝置,除了Flash,還有其他比較常見的入硬碟,ROM等,與此相對的,易失性就是斷電了,資料就丟失了,比如大家常用的記憶體,不論是以前的SDRAM,DDR SDRAM,還是現在的DDR2,DDR3等,都是斷電後,資料就沒了。
Flash的內部儲存是MOSFET,裡面有個懸浮門(Floating Gate),是真正儲存資料的單元。
在Flash之前,紫外線可擦除(uv-erasable)的EPROM,就已經採用用Floating Gate儲存資料這一技術了。

資料在Flash記憶體單元中是以電荷(electrical charge)形式儲存的。儲存電荷的多少,取決於圖中的外部門(external gate)所被施加的電壓,其控制了是向儲存單元中沖入電荷還是使其釋放電荷。而資料的表示,以所儲存的電荷的電壓是否超過一個特定的閾值Vth來表示。

【SLC和MLC的實現機制】
Nand Flash按照內部儲存資料單元的電壓的不同層次,也就是單個記憶體單元中,是儲存1位元據,還是多位元據,可以分為SLC和MLC:
1. SLC,Single Level Cell:
單個儲存單元,只儲存一位元據,表示成1或0.
就是上面介紹的,對於資料的表示,單個儲存單元中內部所儲存電荷的電壓,和某個特定的閾值電壓Vth,相比,如果大於此Vth值,就是表示1,反之,小於Vth,就表示0.
對於nand Flash的資料的寫入1,就是控制External Gate去充電,使得儲存的電荷夠多,超過閾值Vth,就表示1了。而對於寫入0,就是將其放電,電荷減少到小於Vth,就表示0了。
關於為何Nand Flash不能從0變成1,我的理解是,物理上來說,是可以實現每一位的,從0變成1的,但是實際上,對於實際的物理實現,出於效率的考慮,如果對於,每一個儲存單元都能單獨控制,即,0變成1就是,對每一個儲存單元單獨去充電,所需要的硬體實現就很複雜和昂貴,同時,所進行對塊擦除的操作,也就無法實現之前的,一閃而過的速度了,也就失去了Flash的眾多特性了。

2. MLC,Multi Level Cell:
與SLC相對應,就是單個儲存單元,可以儲存多個位,比如2位,4位等。其實現機制,說起來比較簡單,就是,通過控制內部電荷的多少,分成多個閾值,通過控制裡面的電荷多少,而達到我們所需要的儲存成不同的資料。比如,假設輸入電壓是Vin=4V(實際沒有這樣的電壓,此處只是為了舉例方便),那麼,可以設計出2的2次方=4個閾值,1/4的Vin=1V,2/4的Vin=2V,3/4的Vin=3V,Vin=4V,分別表示2位元據00,01,10,11,對於寫入資料,就是充電,通過控制內部的電荷的多少,對應表示不同的資料。
對於讀取,則是通過對應的內部的電流(與Vth成反比),然後通過一系列解碼電路完成讀取,解析出所儲存的資料。這些具體的物理實現,都是有足夠精確的裝置和技術,才能實現精確的資料寫入和讀出的。
單個儲存單元可以儲存2位元據的,稱作2的2次方=4 Level Cell,而不是2 Level Cell,這點,之前差點搞暈了。。。,同理,對於新出的單個儲存單元可以儲存4位元據的,稱作2的4次方=16 Level Cell。

【關於如何識別SLC還是MLC】
Nand Flash設計中,有個命令叫做Read ID,讀取ID,意思是讀取晶片的ID,就像大家的身份證一樣,這裡讀取的ID中,是讀取好幾個位元組,一般最少是4個,新的晶片,支援5個甚至更多,從這些位元組中,可以解析出很多相關的資訊,比如此Nand Flash內部是幾個晶片(chip)所組成的,每個chip包含了幾片(Plane),每一片中的頁大小,塊大小,等等。在這些資訊中,其中有一個,就是識別此flash是SLC還是MLC。下面這個就是最常見的Nand Flash的datasheet中所規定的,第3個位元組,3rd byte,所表示的資訊,其中就有SLC/MLC的識別資訊:

http://www.usr.cc/html/00/n-600.html

是常見的Nand Flash所擁有的引腳(Pin)所對應的功能,簡單翻譯如下:
1. I/O0 ~ I/O7:用於輸入地址/資料/命令,輸出資料
2. CLE:Command Latch Enable,命令鎖存使能,在輸入命令之前,要先在模式寄存器中,設定CLE使能
3. ALE:Address Latch Enable,地址鎖存使能,在輸入地址之前,要先在模式寄存器中,設定ALE使能
4. CE#:Chip Enable,晶片使能,在操作Nand Flash之前,要先選中此晶片,才能操作
5. RE#:Read Enable,讀使能,在讀取資料之前,要先使CE#有效。
6. WE#:Write Enable,寫使能,在寫取資料之前,要先使WE#有效。
7. WP#:Write Protect,防寫保護
8. R/B#:Ready/Busy Output,就緒/忙,主要用於在發送完編程/擦除命令後,檢測這些操作是否完成,忙,表示編程/擦除操作仍在進行中,就緒表示操作完成.
9. Vcc:Power,電源
10. Vss:Ground,接地
11. N.C:Non-Connection,未定義,未串連。
[小常識]
在資料手冊中,你常會看到,對於一個引腳定義,有些字母上面帶一橫杠的,那是說明此引腳/訊號是低電平有效,比如你上面看到的RE頭上有個橫線,就是說明,此RE是低電平有效,此外,為了書寫方便,在字母后面加“#”,也是表示低電平有效,比如我上面寫的CE#;如果字母頭上啥都沒有,就是預設的高電平有效,比如上面的CLE,就是高電平有效。還有的是在前面加個小n,例如nRE,這也是表示低電平有效。
【為何需要ALE和CLE】
突然想明白了,Nand Flash中,為何設計這麼多的命令,把整個系統搞這麼複雜的原因了:
比如命令鎖存使能(Command Latch Enable,CLE)和地址鎖存使能(Address Latch Enable,ALE),那是因為,Nand Flash就8個I/O,而且是複用的,也就是,可以傳資料,也可以傳地址,也可以傳命令,為了區分你當前傳入的到底是啥,所以,先要用發一個CLE(或ALE)命令,告訴nand Flash的控制器一聲,我下面要傳的是命令(或地址),這樣,裡面才能根據傳入的內容,進行對應的動作。否則,nand flash內部,怎麼知道你傳入的是資料,還是地址,還是命令啊,也就無法實現正確的操作了.

【Nand Flash只有8個I/O引腳的好處】
1. 減少外圍引腳:相對於並口(Parellel)的Nor Flash的48或52個引腳來說,的確是大大減小了引腳數目,這樣封裝後的晶片體積,就小很多。現在晶片在向體積更小,功能更強,功耗更低發展,減小晶片體積,就是很大的優勢。同時,減少晶片介面,也意味著使用此晶片的相關的外圍電路會更簡化,避免了繁瑣的硬體連線。
2. 提高系統的可擴充性,因為沒有像其他裝置一樣用物理大小對應的完全數目的addr引腳,在晶片內部換了晶片的大小等的改動,對於用全部的地址addr的引腳,那麼就會引起這些引腳數目的增加,比如容量擴大一倍,地址空間/定址空間擴大一倍,所以,地址線數目/addr引腳數目,就要多加一個,而對於統一用8個I/O的引腳的Nand Flash,由於對外提供的都是統一的8個引腳,內部的晶片大小的變化或者其他的變化,對於外部使用者(比如編寫nand flash驅動的人)來說,不需要關心,只是保證新的晶片,還是遵循同樣的介面,同樣的時序,同樣的命令,就可以了。這樣就提高了系統的擴充性

【Nand flash的一些典型(typical)特性】
1.頁擦除時間是200us,有些慢的有800us。
2.塊擦除時間是1.5ms.
3.頁資料讀取到資料寄存器的時間一般是20us。
4.串列訪問(Serial access)讀取一個資料的時間是25ns,而一些舊的nand flash是30ns,甚至是50ns。
5.輸入輸出連接埠是地址和資料以及命令一起multiplex複用的。
以前老的Nand Flash,編程/擦除時間比較短,比如K9G8G08U0M,才5K次,而後來很多6.nand flash的編程/擦除的壽命,最多允許的次數,以前的nand flash多數是10K次,也就是1萬次,而現在很多新的nand flash,技術提高了,比如,Micron的MT29F1GxxABB,Numonyx的NAND04G-B2D/NAND08G-BxC,都可以達到100K,也就是10萬次的編程/擦除。和之前常見的Nor Flash達到同樣的使用壽命了。
6. 48引腳的TSOP1(K9F1208UOM)封裝或 52引腳的ULGA封裝
【Nand Flash中的特殊硬體結構】
由於nand flash相對其他常見裝置來說,比較特殊,所以,特殊的裝置,也有特殊的設計,所以,有些特殊的硬體特性,就有必要解釋一下:
1. 頁寄存器(Page Register):由於Nand Flash讀取和編程操作來說,一般最小單位是頁,所以,nand flash在硬體設計時候,就考慮到這一特性,對於每一片,都有一個對應的地區,專門用於存放,將要寫入到實體儲存體單元中去的或者剛從儲存單元中讀取出來的,一頁的資料,這個資料緩衝區,本質上就是一個buffer,但是只是名字叫法不同,datasheet裡面叫做Page Register,此處翻譯為頁寄存器,實際理解為頁緩衝,更為恰當些。而正是因為有些人不瞭解此內部結構,才容易產生之前遇到的誤解:以為記憶體裡面的資料,通過Nand Flash的FIFO,寫入到Nand Flash裡面去,就以為立刻實現了實際資料寫入到實體儲存體單元中了。而實際上,只是寫到了這個頁緩衝中,只有等你發了對應的編程第二階段的確認命令0x10之後,實際的編程動作才開始,才開始把頁緩衝中的資料,一點點寫到實體儲存體單元中去。這也是為什麼發完命令0x10之後需要等待一段時間的原因。
所以,簡單總結一下就是,對於資料的流向,實際是經過了如下步驟:

圖4 Nand Flash讀寫時的資料流向
【Nand Flash中的壞塊(Bad Block)】
Nand Flash中,一個塊中含有1個或多個位是壞的,就成為其為壞塊。
壞塊的穩定性是無法保證的,也就是說,不能保證你寫入的資料是對的,或者寫入對了,讀出來也不一定對的。而正常的塊,肯定是寫入讀出都是正常的。
壞塊有兩種:
(1)一種是出廠的時候,也就是,你買到的新的,還沒用過的Nand Flash,就可以包含了壞塊。此類出廠時就有的壞塊,被稱作factory (masked)bad block或initial bad/invalid block,在出廠之前,就會做對應的標記,標為壞塊。
具體標記的地方是,對於現在常見的頁大小為2K的Nand Flash,是塊中第一個頁的oob起始位置(關於什麼是頁和oob,下面會有詳細解釋)的第1個位元組(舊的小頁面,pagesize是512B甚至256B的nand flash,壞塊標記是第6個位元組),如果不是0xFF,就說明是壞塊。相對應的是,所有正常的塊,好的塊,裡面所有資料都是0xFF的。
(2)第二類叫做在使用過程中產生的,由於使用過程時間長了,在擦塊除的時候,出錯了,說明此塊壞了,也要在程式運行過程中,發現,並且標記成壞塊的。具體標記的位置,和上面一樣。這類塊叫做worn-out bad block。

對於坏塊的管理,在Linux系統中,叫做壞塊管理(BBM,Bad Block Managment),對應的會有一個表去記錄好塊,壞塊的資訊,以及壞塊是出廠就有的,還是後來使用產生的,這個表叫做壞塊表(BBT,Bad Block Table)。在Linux核心MTD架構下的Nand Flash驅動,和Uboot中Nand Flash驅動中,在載入完驅動之後,如果你沒有加入參數主動要求跳過壞塊掃描的話,那麼都會去主動掃描壞塊,建立必要的BBT的,以備後面壞塊管理所使用。(這樣每次使用之之前,都會自動掃描一下,建立BBT,這樣就可以跳過懷塊進行別的方面的處理了)

而關於好塊和壞塊,Nand Flash在出廠的時候,會做出保證:
1.關於好的,可以使用的塊的數目達到一定的數目,比如三星的K9G8G08U0M,整個flash一共有4096個塊,出廠的時候,保證好的塊至少大於3996個,也就是意思是,你新買到這個型號的nand flash,最壞的可能,有3096-3996=100個壞塊。不過,事實上,現在出廠時的壞塊,比較少,絕大多數,都是使用時間長了,在使用過程中出現的。
2.保證第一個塊是好的,並且一般相對來說比較耐用。做此保證的主要原因是,很多Nand Flash壞塊管理方法中,就是將第一個塊,用來儲存上面提到的BBT,否則,都是出錯幾率一樣的塊,那麼也就不太好管理了,連放BBT的地方,都不好找了,^_^。

一般來說,不同型號的Nand Flash的資料手冊中,也會提到,自己的這個nand flash,最多允許多少個壞塊。就比如上面提到的,三星的K9G8G08U0M,最多有100個壞塊。

對於坏塊的標記,本質上,也只是對應的flash上的某些位元組的資料是非0xFF而已,所以,只要是資料,就是可以讀取和寫入的。也就意味著,可以寫入其他值,也就把這個壞塊標記資訊破壞了。對於出廠時的壞塊,一般是不建議將標記好的資訊擦除掉的。
uboot中有個命令是“nand scrub”就可以將塊中所有的內容都擦除了,包括壞塊標記,不論是出廠時的,還是後來使用過程中出現而新標記的。一般來說,不建議用這個。不過,我倒是經常用,其實也沒啥大礙,呵呵。
最好用“nand erase”只擦除好的塊,對於已經標記壞塊的塊,不擦除。

【nand Flash中頁的訪問順序】
在一個塊內,對每一個頁進行編程的話,必須是順序的,而不能是隨機的。比如,一個塊中有128個頁,那麼你只能先對page0編程,再對page1編程,。。。。,而不能隨機的,比如先對page3,再page1,page2.,page0,page4,.。。。

【片選無關(CE don’t-care)技術】沒明白什麼意思?
很多Nand flash支援一個叫做CE don’t-care的技術,字面意思就是,不關心是否片選,
那有人會問了,如果不片選,那還能對其操作嗎?答案就是,這個技術,主要用在當時是不需要選中晶片卻還可以繼續操作的這些情況:在某些應用,比如錄音,音頻播放等應用中,外部使用的微秒(us)級的刻度,此處假設是比較少的2us,在進行讀取一頁或者對頁編程時,是對Nand Flash操作,這樣的串列(Serial Access)訪問的周期都是20/30/50ns,都是納秒(ns)級的,此處假設是50ns,當你已經發了對應的讀或寫的命令之後,接下來只是需要Nand Flash內部去自己操作,將資料讀取或寫入進去到內部的資料寄存器中而已,此處,如果可以把片選取消,CE#是低電平有效,取消片選就是拉高電平,這樣會在下一個外部命令發送過來之前,即微秒量級的時間裡面,即2us-50ns≈2us,這段時間的取消片選,可以降低很少的系統功耗,但是多次的操作,就可以在很大程度上降低整體的功耗了。
總結起來簡單解釋就是:由於某些外部應用的頻率比較低,
【讀(read)操作過程詳解】
以最簡單的read操作為例,解釋如何理解時序圖,以及將時序圖
中的要求,轉化為代碼。

解釋時序圖之前,讓我們先要搞清楚,我們要做的事情:那就是,要從nand flash的某個頁裡面,讀取我們要的資料。要實現此功能,會涉及到幾部分的知識,至少很容易想到的就是:需要用到哪些命令,怎麼發這些命令,怎麼計算所需要的地址,怎麼讀取我們要的資料等等。
下面,就一步步的解釋,需要做什麼,以及如何去做:
1.需要使用何種命令
首先,是要瞭解,對於讀取資料,要用什麼命令。
下面是datasheet中的命令集合:

圖5.Nand Flash K9K8G08U0A的命令集合
很容易看出,我們要讀取資料,要用到Read命令,該命令需要2個周期,第一個周期發0x00,第二個周期發0x30。

2.發送命令前的準備工作以及時序圖各個訊號的具體含義
知道了用何命令後,再去瞭解如何發送這些命令。
[小常識]
在開始解釋前,多羅嗦一下”使能”這個詞,以便有些讀者和我以前一樣,在聽這類雖然對於某些專業人士說是屬於最基本的詞彙了,但是對於初次接觸,或者接觸不多的人來說,聽多了,容易被搞得一頭霧水:使能(Enable),是指使其(某個訊號)有效,使其生效的意思,“使其”“能夠”怎麼怎麼樣。。。。比如,上面圖中的CLE線號,是高電平有效,如果此時將其設為高電平,我們就叫做,將CLE使能,也就是使其生效的意思。

圖6.Nand Flash資料讀取操作的時序圖
註:此圖來自三星的型號K9K8G08U0A的nand flash的資料手冊(datasheet)。

我們來一起看看,我在圖6中的特意標註的①邊上的黃色豎線。
黃色豎線所處的時刻,是在發送讀操作的第一個周期的命令0x00之前的那一刻。
讓我們看看,在那一刻,其所穿過好幾行都對應什麼值,以及進一步理解,為何要那個值。
(1)黃色豎線穿過的第一行,是CLE。還記得前面介紹命令所存使能(CLE)那個引腳吧?CLE,將CLE置1,就說明你將要通過I/O複用連接埠發送進入Nand Flash的,是命令,而不是地址或者其他類型的資料。只有這樣將CLE置1,使其有效,才能去通知了內部硬體邏輯,你接下來將收到的是命令,內部硬體邏輯,才會將受到的命令,放到命令寄存器中,才能實現後面正確的操作,否則,不去將CLE置1使其有效,硬體會無所適從,不知道你傳入的到底是資料還是命令了。
(2)而第二行,是CE#,那一刻的值是0。這個道理很簡單,你既然要向Nand Flash發命令,那麼先要選中它,所以,要保證CE#為低電平,使其有效,也就是片選有效。
(3)第三行是WE#,意思是寫使能。因為接下來是往nand Flash裡面寫命令,所以,要使得WE#有效,所以設為低電平。
(4)第四行,是ALE是低電平,而ALE是高電平有效,此時意思就是使其無效。而對應地,前面介紹的,使CLE有效,因為將要資料的是命令,而不是地址。如果在其他某些場合,比如接下來的要輸入地址的時候,就要使其有效,而使CLE無效了。
(5)第五行,RE#,此時是高電平,無效。可以看到,知道後面第6階段,才變成低電平,才有效,因為那時候,要發生讀取命令,去讀取資料。
(6)第六行,就是我們重點要介紹的,複用的輸入輸出I/O連接埠了,此刻,還沒有輸入資料,接下來,在不同的階段,會輸入或輸出不同的資料/地址。
(7)第七行,R/B#,高電平,表示R(Ready)/就緒,因為到了後面的第5階段,硬體內部,在第四階段,接受了外界的讀取命令後,把該頁的資料一點點送到頁寄存器中,這段時間,屬於系統在忙著幹活,屬於忙的階段,所以,R/B#才變成低,表示Busy忙的狀態的。
介紹了時刻①的各個訊號的值,以及為何是這個值之後,相信,後面的各個時刻,對應的不同訊號的各個值,大家就會自己慢慢分析了,也就容易理解具體的操作順序和原理了。

3.如何計算出,我們要傳入的地址
在介紹具體讀取資料的詳細流程之前,還要做一件事,那就是,先要搞懂我們要訪問的地址,以及這些地址,如何分解後,一點點傳入進去,使得硬體能識別才行。
此處還是以K9K8G08U0A為例,此nand flash,一共有8192個塊,每個塊內有64頁,每個頁是2K+64 Bytes,假設,我們要訪問其中的第7000個塊中的第25頁中的1208位元組處的地址,此時,我們就要先把具體的地址算出來:
物理地址=塊大小×塊號+頁大小×頁號+頁內地址=7000×128K+64×2K+1208=0x36B204B8(917636280),接下來,我們就看看,怎麼才能把這個實際的物理地址,轉化為nand Flash所要求的格式。
在解釋地址組成之前,先要來看看其datasheet中關於地址周期的介紹:

圖7 Nand Flash的地址周期組成
結合圖7和圖5中的2,3階段,我們可以看出,此nand flash地址周期共有5個,2個列(Column)周期,3個行(Row)周期。而對於對應地,我們可以看出,實際上,列地址A0~A10,就是頁內地址,位址範圍是從0到2047,而對於多出的A11,理論上可以表示2048~4095,但是實際上,我們最多也只用到了2048~2011,用於表示頁內的oob地區,其大小是64位元組。
對應地,A12~A30,稱作頁號,頁的號碼,可以定位到具體是哪一個頁。而其中,A18~A30,表示對應的塊號,即屬於哪個塊。
簡單解釋完了地址組成,那麼就很容易分析上面例子中的地址了:
0x36B204B8 = 00110110 10110010 00000100 1011 1000,分別分配到5個地址周期就是:

36 B2 04 B8
00110110 10110010 0000 0100 1011 1000
A11-A8 A7-A0
A19-A12
A27-A20
A30-A28
1st周期,A7~A0 :1011 1000=0x B8
2nd周期,A11~A8 :0000 0100 = 0x04(這裡的高四位的0不是原資料中的,而是硬體要求的)
3rd周期,A19~A12 :0010 0000 = 0x20
4th周期,A27~A20 :0110 1011 = 0x6B
5th周期,A30~A28 :0000 0011 = 0x03
注意,與圖7中對應的,*L,意思是地電平,由於未用到那些位,datasheet中強制要求設為0,所以,才有上面的2nd周期中的高4位是0000.其他的A30之後的位也是類似原理,都是0。
因此,接下來要介紹的,我們要訪問第7000個塊中的第25頁中的1208位元組處的話,所要傳入的地址就是分5個周期,分別傳入兩個列地址的:0xB8,0x04,然後再傳3個行地址的:0x20,0x6B,0x03,這樣硬體才能識別。

4.讀操作過程的解釋
準備工作終於完了,下面就可以開始解釋說明,對於讀操作的,上面圖中標出來的,1-6個階段,具體是什麼含義。
(1) 操作準備階段:此處是讀(Read)操作,所以,先發一個圖5中讀命令的第一個階段的0x00,表示,讓硬體先準備一下,接下來的操作是讀。
(2) 發送兩個周期的列地址。也就是頁內地址,表示,我要從一個頁的什麼位置開始讀取資料。
(3) 接下來再傳入三個行地址。對應的也就是頁號。
(4) 然後再發一個讀操作的第二個周期的命令0x30。接下來,就是硬體內部自己的事情了。
(5) Nand Flash內部硬體邏輯,負責去按照你的要求,根據傳入的地址,找到哪個塊中的哪個頁,然後把整個這一頁的資料,都一點點搬運到頁緩衝中去。而在此期間,你所能做的事,也就只需要去讀取狀態寄存器,看看對應的位的值,也就是R/B#那一位,是1還是0,0的話,就表示,系統是busy,仍在”忙“(著讀取資料),如果是1,就說系統活幹完了,忙清了,已經把整個頁的資料都搬運到頁緩衝裡去了,你可以接下來讀取你要的資料了。
對於這裡。估計有人會問了,這一個頁一共2048+64位元組,如果我傳入的頁內地址,就像上面給的1208一類的值,只是想讀取1028到2011這部分資料,而不是頁開始的0地址整個頁的資料,那麼內部硬體卻讀取整個頁的資料出來,豈不是很浪費嗎?答案是,的確很浪費,效率看起來不高,但是實際就是這麼做的,而且本身讀取整個頁的資料,相對時間並不長,而且讀出來之後,內部資料指標會定位到你剛才所制定的1208的那個位置。
(6) 接下來,就是你“竊取“系統忙了半天之後的勞動成果的時候了,呵呵。通過先去Nand Flash的控制器中的資料寄存器中寫入你要讀取多少個位元組(byte)/字(word),然後就可以去Nand Flash的控制器的FIFO中,一點點讀取你要的資料了。
至此,整個Nand Flash的讀操作就完成了。
對於其他動作,可以根據我上面的分析,一點點自己去看datasheet,根據裡面的時序圖去分析具體的操作過程,然後對照代碼,會更加清楚具體是如何?的。

【Flash的類型】
Flash的類型主要分兩種,nand flash和nor flash。
除了網上最流行的這個解釋之外:
NAND和NOR的比較
再多說幾句:
1.nor的成本相對高,具體讀寫資料時候,不容易出錯。總體上,比較適合應用於儲存少量的代碼。
2.Nand flash相對成本低。使用中資料讀寫容易出錯,所以一般都需要有對應的軟體或者硬體的資料校正演算法,統稱為ECC。由於相對來說,容量大,價格便宜,因此適合用來儲存大量的資料。其在嵌入式系統中的作用,相當於PC上的硬碟,用於儲存大量資料。
所以,一個常見的應用組合就是,用小容量的Nor Flash儲存啟動代碼,比如uboot,系統啟動後,初始化對應的硬體,包括SDRAM等,然後將Nand Flash上的Linux核心讀取到記憶體中,做好該做的事情後,就跳轉到SDRAM中去執行核心了,然後核心解壓(如果是壓縮核心的話,否則就直接運行了)後,開始運行,在Linux核心啟動最後,去Nand Flash上,掛載根檔案,比如jffs2,yaffs2等,掛載完成,運行初始化指令碼,啟動consle互動,才運行你通過console和核心互動。至此完成整個系統啟動過程。
而Nor Flash就分別存放的是Uboot,Nand Flash存放的是Linux的核心鏡像和根檔案系統,以及餘下的空間分成一個資料區。

Nor flash,有類似於dram之類的地址匯流排,因此可以直接和CPU相連,CPU可以直接通過地址匯流排對nor flash進行訪問,而nand flash沒有這類的匯流排,只有IO介面,只能通過IO介面發送命令和地址,對nand flash內部資料進行訪問。相比之下,nor flash就像是並行訪問,nand flash就是串列訪問,所以相對來說,前者的速度更快些。
但是由於物理製程/製造方面的原因,導致nor和nand在一些具體操作方面的特性不同:

One Flash
NOR Flash帶有SRAM介面,有足夠的地址引腳來定址,可以很容易地存取其內容的每一位元組(有限的地址引腳是限制其容量的因素之一)。NAND Flash使用複雜的I/O口來串列地存取資料,各個產品或廠商的方法可能各不相同。為了彌補NAND Flash的不足,三星公司在NAND Flash晶片內整合了一個RAM介面,命名為OneNAND Flash,這類Flash擁有與NOR Flash相同的簡單介面,而且不受地址引腳的限制,即容量與地址引腳無關。小結:從操作上來看OneNand比NOR,NAND的操作都要複雜,不過,OneNAND的讀寫效能相當出眾,三星最新的OneNAND產品擁有高達108MBps的資料讀取頻寬,這已達到與NOR快閃記憶體相當的水準—這個速度也遠遠超過了現在的7200轉案頭硬碟。相比之下,常規NAND快閃記憶體的讀取效能只有區區17MBps,兩者存在巨大的效能差異。其次,OneNAND的資料寫入速度達到9.3MBps,雖然遠遠不如108MBps的讀取速度,但相比NAND快閃記憶體的6.8MBps也已經有長足的進步了。與之形成鮮明對比的是,NOR快閃記憶體的寫入速度只有可憐的0.14MBps,幾乎稱得上是慢如蝸牛。在資料擦除方面,OneNAND與NAND的指標相同,都達到64MBps,而NOR快閃記憶體更只有區區0.11MBps,與前兩者完全無法相比。從效能角度來看,OneNAND無論讀、寫還是擦除都明顯淩駕於NAND之上,NOR在寫入/擦除方面的效能與之根本不具可比性,對嵌入式裝置廠商來說,選擇簡單的OneNAND來代替NOR+NAND組合的方案是非常可行的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.