痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

痞子衡發表於2018-06-07

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ONFI標準及SLC Raw NAND

  NAND Flash是嵌入式世界裡常見的儲存器,對於嵌入式開發而言,NAND主要分為兩大類:Serial NAND、Raw NAND,這兩類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產品。

一、ONFI標準由來

  說到Raw NAND發展史,其實早期的Raw NAND沒有統一標準,雖然早在1989年Toshiba便發表了NAND Flash結構,但具體到Raw NAND晶片,各廠商都是自由設計,因此尺寸不統一、儲存結構差異大、介面命令不通用等問題導致客戶使用起來很難受。為了改變這一現狀,2006年幾個主流的Raw NAND廠商(Hynix、Intel、Micron、Phison、Sony、ST)聯合起來商量制訂一個Raw NAND標準,這個標準叫Open NAND Flash Interface,簡稱ONFI,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技術在不斷更新升級。

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

二、SLC Raw NAND原理

2.1 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

  本文的主要研究物件是相容ONFI 1.0標準的Asynchronous SDR SLC NAND Flash。

2.2 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以上)上才會出現。

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

  根據以上5層分級的記憶體模型,Raw NAND地址也很自然地由如下圖中多個部分組成:

Raw NAND Address = LUN Addr + Block Addr + Page Addr + Byte Addr (Column Addr)

  可能有朋友對Plane Address bit的位置有疑問,其實結合上面記憶體模型圖就不難理解了,每個Plane裡包含的Block並不是連續的,而是與其他Plane含有的Block是交錯的。

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

2.3 Raw NAND訊號與封裝

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

2.4 Raw NAND介面命令

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

  此外,還有一個必有命令不得不提,這個命令是Read Parameter Page,用於獲取晶片內部儲存的出廠資訊(包括記憶體結構、特性、時序、其他行為引數等),這個Parameter Page大小為256Bytes,其結構已由ONFI規定如下表,痞子衡已經圈出了一些重要資訊,在設計NAND軟體驅動時,可以通過獲取這個Parameter Page來做到程式碼通用。

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介
痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

2.5 Raw NAND資料速率

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

Page操作時間(tReadPage) = Page命令操作時間(tCmd) + Page命令執行等待時間(tBusy) + Page資料操作時間(tData

  以上三部分時間裡,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時序就結束了。

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

tData = dataBytesInOnePage * tRC

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介
痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

  讓我們把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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

  我們似乎離答案更近一步了,但tBusy是多少這個問題始終困擾著我們,其實痞子衡帶你繞了路,想要知道Read Page的時間沒有這麼複雜,我們可以從任何一款Raw NAND資料手冊的扉頁Features裡直接找到答案,如下是Micron生產的型號為MT29F4GxxABBxA的部分feature:

• Open NAND Flash Interface (ONFI) 1.0-compliant
• Single-level cell (SLC) technology
• Organization
  – Page size x8: 2112 bytes (2048 + 64 bytes)
  – Page size x16: 1056 words (1024 + 32 words)
  – Block size: 64 pages (128K + 4K bytes)
  – Plane size: 2 planes x 2048 blocks per plane
  – Device size: 4Gb: 4096 blocks; 8Gb: 8192 blocks; 16Gb: 16,384 blocks
• Asynchronous I/O performance
  – tRC/tWC: 20ns (3.3V), 25ns (1.8V)
• Array performance
  – Read page: 25μs
  – Program page: 200μs (TYP: 1.8V, 3.3V)
  – Erase block: 700μs (TYP)
• Operating voltage range
  – VCC: 2.7–3.6V
  – VCC: 1.7–1.95V

  從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,這個資料率對於普通嵌入式應用來說其實是夠快的。

2.6 Raw NAND壞塊與ECC

  Raw NAND開發繞不開壞塊(Bad Block)問題,這是NAND Flash區別於NOR Flash的一個重要特點。NAND技術上允許壞塊的存在,這降低了NAND生產工藝要求,因此NAND單位容量價格比NOR低。
  既然物理上的壞塊無法避免,那有什麼方法可以改善/解決壞塊問題呢?方法當然是有的,這個方法就是ECC(Error Correcting Code),ECC的具體實現原理詳見痞子衡的另一篇文章 漢明碼校驗(Hamming Code SEC-DED),在這裡你只需要知道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生產的型號為MT29F4G08ABBxA為例,下圖是其記憶體結構圖,從圖中我們可以知道這款NAND的Page大小為2KB,但如果你仔細看,你會發現每個Page還額外含有64Bytes資料,這個64Bytes區域即所謂的Spare Area,這個區域到底是幹嘛用的呢?

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

  下圖是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值。

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介
痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

2.7 Raw NAND個性化功能

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

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

痞子衡嵌入式:並行介面NAND標準(ONFI)及SLC Raw NAND簡介

三、SLC Raw NAND產品

  Raw NAND廠商產品有兩種,一種是裸Raw NAND晶片,另一種是含Raw NAND的儲存方案(比如SSD硬碟),對於嵌入式開發而言,我們更關心的是裸Raw NAND晶片產品,下面痞子衡收集了可以售賣SLC Raw NAND晶片的廠商及產品系列:

廠商 晶片系列 官方網址
Micron MT29F https://www.micron.com
slc-nand-part-catalog
Numonyx NAND256, NAND512 https://www.micron.com
slc-nand-part-catalog
Macronix MX30LF, MX60LF http://www.macronix.com
slc-nand-part-catalog
Winbond W29N http://www.winbond.com.tw
slc-nand-part-catalog
Spansion S34ML, S34MS, S34SL http://www.cypress.com/
slc-nand-part-catalog
ISSI IS34ML, IS34MW www.issi.com
slc-nand-part-catalog
Toshiba TC58B, TC58N http://toshiba.semicon-storage.com
SK Hynix H27U http://www.hynix.com
slc-nand-part-catalog
Samsung K9F, K9K http://www.samsung.com/semiconductor/

  至此,ONFI標準及SLC Raw NAND痞子衡便介紹完畢了,掌聲在哪裡~~~

相關文章