Raw NAND FLASH原理及ONFI接口標準【轉】

轉自:https://blog.csdn.net/ScilogyHunter/article/details/105995767

一、NAND Flash類型
1.1 NAND Flash的兩大分類

NAND Flash是嵌入式世界裏常見的存儲器,對於嵌入式開發而言,NAND主要分爲兩大類:Serial NAND、Raw NAND,這兩類NAND的差異是很大的(軟件驅動開發角度而言),即使你掌握其中一種,也不代表你能瞭解另一種。
1.2 Serial NAND與Raw NAND特點

Raw NAND是相對於Serial NAND而言的,Serial NAND即串行接口的NAND Flash,而Raw NAND是並行接口的NAND FLASH。早期並行接口通信數據率是明顯高於串行通信數據率的,但隨着串行通信速度越來越快,並行接口速度優勢顯得不那麼重要了,反而因信號線太多導致設計成本較高(PCB走線複雜)顯得有點不合潮流。但其實這麼說對Raw NAND是不公平的,現在的Serial NOR/NAND信號線其實也不少,比如高速的串行HyperFlash信號線數量已經直逼x8 bit的Raw NAND FLASH,所以Raw NAND市場還是堅挺的,你會發現各大存儲廠商都還在不斷推出Raw NAND FLASH產品。
1.3 Raw NAND細分類型

從軟件驅動開發角度而言,Raw NAND可以從以下幾個方面進一步細分:

    單元層數(bit/cell):SLC(1bit/cell) / MLC(2bit/cell) / TLC(3bit/cell) /QLC(4bit/cell)
    數據線寬度:x8 / x16
    信號線模式:Asynchronous / Synchronous
    數據採集模式:SDR / DDR
    接口命令標準:非標 / ONFI

1.4 常見廠商及產品系列

Raw NAND廠商產品有兩種,一種是裸Raw NAND芯片,另一種是含Raw NAND的存儲方案(比如SSD硬盤,SD卡,eMMC等),對於嵌入式開發而言,我們更關心的是裸Raw NAND芯片產品,下面列出了常見SLC Raw NAND芯片的廠商及產品系列:
廠商    芯片系列    官方網址
Micron    MT29F    https://www.micron.com
Numonyx    NAND256, NAND512    https://www.micron.com
Macronix    MX30LF, MX60LF    http://www.macronix.com
Winbond    W29N    http://www.winbond.com.tw
Spansion    S34ML, S34MS, S34SL    http://www.cypress.com/
ISSI    IS34ML, IS34MW    http://www.issi.com
Toshiba    TC58B, TC58N    http://toshiba.semicon-storage.com
SK Hynix    H27U    http://www.hynix.com
Samsung    K9F, K9K    http://www.samsung.com/semiconductor/

二、ONFI標準由來

說一下Raw NAND發展史,其實早期的Raw NAND沒有統一標準,雖然早在1989年Toshiba便發表了NAND Flash結構,但具體到Raw NAND芯片,各廠商都是自由設計,因此尺寸不統一、存儲結構差異大、接口命令不通用等問題導致客戶使用起來很難受。

爲了改變這一現狀,2006年幾個主流的Raw NAND廠商(Hynix、Intel、Micron、Phison、Sony、ST)聯合起來商量制訂一個Raw NAND標準,這個標準叫 ONFI (Open NAND Flash Interface)。
  
2006年12月ONFI 1.0標準正式推出,此標準一經推出大受歡迎(好像不歡迎也不行,那些大廠說了算啊),此後幾乎所有的Raw NAND廠商都按照ONFI標準設計生產Raw NAND,從此Raw NAND世界清靜了,不管哪家生產的Raw NAND對嵌入式設計者來說幾乎都是一樣的,至少在驅動代碼層面是一樣的。那麼各廠商競爭優勢在哪呢?主要在三個方面:數據存取速率、ECC能力、ONFI之外的個性化功能。

你可以從 ONFI官網 下載ONFI標準手冊,從2006年推出1.0標準至今,ONFI標準已經發展到4.1,這也說明了Raw NAND技術在不斷更新升級。
在這裏插入圖片描述


三、SLC Raw NAND原理
本文的主要研究對象是兼容ONFI 1.0標準的Asynchronous SDR SLC NAND Flash。
3.1 Raw NAND內存模型

ONFI規定了Raw NAND內存單元從大到小最多分爲如下5層:Device、LUN(Die)、Plane、Block、Page(如下圖所示),其中Page和Block是必有的,因爲Page是讀寫的最小單元,Block是擦除的最小單元。而LUN和Plane則不是必有的(如沒有,可認爲LUN=1, Plane=1),一般在大容量Raw NAND(至少8Gb以上)上纔會出現。
在這裏插入圖片描述

 
    根據以上5層分級的內存模型,Raw NAND地址也很自然地由如下圖中多個部分組成:
    Raw NAND Address = LUN Addr + Block Addr + Page Addr + Byte Addr (Column Addr)

可能有朋友對Plane Address bit的位置有疑問,其實結合上面內存模型圖就不難理解了,每個Plane裏包含的Block並不是連續的,而是與其他Plane含有的Block是交錯的。
在這裏插入圖片描述

 

 
3.2 Raw NAND信號與封裝

ONFI規定了Raw NAND信號線與封裝,如下是典型的x8 Raw NAND內部結構圖,除了內存單元外,還有兩大組成,分別是IO控制單元和邏輯控制單元,信號線主要掛在IO控制與邏輯單元,x8 Raw NAND主要有15根信號線(其中必須的是13根,WP#和R/B#可以不用),關於各信號線具體作用,請查閱相關文檔。
在這裏插入圖片描述

 

 


ONFI規定的封裝標準有很多,比如TSOP48、LGA52、BGA63/100/132/152/272/316,其中對於嵌入式開發而言,最常用的是如下圖扁平封裝的TSOP-48,這種封裝常用於容量較小的Raw NAND(1/2/4/8/16/32Gb),1-32Gb容量對於嵌入式設計而言差不多夠用,且TSOP-48封裝易於PCB設計,因此得以流行。

3.3 Raw NAND接口命令

ONFI 1.0規定了Raw NAND接口命令,如下表所示,其中一部分是必須要支持的(M),還有一部分是可選支持的(O)。必須支持的命令裏最常用的是Read(Read Page)、Page Program、Block Erase這三條,涵蓋讀寫擦最基本的三種操作。

  除了讀寫擦這三個最基本命令外,還有一個必有命令也非常常用,這個命令是Read Status,用於獲取命令執行狀態與結果,ONFI規定Raw NAND內部必須包含一個8bit的狀態寄存器,這個狀態寄存器用來存儲NAND命令執行狀態與結果,其中有兩個bit(RDY-SR[6]和FAIL-SR[0])需要特別關注,RDY用於指示命令執行狀態(這個bit與外部R/B#信號線功能是一致的),FAIL用於返回命令執行結果(主要是有無ECC錯誤)。

 

 
此外,還有一個必有命令不得不提,這個命令是Read Parameter Page,用於獲取芯片內部存儲的出廠信息(包括內存結構、特性、時序、其他行爲參數等),這個Parameter Page大小爲256Bytes,其結構已由ONFI規定如下表,在設計NAND軟件驅動時,可以通過獲取這個Parameter Page來做到代碼通用。

 

 
3.4 Raw NAND數據速率

前面講了,數據存取速率這個技術指標是各廠商競爭力的體現,對於這個指標,其實ONFI標準定義了一部分,我們知道Raw NAND數據存取操作是以Page爲單位的,Page操作時間決定了數據存取速率,Page操作時間由3部分組成:

 


以上三部分時間裏,ONFI定義了Page命令/數據操作時間標準,但Page命令執行等待時間無法強制,因此各廠商NAND速度差異主要是這個Page命令執行等待時間不同造成的。

以異步模式Read Page命令(0x00 - 0x30)爲例講解,下圖是Read Page完整時序簡圖,0x00是主機發送的第一個字節,用於通知NAND Device主機想要讀取Page,隨後的5個字節發送的是地址數據,用於通知NAND Device主機想要從什麼地址獲取數據,0x30是主機發送的最後一個字節,用於通知NAND Device讀取Page命令發送已經完成,至此命令操作週期已經結束,NAND Device此時開始進行內部處理流程:拉低外部引腳R/B#或將內部寄存器SR[6]置0表明我正在忙,然後從內存塊裏將主機指定地址所在的Page數據全部拷貝到臨時緩存區(Page Buffer),對這一整個Page數據進行ECC校驗,如Page數據校驗通過,拉高外部引腳R/B#或將內部寄存器SR[6]置1表明我已經準備好了,至此命令執行等待週期已經結束,主機開始按Byte依次將Page數據讀出來,所有Page數據全部都被讀出來後,整個Read Page時序就結束了。

 

 
下圖是命令/地址操作具體時序,根據時序圖我們可以粗略計算出tCmd:

    tCmd = (cmdBytes + addrBytes) x (tWP + tWH) = 7 * (tWP + tWH)

 

 
 

 

 
下圖是數據讀取操作具體時序,分爲兩種:Non-EDO模式(RE#上沿採樣數據)和EDO模式(RE#下沿採樣數據),從圖中我們知道tRC是RE#信號的一個週期,通俗地說,Non-EDO模式一般用於低速模式(即tRC > 30ns時),而EDO模式一般用於高速模式(即tRC < 30ns時)。根據時序圖我們可以粗略計算出tData:

    tData = dataBytesInOnePage * tRC

 

 

 

 
讓我們把tCmd和tData代入tReadPage計算公式可得如下等式,我們知道其中tBusy是無法得知的,那麼其他三個時間tWP、tWH、tRC到底是多少呢?

    tReadPage = 7 x (tWP + tWH) + tBusy + dataBytesInOnePage * tRC

繼續查看ONFI手冊可以找到答案,ONFI規定了六種timing mode(0-5),timing mode table裏指明瞭所有時序相關的參數數值範圍,當然也包括tWP、tWH、tRC,以最快的timing mode 5來計算:

    tReadPage = 7 x 20ns + tBusy + dataBytesInOnePage * 20ns = (dataBytesInOnePage + 7) x 20ns + tBusy

 

 


我們似乎離答案更近一步了,但tBusy是多少這個問題始終困擾着我們,想要知道Read Page的時間沒有這麼複雜,我們可以從任何一款Raw NAND數據手冊的扉頁Features裏直接找到答案,如下是Micron生產的型號爲MT29F4Gxx的feature信息:

 

 


從feature裏我們可以知道tReadPage最小爲25us(此數值應是在x16 bits,timing mode 5下得出的最快速度),那麼可以反算出tBusy = 25us - 20ns * (1024 + 7) = 4.38us,知道了tBusy讓我們計算一下x8 bits下的tReadPage = 20ns * (2048 + 7) + 4.38us = 45.48us,再計算x8 bits下的讀取數據率 2048Bytes / 45.48us = 360.246Mbps,這個數據率對於普通嵌入式應用來說其實是夠快的。
3.5 Raw NAND壞塊與ECC

Raw NAND開發繞不開壞塊(Bad Block)問題,這是NAND Flash區別於NOR Flash的一個重要特點。NAND技術上允許壞塊的存在,這降低了NAND生產工藝要求,因此NAND單位容量價格比NOR低。

既然物理上的壞塊無法避免,那有什麼方法可以改善/解決壞塊問題呢?方法當然是有的,這個方法就是ECC(Error Correcting Code),在這裏你只需要知道ECC是一種錯誤檢測與糾正算法,它通過對一定量的數據塊(一般是256/512bytes)進行計算得到ECC碼(一般8bytes),在Page Program時將原始Page數據與ECC碼一同存入NAND Flash,在Read Page時同時獲取Page數據與ECC碼再進行一次計算,如果該Page數據沒有ECC錯誤或者bit錯誤能夠被ECC碼糾正,那麼Page讀寫操作就能夠正常進行,如果bit錯誤個數太多不能夠被糾正,那麼該Page所在的塊就應該被認定爲一個壞塊。
  
ECC能力主要根據糾正單數據塊中錯誤bit個數來區分的,最基本的ECC只能夠糾正1bit錯誤,強一點的ECC可以糾正4或者8個甚至更多的錯誤bit。
  
讓我們用一款實際芯片來具體分析壞塊與ECC,依舊以前面分析過的Micron生產的型號爲MT29F4Gxx爲例,下圖是其內存結構圖,從圖中我們可以知道這款NAND的Page大小爲2KB,但如果你仔細看,你會發現每個Page還額外含有64Bytes數據,這個64Bytes區域即所謂的Spare Area,這個區域到底是幹嘛用的呢?

 

 


下圖是Spare Area的mapping圖,由於每個Page是2KB,而ECC計算塊是512Bytes,因此Page區域被均分爲4塊,分別是Main 0、1、2、3,每塊大小爲512Bytes,而相應的Spare Area也被均分爲4塊,分別是Spare 0、1、2、3,每塊大小爲16bytes,與Main區域一一對應。每個Spare x由2bytes壞塊信息、8bytes ECC碼、6bytes用戶數據組成。要特別說一下的是ECC區域,當芯片硬件ECC功能開啓時,8bytes ECC碼區域會被自動用來存儲ECC信息,而如果芯片沒有硬件ECC功能,這個區域可以用來手動地存放軟件ECC值。

 

 
下圖是芯片Error管理相關信息,也包含了ECC,從圖中我們可以知道這款芯片ECC是4bits,壞塊是用0x00來標識的,並且承諾該芯片出廠時每個Die裏所含有的4096個block最多隻會有80個壞塊。這些信息除了在芯片手冊裏可以找到之外,前面介紹過的ONFI Parameter Page也同樣記錄了。

 

 
3.6 Raw NAND個性化功能

Raw NAND還有一些個性化的功能,這個是因廠商而異的,ONFI規定了兩個可選的命令Get/Set Feature,個性化功能可以通過Get/Set Feature命令來擴展。下表是ONFI 1.0規定的Feature address範圍,其中0x01是Timing Mode,0x80-0xFF用於各廠商實現自己的特色功能。


關於Timing Mode地址的具體定義如下,ONFI規定芯片上電初始爲Timing mode 0,即最低速的模式,如果我們想要更快的NAND訪問速度,必須使用Set feature命令將Timing mode設置到想要的數值。


繼續以前面分析過的Micron生產的型號爲MT29F4G08ABBxA爲例,下圖是該芯片的Feature定義,除了ONFI規定之外,還定義了自己的特色部分(0x80, 0x81, 0x90)。


比如0x90定義的Array operation mode,我們可以通過其實現OTP控制以及硬件ECC的開關。

 


————————————————
版權聲明:本文爲CSDN博主「ScilogyHunter」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ScilogyHunter/article/details/105995767

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章