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

轉自:https://www.cnblogs.com/henjay724/p/9152535.html

 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是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技術在不斷更新升級。

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

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

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

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

2.3 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設計,因此得以流行。

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、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也同樣記錄了。

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

三、SLC Raw NAND產品

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

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

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁微信公衆號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關注痞子衡個人微信公衆號【痞子衡嵌入式】,一個專注嵌入式技術的公衆號,跟着痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼痞子衡嵌入式-微信收款二維碼痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或諮詢業務合作請發郵件至 [email protected]

  可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下面留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。

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