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


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

  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產品。算法

1、ONFI標準由來

  說到Raw NAND發展史,其實早期的Raw NAND沒有統一標準,雖然早在1989年Toshiba便發表了NAND Flash結構,但具體到Raw NAND芯片,各廠商都是自由設計,所以尺寸不統1、存儲結構差別大、接口命令不通用等問題致使客戶使用起來很難受。爲了改變這一現狀,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技術在不斷更新升級。緩存

2、SLC Raw NAND原理

2.1 Raw NAND分類

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

單元層數(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。jsp

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以上)上纔會出現。設計

  根據以上5層分級的內存模型,Raw NAND地址也很天然地由以下圖中多個部分組成:3d

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

  可能有朋友對Plane Address bit的位置有疑問,其實結合上面內存模型圖就不難理解了,每一個Plane裏包含的Block並非連續的,而是與其餘Plane含有的Block是交錯的。orm

2.3 Raw NAND信號與封裝

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

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

2.4 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來作到代碼通用。


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時序就結束了。

  下圖是命令/地址操做具體時序,根據時序圖咱們能夠粗略計算出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生產的型號爲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,這個區域究竟是幹嗎用的呢?

  下圖是Spare Area的mapping圖,因爲每一個Page是2KB,而ECC計算塊是512Bytes,所以Page區域被均分爲4塊,分別是Main 0、一、二、3,每塊大小爲512Bytes,而相應的Spare Area也被均分爲4塊,分別是Spare 0、一、二、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也一樣記錄了。


2.7 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的開關。

3、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痞子衡便介紹完畢了,掌聲在哪裏~~~

相關文章
相關標籤/搜索