iT邦幫忙

2021 iThome 鐵人賽

DAY 21
2
Software Development

verilog or very lag系列 第 21

【Day21】I2C的介紹

I2C是什麼?

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 的 Timing Diagram

圖片來源

I2C bus 上的邏輯訊號有幾個原則:

  • 當未傳輸時(IDLE 狀態) ,SCL 和 SDA 都會維持在 high 電位。
  • SCL 為 high 時,表示 SDA 上的資料為有效,此時 SDA 的值不能改變,以確保可以收到到正確的 SDA 狀態
  • SCL 為 low 時,SDA 的狀態可以改變
  • 當 SCL 為 high 時,如果 SDA 變動,只有兩種情況:
    • SDA由 "1" 變 "0" ---> START
    • SDA由 "0" 變 "1" ---> STOP

Acknowledge

當每 8 bit 資料傳輸完後,會跟隨著 1 bit 的 ACK,這是在確保兩端的接收狀況是否正常。

  • 如果是 master 傳資料給 slave :此時 ACK 會來自 slave 端,以此告訴 master 端它有收到資料(通常用於對 slave 下 instructions)。
  • 如果是 master 想要向 slave 端索取資料時,舉個例子,例如讀取記憶體資料:master 會先 slave 傳送想讀取的記憶體"位址",接著 slave 端會先 ack 回去表示有收到此位址,接著傳出記憶體位址上的 data 給 master,那麼傳了 8 bit 後,master 會 ACK 回去,以表示有收到資料,可以繼續傳,那麼 slave 端就會繼續傳,再過了 8 bit,此時如果傳輸要結束的話則 master 不會 ACK 回去,而這個動作也稱 non-ACK,以此告訴 slave 端這次的傳輸到此為止結束了,完成這次通訊。

I2C如何選擇晶片的呢?

在 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 實作分成了四天~~


上一篇
【Day20】SPI的實現
下一篇
【Day22】I2C Master 狀態機的實現
系列文
verilog or very lag30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言