上一回我們介紹了 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 時就已經自動加一,它當然就會繼續吐出下一個位址的資料。
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏