上一回【Maker電子學】I2C 界面解密 — PART 1,我們聊了 I2C(以下寫為 I2C)界面的發展歷史,以及它的實體層訊號格式,這一次我們要進入 I2C 通訊邏輯的底層,來看看它在這個只有兩根線的 Wired-AND 線路上,是利用什麼樣的邏輯訊號進行通訊。
八位元時代的痕跡
I2C 和 SPI 一樣,都是在 8-bit CPU 當道的年代發展出來的東西,因此它的傳輸單位和 SPI 相同,都是以 byte 為單位。每一次 I2C 的傳輸可以包含很多個 bytes,但它最基本的單位就是 byte,每一個 byte 的後面會附加一個額外的 bit,稱為「acknowledge bit」,它是接收方用來通知傳送方「是的,我收到前面這個 byte 的資料了」或是「好了!夠了!別再送資料了」。大部分的 acknowledge bit 都屬於第一種狀況,只有少部分的通訊方式會用到第二種,我們之後說明通訊協定時會再詳述。
除了資料外,I2C bus 上還有另外兩種狀態,分別稱之為「start」和「stop」,用來指示傳輸的開始與結束。I2C 是 master/slave 的結構,所有的通訊只能由 master 發起,但由於 I2C 允許 bus 上可以有多個 master,而為了避免這些 master 們同時發起傳輸而打架,start 和 stop 便成為它們之間溝通協調的重要機制。
基本時序
下圖是 I2C 傳輸一個 byte 時的典型時序圖:
(圖片來源:Bird 提供)
I2C bus 上的邏輯訊號有幾個原則:
- I2C bus 為 idle high:當 bus 上沒有任何活動時,SCL 和 SDA 都維持在 high
- SCL 為 high 時,表示 SDA 上的資料為有效,此時 SDA 的狀態不能改變,以確保接收方可以取樣到正確的 SDA 狀態
- SCL 為 low 時,SDA 的狀態可以改變
- 當 SCL 為 high 時,如果 SDA 變動,有兩種特殊狀況:SCL high、SDA 下降—START;SCL high、SDA 上升—STOP
因為 I2C bus 為 idle high,當一個 master 要發起傳輸時,它會先把 SDA 拉到 low,而 SCL 維持不變,這時,根據上面的第 4 個原則,這是一個 START 狀態,也就是用來通知 bus 上的其它裝置,有一個傳輸要開始了。
接下來,master 會開始切換 SCL 訊號,在 SCL 上造出連續 8 個方波。根據上面的第 2 個和第 3 個原則,當 SCL 為 low 時,master 會變動 SDA 的狀態,以便讓要傳送的資料出現在 SDA 上,而當 SCL 為 high 時,SDA 的狀態就會保持不動,以便接收方讀取到 SDA 的狀態。
至於接收方會在什麼時候讀取到 SDA 的狀態呢?它可以在 SCL 為 high 時的任何一個時刻去讀取 SDA。對,就是整段 SCL 為 high 時,那一段 SCL 平平的時間,接收方都可以讀取 SDA,如下圖所示:
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏