上一篇文章【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註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏
2021/07/22
抓個 bug,SMBus detect clock low timeout 時間是 35ms,而非 3.5 ms。
2020/11/18
I2C bus 上的所有裝置都透過 SDA 和 SCL 兩根線以 wired-OR 的方式連接在一起=>請問是wired-OR 還是 wired-AND
2024/04/24
當然是 Wired-AND