作者:Bird
上一回,我們聊完了SPI介面的NOR Flash記憶體,這一次我們要進入一個有點複雜而且有點混亂的世界:SD/MMC/eMMC。
不管是SD還是MMC/eMMC,它們其實都是帶有控制器的NAND Flash。我們在說明Flash記憶體的工作原理時,有講過因為結構和讀寫原理的關係,NAND Flash 的可靠度先天就比 NOR Flash要差。
NAND Flash在讀取時,需要打開一整排的cell電晶體,但目的只是為了感應其中一顆有沒有導通,因此很容易造成floating gate中儲存的電荷受到干擾,而影響儲存內容的正確性,但結構上NAND Flash的密度就是遠高於NOR Flash,因此大容量的儲存應用幾乎都是 NAND Flash的天下。
為了克服 NAND Flash先天可靠度較差、容易出錯的特性,通常不會直接使用它,而必須搭配一個控制器,幫忙做錯誤偵測、錯誤校正、寫入壽命管理等工作。
NAND Flash 的濫觴 #
在正式進入 SD/MMC/eMMC 的世界之前,我們先來看看 NAND Flash儲存媒體的濫觴:SmartMedia。

(圖片來源:Bird 提供)
年紀稍長的讀者對這種記憶卡可能還有點印象,在SD卡攻佔全世界的數位相機市場之前,它可能是最常用的數位相機儲存媒體,巔峰時期有將近50%的市占率。
SmartMedia是 Toshiba 在掌握了 NAND flash 的量產技術後,於 1995 年推出的可插拔記憶體產品。1996 年,Toshiba 與當時的數位相機大頭:Fuji、Olympus 以及電玩巨擘 Sega,聯合成立了 SmartMedia 的標準化組織:SSFDC Forum。SSFDC 的意思是 Solid-state Floopy Disk Card,嗯,你沒聽錯,就是固態軟碟的意思(年紀稍小一點的讀者可能連機械式硬碟都沒看過了,更不用說軟碟),但這在當時確實是一大突破。
SmartMedia 只有 0.76 mm 厚,確實比當年主流的 3.5 吋軟碟片要薄得多,也小得多(最早的 SmartMedia 容量從 2M Bytes 開始,也跟軟碟片差不多),當年甚至有做成 3.5 吋軟碟片形狀的 SmartMedia 讀卡機:你可以把 SmartMedia 裝進這個讀卡機,再把它放進 3.5 吋的磁碟機中讀取。在那個還沒有 USB,且 serial port 只有 115.2 Kbps 的年代,這樣子的讀取技術其實相當有創意,即使讀一張 8M Bytes 的卡可能需要花 5 分鐘以上。
SmartMedia本人其實就是一顆長得扁扁的、經過特殊封裝、將接腳露出來的NAND Flash晶片,它沒有控制器。咦,我們前面不是才說過,NAND Flash需要控制器來幫忙cover一些它先天特性不佳的問題嘛?
對,但是當初為了成本的考量,Toshiba決定不在SmartMedia裡面放NAND Flash的控制器,而是把這些功能交由使用SmartMedia的裝置來處理。這對日後的應用造成了一些始料未及的問題。
SmartMedia的介面共有22支腳,基本上是個parallel的介面,以D0-D7 8個bit來傳輸指令和資料,而且它沒有clock訊號,仍是非同步的邏輯介面,最快的傳輸速度大概是每秒2M Bytes。SmartMedia還分成3.3V和5V兩種,卡片的外型略有不同,裝置可以藉由卡片的外型來判斷該用5V還是3.3V的介面去驅動它(由於它已經是歷史了,細節我們就不多提)。
不過關於SmartMedia儲存格式的細節,倒是值得我們細究,因為從這裡可以看出很多NAND Flash的特性。
SmartMedia的儲存格式 #
SmartMedia跟所有的Flash memory 一樣,可以部分抹除也可以部分寫入,而且寫入的單位比抹除的單位要小。在SmartMedia中,抹除的單位叫block,一次最少要抹掉一個block,而寫入的單位是page,不管讀或寫的單位都是page。
1MB和2MB的SmartMedia,page的大小是256 Bytes,4 MB以上的SmartMedia,page的大小是512 Bytes,每一個page除了256/512 Bytes的大小之外,還會搭配一小塊額外的空間,叫做redundant section,或者叫做OOB(out of band)area。

(圖片來源:Bird 提供)
這個redundant section就是用來對付 NAND 的不可靠,而額外設計的儲存空間。它主要有幾個功能:
- 儲存錯誤檢查及更正碼ECC資訊
- 標記page/block的好壞
- 儲存邏輯/實體位址對應的資訊
這裡面最重要的大概是ECC。因為NAND Flash先天比NOR Flash容易出錯,所以需要錯誤檢查和校正碼來協助維護資料的正確性。在SmartMedia中,每256 bytes搭配22 bits的ECC,可以偵測2個 bit的錯誤,以及修正1個 bit 的錯誤(藉由交互計算資料和ECC,它可以知道壞掉的bit是哪一個)。
換句話說,在SmartMedia中,如果一個256 bytes的page裡的2048個bit,有一個bit出了錯,在讀取時,可以藉由跟ECC交互計算而將它恢復成正確的內容。超過1個以上的bit出錯,就沒辦法修正回來了。
除了ECC之外,在redundant area裡還有一個欄位叫做「Data Status Byte」,用來紀錄這個page裡存的資料是否正確。所謂「正確」就是它可以通過ECC的檢查,如果在ECC檢查過程中出錯,而且錯誤超過ECC可以修正回來的範圍,就會在這個byte做記號,讓讀取SmartMedia的裝置知道這個page內的資料出問題了。
除了Data Status Byte,在redundant area中還有另外一個欄位叫做「Block Status Byte」,用來紀錄這個page所在的block還行不行、是否已經開始出問題(在同一個block裡的所有page,這個Block Status Byte的內容應該要一樣)。
誰來執行? #
問題來了,既然SmartMedia裡面沒有NAND Flash控制器,錯誤檢查、校正、壞區標記這些事,該由誰來做呢?答案是由使用SmartMedia的裝置來做。
它大概是這樣進行的:每次裝置要寫入一個page時,它除了準備好的資料之外,同時也會根據ECC的演算法,算出正確的ECC碼,並一起寫入SmartMedia。
讀取SmartMedia時,需要以page為單位,一次讀出256 + 8 bytes,讀出來的資料包含了256 bytes的資料本人,以及8 bytes的redundant area,這裡面包含了ECC碼。裝置會計算讀出資料本人的ECC,並與redundant area中讀出的ECC比較,如果兩者相符,就代表資料正確,這個page的資料是可以使用的;如果兩者不相符,就代表資料已經出錯了。
如果錯誤小於1個bit,可以用ECC修復它,如果超過1個bit,就沒辦法修復。這時控制器就會在data status byte中標註這個page裡的資料有錯。
有沒有發現,在讀取SmartMedia時,我們需要讀取一個page的資料才能利用ECC做錯誤檢查和修正?因此我們沒辦法「只從NAND Flash中讀取1個byte」,雖然NAND Flash的電路結構上做得到,但由於ECC的機制必須以page為單位運作,而我們需要ECC來確保讀出資料的正確性,所以即使我只需要1個byte,也必須要從SmartMedia裡讀出一整個page,才能確保這個byte的正確性。
這就是我們常聽到的,「NAND Flash不適合隨機存取」的主要原因。事實上它是可以隨機存取的,但為了ECC的機制,讀取和寫入都必須以page為單位運作。
由於SmartMedia是不含控制器的NAND Flash晶片,我們才能看到它的redundant section,以及ECC的機制。現在大部分的NAND Flash晶片都內建了控制器,它會幫我們處理這些錯誤檢查和校正的工作,因此我們就看不到這個機制。SD卡和MMC/eMMC就是這樣。
這也是為什麼我們在正式進入SD/MMC/eMMC的主題之前,要先介紹SmartMedia的原因。因為這些機制後面就看不到了。
小結 #
為了介紹NAND Flash的錯誤校正、檢查機制,這一回我們簡單介紹了NAND Flash儲存媒體的濫觴:SmartMedia記憶卡,並簡單說明了它裡面的錯誤檢查及校正機制。
下一回,我們就會正式開始介紹SD/MMC/eMMC。
(責任編輯:賴佩萱)