I2C,又稱 I²C(Inter-Interated Circuit),在 I2C 的通訊協定中,收發資料只單純靠兩條線就能完成,分別為 SCL(serial clock) 以及 SDA(serial data),但比較特別的是 I2C bus 上所連接的裝置都是 open-drain 的方式來驅動信號的,那跟一般的數位邏輯輸出電路有著甚麼樣的差異呢?
一般的數位邏輯輸出電路會有分別把電位拉到 high 及 low 的兩顆電晶體,但是 open-drain 驅動的電路則是只有負責把電位拉到 low 的電晶體,而高電位則是由外部的上拉電阻負責輸出。
那這樣一條 clk 一條 data 要如何溝通呢?就是因為只有一條資料線,所以每個裝置端的 SDA 都可以是雙向溝通的,它既可以當輸入也可以當輸出,需要 "0" 時把電位拉到 "0",需要 "1" 時輸出高阻抗,此時裝置與 BUS 端有如斷路,讓上拉電阻到 Vcc 來提供 "1"。
I2C bus 上的邏輯訊號有幾個原則:
Acknowledge
當每 8 bit 資料傳輸完後,會跟隨著 1 bit 的 ACK,這是在確保兩端的接收狀況是否正常。
在 master 要與 BUS 上的其中一個 slave 溝通時,會先將要溝通 chip 的 address 透過 SDA 傳輸到 BUS 上,此時如果 address 沒錯的話,那麼該 slave 會在第八個 SCL 週期結束後把 SDA 拉下來,而 master 端會在 SCL 進入第九個週期前去讀取 SDA 是否為 low ,為 low 的話就會開始一連串 handshake 式的傳輸動作,若沒有拉為 low(non-ACK),則出現問題,可能 slave 根本不在 BUS 上或是 slave 端的 address 打錯了都有可能。
因為 I2C 這個通訊協定比較複雜一點點,提前要知道的觀念比較多,程式也比較複雜,所以這次的 I2C 實作分成了四天~~