作者:Bird
上一回【Maker電子學】Flash 記憶體的原理與應用—PART8(I2C EEPROM)中,我們說明了如何利用 I2C 上的通訊來讀取和寫入 24LC64 這顆 I2C EEPROM 的內容。EEPROM 的讀取速度很快,跟得上 I2C bus 的存取速度,但是寫入的速度很慢,因此在寫入時,需要一些特別的等待處理。
這一回我們就來看看這個等待要怎麼做。
寫入有多慢?
我們來看一下 24LC64 的 datasheet 中,關於時間特性的描述。下面這個表是 24LC64 的 AC characteristics,它說明了 24LC64 的各種訊號所需要的時序要求。
(圖片來源:Bird 提供)
比方說,output valid from clock,就是告訴我們,在 I2C bus 的 SCL 變為 low 後,SDA 最長還會維持多久不變化。根據 I2C bus 的規格,SDA 在 SCK 為 high 的時候不能變化,而在 SCL 為 low 的時候可以變化到下一個狀態,但實務上兩者不會同時變動,也就說 SDA 並不會在 SDL 變成 low 的瞬間就一起變化。
在數位訊號的世界裡,沒有真正的「同時」這種事,只要你把觀察的尺度放得夠大,都看得到時間差異,因此為了保證 SCL 為 high 的時候 SDA 絕對不會變化,一般在設計晶片內部 I2C 的電路時,都會確定 SCL 變為 low 之後,SDA 才開始變化,因此 SDA 會在 SCL 變為 low 之後再稍微等待一小段時間,才開始變化,這個時間就是 datasheet 上的 output valid from clock。
從 datasheet 上可以看出來,很多的時序都會隨著供電電壓的變化而不同。當 24LC64 的供電電壓在 1.7 V-2.5 V 時,它切換邏輯訊號的速度會比較慢,因此只能跑到 100 KHz 的 standard-mode;如果要跑 400 KHz 的 fast-mode,就要用 2.5 V 以上的電壓供電,至於如果要跑 1 MHz 的 fast-mode plus,則需要使用高速版本的晶片 24 FC64。
這整張表裡面大部分的數字都是以 ns 為單位,唯獨有一個特性的單位是 ms,就是 write cycle time。
Write cycle time 就是 24LC64 寫入資料所需要的時間,根據 datasheet 上的說明,不管是寫入一個 byte 還是寫入一個 page,最長都可能會需要 5ms。
5 ms 對現在的 MCU 來說是一個很長的時間。以很常用的 STM32F030 來說,它的 Cortex-M0 核心大部分是 single-cycle 的指令,也就是說每一個 clock 可以執行一個指令;STM32F030 可以輕輕鬆鬆跑到 48 MHz,也就說它一秒鐘可以跑 48,000,000 個 single-cycle 指令,換算一下 5 ms 可以跑:
48000000 * 0.005 = 240,000
24 萬個 single-cycle 指令!
為什麼需要這麼長的時間呢?這跟 24LC64 內部的結構還有 EEPROM 的原理有關。
EEPROM 的寫入方式
雖然我們都說 EEPROM 可以逐個 byte 去抹除、寫入,但是實務上在設計晶片時,抹除的電路不會涉及到 byte 這麼小的單位。在 24LC64 內部,抹除和寫入都是以「page」為單位在進行,而一個 page 是 32 bytes。
當我們要寫入某一個特定位址的 byte 時,24LC64 會利用一個 buffer 暫存整個 page 的資料,抹除整個 page 之後,再把整個 page 連同新的資料一起寫進去,因此在 24LC64 的 datasheet 上有這麼一句耐人尋味的說明:
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏