上一篇文章【Maker電子學】I2C 界面解密 — PART 3,我們聊了 I2C(以下寫作 I2C) 界面的底層邏輯協定,但是我們發現 I2C 的標準只定義了對裝置的單一/連續的讀取與寫入,並沒有定義我們常使用的暫存器編號使用方法,那麼這些用法是怎麼來的呢?這一次我們就來探討這個部分。
一切都從 EEPROM 開始
我們上次說過,I2C 誕生在一個淳樸的年代,那時候的週邊晶片並沒有爲數衆多的暫存器可供讀寫,因此 I2C 也就沒有定義什麼暫存器位址之類的協定。當時大部分的 I2C 週邊晶片都只有一兩個 8-bit 的暫存器,因此不管是讀或是寫,頂多連續讀寫幾個 byte 就可以了。
但自從 EEPROM 出現之後,這種只用連續讀寫來存取多個暫存器的方法就顯得很笨拙了。假設今天我們有一顆 256 bytes 的 EEPROM,我們總不能每次讀取時都下一個連續讀取 256 bytes 的指令,把它的內容全部讀出來吧?如果寫入的時候這樣做,EEPROM 的壽命很快就會用完了。
因此,當 I2C 的 EEPROM 出現時,就帶入了索引(index)這個協定上的概念。
索引暫存器
這個概念是,EEPROM 的內部有一個稱為 index 的暫存器,它就像一個指標,指向我們要讀取或是寫入的位置。每一次我們對 EEPROM 下寫入指令時,第一個寫入的 byte 就是寫入這個 index 暫存器,接下來寫入的資料才會寫到這個 index 暫存器所指向的位置。
以 24C02 這樣的 EEPROM 爲例,它的容量是 2 Kbits,或是 2048 / 8 = 256 bytes,因此一個 byte 的 index 暫存器剛好可以用來指向 0-255 的位置,也就可以用來存取整顆 EEPROM 的內容。
如果我要對 EEPROM 的第 0 個 byte 寫入一個 0x77 這樣的值,在 I2C 上就要用這樣的指令:
(圖片來源:Bird 提供)
這是一個 2 bytes 的連續寫入指令,它連續寫了 0x00 和 0x07 這兩個值到 EEPROM 的 I2C slave address。根據上面說明的,寫入 I2C EEPROM 的第一個 byte 一定會寫入它的 index 暫存器,因此當第一個 byte 寫完時,index 暫存器的內容就會變成 0x00,而接下來對 EEPROM 所操作的任何動作,不管是讀取還是寫入,都是對著 index 所指向的這個位址進行,因此上面這個指令就會把 0x77 寫到 EEPROM 的 0x00 這個位置裡。
那要讀取 EEPROM 的內容時該怎麼做呢?讀取的時候比較麻煩。假設我們要讀取 EEPROM 裡面位於 0x02 這個位址的內容,我們得先寫一個 0x02 到 EEPROM 的 I2C slave address,然後再對同一個 slave address 下讀取的指令,讀回一個 byte。整個指令會變成這樣:
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏
2020/12/21
「這是一個 2 bytes 的連續寫入指令,它連續寫了 0x00 和 0x07 這兩個值到 EEPROM 的 I2C slave address。」
這邊好像有筆誤,0x07好像應該是0x77才對?