【實作實驗室】晶片溝通的橋樑 — I2C協定原理簡介

作者:實作派

I2C(Inter-Integrated Circuit),唸做 I-square-C,它是 NXP(前身為飛利浦)開發的通訊協定,主要用來作為 IC 之間的通訊。它的速度一般是 100 Kbit/s,也有些是 400 Kbit/s,現在更有到 1 Mbit/s 與 3.4 Mbit/s 的,但仍然無法像 Ethernet 那麼快,所以不適合用來傳送大量資料,不過非常適合拿來設定 IC 初始值,或是 IC 之間的控制訊號傳輸。

由於 I2C 只用兩條線通訊 SDA(data)/SCL(clock),因此空間超級省,那什麼東西最常用到 I2C 呢?一般就是小型 IC,例如 Serial EEPROM/ Tuner/ Demodulator/ MCU/ ADC 等。I2C 是 master/slave 架構,代表一個系統內通常只能有一個 master,其他裝置只能當 slave(這邊說「通常」是因為 spec 裡面有寫它可以 multimaster,但是實務上我遇到的都只有一個 master 配多個 slave,所以這邊只討論 single master)。

I2C 如何傳資料

I2C 是序列式的傳輸,只有兩條線,一條叫做 SDA, 專門用來送資料,另一條叫做 SCL,是用來傳 clock。資料格式如下圖,依序是由 start condition 開始、傳資料,最後 stop condition 結束(所謂 start condition 就是這兩條線某種狀態的組合可以拿來認定為傳輸的開始)。

I2C 的時序圖,依據 Start-Data-Stop 傳送資料(圖片來源:UM10204 I2C-bus specification and user manual

上圖最左邊是 Start condition:SCL=high + SDA falling,最右邊是 Stop condition:SCL=high + SDA raising,至於中間的資料,它是以 8+1 bit 為一組來傳送的,意思是說 8 bit data 外加 1 bit 的 Acknowledge。ACK 是 slave 用來回應 master 用的,表示已經收到資料了,其中 clock 的 positive pulse 必須完整包含在 bit data 之內。

以上就是 I2C 在 physical layer 的資料傳送說明,那一般 IC 如何應用它呢?我們來看看下面的例子。

I2C protocol 應用實例說明

這是一顆 EEPROM 的 I2C 使用說明,敘述這顆 IC 如何利用 I2C 來與外界溝通:

I2C 通訊格式應用實例(圖片來源:Microchip EEPROM datasheet

這表示,你如果要寫一個 byte,就必須要傳送 4 個 byte 的指令,說明如下:

  • 第一個 byte 是 I2C 位址

這顆 EEPROM 的位址是 1010[A2][A1][A0]0,可以讓 IC 知道後面 3 個 byte 的資料是要傳給自己的,那 A2、A1、A0 是什麼東西呢?這些是用來讓使用者自行定義 I2C address 的功能(圖中稱呼為 Control byte),因此若有需要同時使用兩顆 EEPROM,你可以用 IC 的兩根腳位來定義 I2C address,像是在 IC 的 A2~A0 腳位上接 Vcc 或接 GND,藉此用來表示 1 or 0,這樣就能達成自訂 address 的目的了。

EEPROM 的 pinout(圖片來源:UM10204 I2C-bus specification and user manual

  • 第 2、3 個 byte 是記憶體位址

這是一顆 256 Kbit(32 K byte)的記憶體,這兩個 byte 是用來告訴 EEPROM 你想把資料寫在哪個位址。

  • 第 4 個 byte 是資料

我想這個 data byte 就不多說了,一般 data 而已。

I2C 通訊成功必須要有 ACK

目前的說明對於一般人應該是沒什麼大問題,然而魔鬼總是藏在細節裡,若各位有寫 Firmware,應該多少會遇到 data、clock 都送了,IC 就是不動作的狀況,這該怎麼辦呢?在這個階段,我看過的作法有加 delay、改變程式的呼叫順序等,但就是無法完全解決問題(其實這些處理方式大都是下意識地在迴避 I2C 訊號的檢查)。

我建議這時應該要拿起示波器,看看第 9 個 bit ACK 是否為 low(ACK low 表示資料有收到)。ACK 是判斷 Master/Slave 之間通訊是否正常的重要依據,正常狀況下,每個 byte 傳送完都會是 low。

那是否每個 byte 的通訊都會有 ACK 呢?不一定,因為每顆 IC 對於 I2C 的使用有自己的 format,看看下圖,這是 random read 的指令序列:

通常 I2C read 指令中間會多一個 start condition(圖片來源:UM10204 I2C-bus specification and user manual

最開始的 3 個 byte 很好理解,是 address + addrH + addrL,但接下來多了一個 start condition(有些datasheet 會把這裡的 start 寫成 re-start,其實都是同一件事);Start 之後緊接著又是 I2C address,這邊要注意另外一件事,就是 I2C 的 address 有分為兩類,write address 與 read address,他們的差別在於最後一個 bit 是 0 或 1,0 表示 write ,1 表示 read。

例如 Addr=0xA0 表示後面的 byte 是 master 要寫入 slave 的資料;Addr=0xA1 表示後面的 byte 是 master 要從 slave 讀出的資料。

目前走到第二個 start 這裡,都是 master 傳送 SDA/SCL,一旦 read address 傳送結束,master 就不會再送 SDA 了,而只送 SCL。SDA 留給 slave 把資料傳回來,其中最後一個 bit 就是 NACK(high),通常寫 Firmware 的人會知道自己期望讀多少 byte,然而實際回傳的 byte 數量,只能由 NACK 做判斷。

小結

I2C 很方便,只是要留意的小地方很多,NACK、2nd Start(re-start)這種東西要多留意,只要 protocol 正確,chip 一定會動作。如果你手上的板子是工程樣品,那你的元件功能不見得是正常的,因此遇到問題,一定要拿起示波器 Debug,才能真正寫出符合該 Hardware 的程式。

(本文轉載自實作派電子實驗室原文連結;責任編輯:賴佩萱)

StrongPiLab

Author: StrongPiLab

實作派電子實驗室(StrongPiLab)是一個著重知識與經驗的實作交流媒體,提供工程師們理論外的實務經驗,主要傳達電子產品與家電用品的正確操作概念與生活小常識、解說各種測試手法的技巧。

Share This Post On

Submit a Comment

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