iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1
Arm Platforms

基於ARM-M0架構MCU之落摔檢測韌體開發系列 第 9

[DAY 9] _I²C協議介紹

現在有不少的sensor傳輸都是用I2C協議在做傳輸的,在教學用I²C如何撰寫前,我認為是要先了解協議,不然遇到困難會看不懂錯哪,明明照手冊寫但數值卻跑不出來,這時候通常需要1個邏輯分析儀去看I²C的時序有沒有符合手冊上的時序,或有沒有符合你想要寫入的時序。

1.介紹:

I²C 是Inter-Integrated Circuit的縮寫,I²C 只是用兩條雙向的線
一條 Serial Data Line (SDA) ,另一條Serial Clock (SCL)
I²C(Inter-Integrated Circuit)字面上的意思是積體電路之間,它其實是I²C Bus簡稱,中文可說成積體匯流排電路,它是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主機板、嵌入式系統或手機用以連接低速週邊裝置而發展。I²C的正確讀法為「I平方C」("I-squared-C"),而「I二C」("I-two-C")則是另一種錯誤但被廣泛使用的讀法。

2.I2C 的實體界面:

I2C 的實體界面只有兩根訊號,分別稱之爲 SCL(serial clock)與 SDA(serial data),而由於 I²C 是一個 bus,在這個 bus 上所有的裝置都得透過這兩個訊號相連,也就是說 I²C 只需要兩根訊號線,就可以讓很多裝置彼此之間互相通訊。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979ow8RnEZzGT.png
上圖是一個典型的 I²C bus 電路,bus 上的所有裝置都透過 SCL/SDA 這兩根線相連。I²C 允許 bus 上可以有多個 master、多個 slave 存在,只要彼此的 address 不衝突、裝置數量沒有超過 bus 的電氣特性上限就沒有問題。
在這個電路中,有兩個上拉電阻,分別將 SCL 和 SDA 拉到 VCC。這兩顆電阻稱之爲 I²C bus 的「上拉電阻」(pull-ups),它們是 I²C bus 能正常運作的關鍵。

3.Wired-AND:

I²C bus 上所有的裝置都是透過 open-drain 或 open-collector 的方式來驅動 SCL 或 SDA。一般 push-pull 的數位邏輯輸出電路會有 high/low 兩顆電晶體,各自負責把輸出拉到 high 或 low 的工作,但 open-drain 或 open-collector 的輸出則只有 low-side 一顆電晶體。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979bsPDEvJmRG.png
從上面的電路可以看出,因爲 open-drain 輸出電路只有 low-side 一顆電晶體,它只能把輸出拉到 low,無法把輸出變成 high,因此當 open-drain 輸出的 low-side 電晶體不導通時,它就會呈現 high-Z 的高阻抗狀態,就好像它沒有接到任何東西一樣。

Wired-AND(線與)的重點:

當所有的裝置都輸出 high 時,bus 上的狀態才會是 high
只要有任何一個裝置輸出 low,bus 上的狀態就會是 low
https://ithelp.ithome.com.tw/upload/images/20210922/201419793hLWw3Ydhj.png
這樣的電路稱之爲「Wired-AND」邏輯,它的意思是用電路連接(wired)構成的 AND 邏輯,I²C bus 上的所有裝置,就是靠著 Wired-AND 的邏輯連接在一起的。

至於上拉電阻的大小,是 I²C bus 電路設計上一個很重要的參數。這個電阻放得太大的話拉 high 的速度會很慢,影響到 bus 高速運作的穩定性;放的太小,又會擔心裝置的驅動能力不夠,無法把 bus 拉得夠地

4.基本時序:

I²C bus 上的邏輯訊號有幾個原則:

  1. 當I²C bus 上沒有任何活動時,SCL 和 SDA 都維持在 high
  2. SCL 為 high 時, SDA 上的資料為有效,此時 SDA 的狀態不能改變,以確保接收方可以取樣到正確的 SDA 狀態(綠色部分)
  3. SCL 為 low 時,SDA 的狀態可以改變(藍色部分)
  4. 當 SCL 為 high 時,如果 SDA 變動,有兩種特殊狀況:(下圖黃色部分)
    SCL high、SDA 下降—START (開始信號)
    SCL high、SDA 上升—STOP (停止信號)
    https://ithelp.ithome.com.tw/upload/images/20210922/20141979cdQItwtOr9.png

4-1.基本時序-Acknowledge(ACK)

每一個 8-bit 的資料傳輸結束後,會跟著一個 acknowledge bit。這個 acknowledge bit 固定由接收方產生,有兩種用法:
1.當 master 是傳送方、slave 是接收方,也就是說這個傳輸是 master 寫入資料到 slave 時,這個acknowledge bit 是用來讓 slave 告訴 master「收到!了解!正確!」
2.當 master 是接收方、slave 是傳送方,也就是說這個傳輸是 master 從 slave 讀取資料時,這個 acknowledge bit 是用來讓 master 告訴 slave「我還要接著讀,請繼續準備下一筆資料」或者是「夠了,我讀完了」。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979FFfTl9pShp.png
Acknowledge bit 的狀態定義是:
low -0 是「好、OK、收到、請繼續」
high -1 是「出錯了、沒有人在家、不要繼續」

4-2.基本時序-設備地址點名 (Address)

I²C 是一個多裝置的 bus,因此每當 master 發起傳輸時,它得先點名,就像老師叫特定座號的同學回答問題一樣,而這個座號就是I²C address。master不需要 I²C address,因為沒有人會點名老師起來回答問題。
因此所有的 I²C 傳輸週期,第一個 byte 都是用來點名的,它的內容就是被點到裝置的 address。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979K0olgOvW4q.png
上圖黃色的部份是呼叫從機的地址

4-3.基本時序-讀or寫資料基本格式

下面是 I²C master 對 slave 寫入或讀取一個 byte 資料的格式:
https://ithelp.ithome.com.tw/upload/images/20210922/20141979fXlK8sfSbV.png
由於這是PPT做的,我就直接用截圖的方式,上圖可以看的很清楚傳輸過程,我紅框起來的是重要的地方這是根據你讀或寫來決定資料來去方向,左下角的部分是在說明MCU就像是主機,Sensor是從機在I²C是雙向傳輸資料的。

我附上我參考的網站,我做了重點整理
參考網站:https://makerpro.cc/2020/05/i2c-interface-part2/

明天我就開始講說我如何用軟體去寫協定吧,再來會接著ADXL345的Datasheet看法。
我提一下I²C有兩種方式可以實現

1.硬體方式實現

利用官方寫好的I²C函式去使用,只能選擇有I²C複用功能的腳位。

2.軟體方式實現

直接用GPIO口去達成I²C協議,任何IO口都可以用,我用的就是這個方式,我當初會選擇這方式是因為我想真正弄懂I²C協議是在幹嘛的!!,對了解有很大的用處,還有1個好處因為我只需要用到兩個函式HIGH跟LOW組成各個的I²C協議部分,這樣不管移植到哪個MCU都不會有困難,可以說是0修改移植!!!-,講了那麼多好處,當然也講不好的部分,理論上這軟體定義的方式會比官方訂好硬體的腳位上升速度和下降速度還來的慢,穩定度也是硬體的會較好一些。


上一篇
[DAY 8] _用標準庫開發,以STM32F030為例
下一篇
[DAY 10] _軟體實現I2C協議
系列文
基於ARM-M0架構MCU之落摔檢測韌體開發32

尚未有邦友留言

立即登入留言