玩轉 AI 機器人的新境界 – Now and Future
|
View Categories

Flash 記憶體的原理與應用—PART8(I2C EEPROM)

閱讀時間: 1 分鐘

作者:Bird

上一回我們介紹了 I2C EEPROM 的應用情境,以及它的晶片封裝有哪些訊號,這一回我們要繼續介紹如何用 I2C 的通訊來操作 I2C EEPROM 的讀寫。

I2C 通訊 #

一個 I2C 通訊一定是由 master 發起。當 master 想要與某一個 slave 通訊時,它會在 bus 上送出一個 START condition,接著送出要通訊的 7-bit slave address,再加上一個 bit 的讀寫控制 bit。如果 bus 上有 slave 裝置符合這個 slave address,這個 slave 裝置就會在 I2C bus 上回應一個 ACK,讓 master 知道有人接電話了,Master 收到 ACK 後,確定它不是在對空氣講話,就會繼續接下來的通訊。

I2C 所有的通訊都是以 8-bit,也就是 byte 為單位,由 master 發起的第一個 byte 就是 7 個 bit 的 slave address 加上一個讀寫控制 bit:0 代表寫入、1 代表讀取,但 I2C address 這件事常常會讓人搞混,因為有時候我們會直接把第一個 byte 的內容當作 I2C address;以 24LC64 這個 I2C EEPROM 為例,有時候我們會講:對 0xA0 這個 I2C 位址通訊的話就是寫入、對 0xA1 這個位址通訊的話就是讀取,這種包含讀寫控制 bit 的位址表示方法,通常叫做「8-bit I2C address」,而如果我們將前面 7 個 bit 與讀寫控制 bit 分開來說,那就是「7-bit I2C address」,以 24LC64 來說,它的 7-bit I2C address 就是 0x50。

因此,當我們看到一個裝置的 I2C address 時,最好先確定一下它到底是 7-bit 表示法還是 8-bit 表示法,特別是當它小於 0x80 的時候。

內部位址指標 #

在 24LC64 EEPROM 的內部有一個位址指標(address pointer),所有的讀寫操作都是經由這個指標完成的,在讀或寫之前,要先設定這個指標到要讀寫的位置上。

24LC64 有 64K bits 的容量,不過 I2C 的資料傳輸單位是 byte,因此 24LC64 內部實際上是以 8K bytes 的形式在儲存資料,要定址 8K 個不同的位址,需要 13 個 bit (2^13 = 8192),所以 24LC64 的內部位址指標是 13 個 bit。

讀取 #

以下是一個讀取的動作:

(圖片來源:Bird 提供)

當我們要讀取 24LC64 裡的資料時,首先要用 I2C 的寫入動作來設定位址指標,接著不要送出 STOP,而是直接用另一個 START 對 24LC64 的 slave address 開始一個讀取的動作,然後隨著 master 持續送出 SCL 訊號,24LC64 就會在 SDA 上吐出位址指標所指的那個 byte 的資料。每讀出一個 byte 的資料之後,24LC64 內部的位址指標會自動加一。

如果只要讀取一個 byte,那麼當一個 byte 吐完後,master 可以送出 NO ACK 狀態,結束這個回合;如果 master 送出 ACK,代表它還想要繼續讀取,這時 master 可以繼續送出 SCL 訊號,而因為 24LC64 內部的位址指標在剛剛讀完上一個 byte 時就已經自動加一,它當然就會繼續吐出下一個位址的資料。

(圖片來源:Bird 提供)

這個動作稱之為「sequential read」,它可以只送一次位址就連續從 24LC64 讀出許多個 bytes 的資料。

寫入 #

寫入時的操作其實也一樣:先設定內部位址指標,然後把資料寫進去,但不同的是,設定內部位址指標時已經是寫入動作,因此寫完兩個 bytes 的指標後,master 可以接著送出要寫入的資料,不必用 START condition 重新開始另一個動作。

(圖片來源:Bird 提供)

寫入動作同樣也可以連續執行。如果寫完一個 byte 之後,master 不是送出 STOP condition,而是繼續送出資料,隨著內部位址指標的自動增加,就可以連續寫入很多個 bytes:

(圖片來源:Bird 提供)

24LC64 最多可以一次寫入 32 個 bytes 的資料,如果送超過 32 個 bytes,會蓋掉第一個送過去的 byte,實際的寫入動作會在 STOP condition 送出後才被執行。

雖然連續寫入有 32 bytes 的限制,但是連續讀取卻沒有長度的限制。你可以在一個讀取動作中,讓 master 不斷的送出 ACK,叫 24LC64 一直吐出接下來的資料,隨著它內部位址指標的自動增加,你可以一次讀出沒有長度限制的資料,而且當內部位置指標到達最大值 0x1FFF 後,它會自動繞回 0x0000,讓你可以從頭繼續讀取。

以 400KHz 的 I2C Fast Mode 來計算,讀取 8192 個 bytes 會需要:

8192 * 9 / 400K = 0.18432(秒)

上面那個算式乘以 9 是因為每讀取一個 byte 需要 8 次 SCL 的動作,加上一次 ACK,總共 9 次。

小結 #

這一回我們說明了如何利用 I2C 上的通訊來讀取和寫入 24LC64 這顆 I2C EEPROM 的內容。寫入時,實際寫入的動作是發生在 STOP condition 之後,而且寫入其實比讀取要花時間,因為 24LC64 內部的控制電路要先擦除欲寫入位址的內容,才能將資料寫進去,這個動作根據 24LC64 的 datasheet 描述,會花到 5 ms。

5 ms 對大部分的 MCU 來講已經是一個很長很長的時間,下一回我們會繼續來探討,要如何等待這一個時間,知道它寫入完成了沒。

(責任編輯:賴佩萱)

Powered by BetterDocs

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *