|

【Maker電子學】I2C 界面解密 — PART 5 時脈擴展

   
作者:Bird

上一篇文章【Maker電子學】I2C 界面解密—PART 4,我們用 EEPROM 作爲例子,完整說明了用 I2C(以下寫作 I2C) 界面存取暫存器的方式與操作週邊 IC 的方法。這一次我們要進入到 I2C 界面比較少人接觸到的一個協定:時脈擴展(clock stretching)。

關鍵的 Wired-AND

我們之前在講 I2C 實體層時說過,I2C bus 上的所有裝置都透過 SDA 和 SCL 兩根線以 wired-OR 的方式連接在一起。我們再來複習一下 wired-AND 的運作方式:

  • 當所有的裝置都輸出 high 時,bus 上的狀態才會是 high
  • 只要有任何一個裝置輸出 low,bus 上的狀態就會是 low

換句話說,任何一個裝置都能藉由驅動 bus 來讓 bus 變 low,但它沒辦法主動讓 bus 變成 high;只有當大家都輸出 high(也就是不驅動 bus)時,bus 的狀態才會因爲 pull-up 電阻而變成 high。

(圖片來源:Bird 提供)

上圖是 I2C 裝置內部連接 SDA/SCL 訊號的電路示意圖。每個裝置連接到 SDA 或 SCL 都有一個 low-side 的驅動電路用來把 SDA/SCL 的狀態拉到 low,但它沒有 high-side 的驅動電路,因此當 I2C 關閉 low-side,驅動電晶體時,它就是「不驅動」的狀態,也就是說接腳是在 high-Z 的狀態,彷彿這支腳沒有連接到 bus 上一般。

除了驅動 bus 爲 low 的電晶體外,SDA/SCL 都還有另一個電路叫做 input buffer,這是讓 I2C 裝置可以讀取 SDA/SCL 的狀態所使用的。

我們都知道 SDA 是雙向的接腳,它可能是由 master 驅動、slave 接收,也有可能是 slave 驅動、master 接收。不管是 master 還是 slave,當他們需要讀取 SDA 的狀態時,就會透過 input buffer 去感測 SDA 的狀態。

那麼 SCL 呢?

根據我們之前的說明,由於 I2C 的 clock 是由 master 產生,因此在傳輸過程中 SCL 似乎都只由 master 驅動,如此一來,master 似乎用不到 SCL 的 input buffer?非也非也,在我們今天要談的重點—時脈擴展(clock stretching)的狀態中,master 的 SCL input buffer 就扮演了很重要的角色。

忙不過來時

時脈擴展(clock stretching)這個功能,是設計用來讓動作比較慢的 slave 裝置在忙不過來時,通知 master「慢點、慢點」的方法。

本文為會員限定文章

立即加入會員! 全站文章無限看~

                               

已經是會員? 按此登入

只需不到短短一分鐘...

輸入您的信箱與ID註冊即可享有一切福利!

會員福利
1

免費電子報

2

會員搶先看

3

主題訂閱

4

好文收藏

Author: Liang Bird

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

Share This Post On

2 Comments

  1. 抓個 bug,SMBus detect clock low timeout 時間是 35ms,而非 3.5 ms。

    Post a Reply
  2. I2C bus 上的所有裝置都透過 SDA 和 SCL 兩根線以 wired-OR 的方式連接在一起=>請問是wired-OR 還是 wired-AND

    Post a Reply

Submit a Comment

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