|

【Maker電子學】I2C 界面解密—PART 4

   
作者:Bird

上一篇文章【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註冊即可享有一切福利!

會員福利
1

免費電子報

2

會員搶先看

3

主題訂閱

4

好文收藏

Author: Liang Bird

在外商圈電子業中闖蕩多年,經歷過 NXP、Sony、Crossmatch 等企業,從事無線通訊、影像系統、手機、液晶面板、半導體、生物辨識等不同領域產品開發。熱愛學習新事物,協助新創團隊解決技術問題。台大農機系、台科大電子所畢業,熱愛賞鳥、演奏管風琴、大提琴、法國號,亦是不折不扣的熱血 maker。

Share This Post On

1 Comment

  1. 「這是一個 2 bytes 的連續寫入指令,它連續寫了 0x00 和 0x07 這兩個值到 EEPROM 的 I2C slave address。」
    這邊好像有筆誤,0x07好像應該是0x77才對?

    Post a Reply

Submit a Comment

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