我們花了六次的篇幅,說明了從 EEPROM 開始,各種 flash 記憶體的誕生歷史,也簡單說明了 EEPROM、NOR flash、NAND flash 的運作原理和它們的優缺點。
接下來我們要進入實作的階段,帶大家看看各種 flash 記憶體晶片要如何應用,讓我們先從最簡單的 I2C EEPROM 開始。
I2C EEPROM
我們在說明 flash 的發展史時,曾經介紹過由 Intel 發展的世界第一顆 EEPROM:Intel 2816。在當時,EEPROM 主要用來取代同容量的 EPROM,因此早期的 EEPROM 都設計成與同容量的 EPROM 接腳相容、可直接替換,像是 2816 就可以直接替換 16K-bit 的 2716 EPROM。
曾經有很長一段時間,PC 主機板上的 BIOS 都是使用這種傳統並列式介面的 EEPROM 晶片來儲存,這種晶片有完整的位址、資料接腳,CPU 透過位址接腳送入位址、從資料接腳拿到 EEPROM 晶片內部儲存的資料,因而 CPU 可以直接在 EEPROM 上執行 BIOS 程式,但隨著 CPU 的速度越來越快,這種並列介面的 EEPROM 存取速度逐漸跟不上 CPU,因此現在主機板上的 BIOS 多半都是使用 SPI flash 之類的串列介面 flash 記憶體儲存,在開機時將 flash 的內容讀到 RAM 裡面之後,CPU 再從 RAM 裡面執行 BIOS 的程式。
也因為 BIOS 並不是需要頻繁更新的裝置,EEPROM 這種「可以逐 byte 抹除、改寫」的特性對 BIOS 來說並不是很重要,因此大容量的 EEPROM 在歷史上就慢慢式微,逐漸被各種 NOR flash 甚至 NAND flash 取代。
但仍有一小部分的 EEPROM 留存了下來,而且至今在許多新的設計中仍然會使用,這就是我們今天要介紹的 I2C EEPROM。
I2C 是一種速度不快、只用兩根線就可以連接多個裝置的串列式通訊介面。它雖然有個訊號叫 clock,但嚴格來說它並不是同步式的通訊介面,因此速度不能跑太快。典型的 I2C 介面 clock 頻率是 100 KHz 或 400 KHz,NXP 在 2007 年時加入了 1 MHz 的 Fast Mode Plus,又在 2012 年時加入了 5 MHz 的 Ultra Fast Mode,但由於 I2C 是兩根 single-end 的訊號,要跑到那麼高速對電路設計和 layout 的要求都很高,因此大部分的應用仍然是以 100 KHz 和 400 KHz 為主。想要深入了解 I2C 的讀者,可以參考本專欄的 I2C 介面解密系列文章。
I2C EEPROM 的容量通常都不大,市面上能買到的最大容量大概是 2 M-bit,也就是 256 K-byte,但常用的容量多半落在 16 K-bit 到 64 K-bit 左右,這跟 EEPROM 的特性及用途有關。
EEPROM 跟 flash 最大的不同,就是它可以逐個 byte 的擦除、重寫,因此它很適合用來儲存一些參數、設定,而非用來儲存程式碼,因為程式碼通常不會逐個 byte 變動,要更新的話就是整塊更新,因此更適合使用 flash memory 來儲存。
因此現今的 I2C EEPROM 多半都是用來儲存設定或是參數,既然是設定或參數,就算是複雜的 LUT 表格,了不起成千上萬,再多的數量就罕見了,這也是為什麼市面上的 I2C EEPROM 容量多落在幾十 K bits 到幾百 K bits 的原因。
關於 EDID 的小秘密
我們現在的顯示器,不管是 HDMI、DVI、還是 Display Port 介面,插到電腦上後,電腦的顯示晶片就會知道這台顯示器是什麼牌子、支援哪些解析度、哪些更新頻率,電腦這邊就可以自動為顯示器選擇適合的輸出格式。
這個功能叫做 EDID - extended display identification data,它其實從 VGA 時代就有了,那時叫做 DDC(display data channel),而 EDID 運作的原理很簡單:在顯示器裡有一顆 2 K-bit 的 I2C EEPROM,裡面存了 256 bytes 的資料,包含了顯示器的廠牌、型號、顯示參數(格式、解析度、頻率、色域等...),當顯示器被接上顯示卡之後,顯示卡就透過連接線中的 I2C 介面讀取這顆 I2C EEPROM,經過解讀後就知道該如何送出適合的訊號給這個顯示器。
最早的 EDID 資料只有 128 bytes,後來經過各種顯示介面的加入、不斷擴充,現在已經變成一個非常龐大、複雜的顯示器參數系統,除了關於顯示的資料之外,它甚至還包含了關於音訊、喇叭的資訊(因為 HDMI 可以用來傳輸聲音),也可以包含遙控器的資訊(因為 HDMI 可以讓遙控訊號借到,這個功能稱之為 HDMI CEC)。
但以上這些複雜的 EDID 功能,其實都只是靠一顆小小的 I2C EEPROM 達成。
晶片包裝
一般的 I2C EEPROM 多半都是 8 隻腳的封裝,不管什麼容量都是,我們以 Microchip 的 24LC64 為例來看看。
(圖片來源:Bird 提供)
同一個型號的晶片可能會有 MSOP、DIP、SOIC、TSSOP 等不同大小的 8 隻腳封裝,但腳位、訊號都一樣。
I2C EEPROM 的所有操作都透過 I2C bus 的兩個訊號來完成,因此真正必要的訊號就只有電源兩隻腳和 I2C 訊號兩隻腳。
額外的幾個訊號是:WP 用來保護 I2C EEPROM 不被寫入,當 WP 訊號為 high 時,所有對 EEPROM 的寫入都會失效。
A0、A1、A2 三隻腳則可以用來設定 I2C EEPROM 使用不同的 I2C 位址。由於 I2C 是一個可以連接多個裝置的 bus,在同一個 bus 上每一個裝置都要有一個獨一無二的 I2C 位址;如果在同一個 bus 上要連接兩顆以上同型號的 I2C EEPROM,就需要用 A0、A1、A2 這三隻腳來幫它們設定不同的 I2C 位址。
24LC64 的 7-bit I2C 位址是 0x50 加上 A0、A1、A2 的設定。如果 A0、A1、A2 在電路上都接在 low,他們的值都是 0,那麽要透過 I2C 存取 24LC64 就要用 0x50 這個 7-bit 位址。
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏