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

来源:https://www.cnblogs.com/henjay724/archive/2018/06/07/9152535.html
-Advertisement-
Play Games

說到Raw NAND發展史,其實早期的Raw NAND沒有統一標準,各廠商都是自由設計,因此尺寸不統一、存儲結構差異大、介面命令不通用等問題導致客戶使用起來很難受。為了改變這一現狀,2006年幾個主流的Raw NAND廠商(Hynix、Intel、Micron、Phison、Sony、ST)聯合起來... ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是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晶元的廠商及產品系列:

廠商 晶元系列 官方網址
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痞子衡便介紹完畢了,掌聲在哪裡~~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Select與Select Many 之前在項目中查詢資料庫中的數據,都是通過sql語句來查詢的,但是隨著時代的發展,微軟在.Net Framework 4.5版中推出的一個主要的特性——LINQ。 LINQ是Language Integrate Query的縮寫,意為語言集成查詢。其中有兩種查詢方 ...
  • Restful幾乎已算是API設計的標準,通過HTTP Method區分新增(Create)、查詢(Read)、修改(Update)和刪除(Delete),簡稱CRUD四種數據存取方式,簡約又直接的風格,讓人用的愛不釋手。本篇將介紹如何通過ASP.NET Core實踐REST-Like API。 為 ...
  • .net 這幾年國內確實不好過。 很多都選擇轉行。不過.net Core跨平臺 開源之後 。社區的生態在慢慢建立。往好的趨勢發展。 對於堅守在.NET戰線的開發者來說 是個挺不錯的消息。 特別是微軟收購75億美金GitHub。.net 生態 社區圈子。肯定會有所上升。 發展趨勢越來越好。(當然 這隻 ...
  • 一、序言 在Office Word中,支持在Word文檔中插入類型非常豐富的形狀,包括線條、矩形、基本形狀(諸如圓形、多邊形、星形、括弧、笑臉等等圖形)、箭頭形狀、公式形狀、流程圖、旗幟圖形、標註圖形等等,我們在編程過程中,想要在Word中繪製不同類型的圖形,可以通過類庫來操作。控制項Spire.Do ...
  • 平時使用 LINQ 進行一些簡單的條件拼接查詢一般都會這樣操作: 這裡有三個條件,是前端傳入的搜索條件,然後我們來編寫一個查詢語句: 因為我們前端傳入的條件不是固定的,所以有可能會出現有的條件沒有傳入的情況,如果是 SQL 的動態拼接 SQL 就可以了,而 Linq 你肯定是沒法動態拼接的,只有自己 ...
  • VMware下CentOS7安裝後,還原虛擬網路後,敲ifconfig不顯示區域網ip,沒有出現eth0網卡,不能上網,SSH不能連接,輸入ifconfig後如下圖: 解決方法: 1.編輯網卡的配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 將里 ...
  • IO口擴展晶元,主要是解決單片機IO口太少。 74HC165:數據從並轉串 74HC595:數據從串轉並 兩種晶元,都是通過時序電路,加上移位功能,進行數據傳輸 74HC165:數據從並轉串。以下實例,實現8個獨立按鍵,控制數位管的8段 74HC595:數據從串轉並,以下程式,實現流水燈效果 ...
  • 通常情況下,進入Windows界面之前都有一個登錄過程,如何在登錄前讓系統執行腳本呢?下麵介紹一種方法。 1.打開組策略,在Run(運行)中輸入GREDIT.MSC,點擊確認。 2.依次點擊Computer Configuration -> Windows Settings -> Scripts(S ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...