你好,我是愛吃魚香ROS的小魚。本節主要介紹I2C協議,并將其主要特點拎出來和大家說說。
本教程所使用硬件平臺為MicroROS學習板V1.0.0,可點擊閱讀原文購買及查看詳情
網上關于I2C協議介紹的有很多,但大都非常細致,將高低電平數據協議等等都介紹了,但新手學習時不用關注那么多底層的東西,比起了解通信原理,了解它是什么,怎么用對我們更加重要。
一、I2C是一種總線通訊協議
和之前我們介紹的串口通信類似,I2C也是一種通信協議。但它是一種總線通訊協議,也就是說,一個I2C可以連接多個設備,物理連接上像這樣。
那它串的設備數量有沒有上限呢?有的,上限是127個。
那為什么我們都是用18和19來驅動OLED和MPU6050呢?原因很簡單,他們都是連在同一跟線上。
上原理圖
像ESP32這種引腳資源匱乏的單片機,引腳的復用就顯得很重要了,這里我們就將OLED和MPU6050都接在同一個I2C上,減少引腳占用。
二、I2C是一種兩線協議
在上幾節我們驅動OLED和IMU的時候,都導入了"Wire.h",這個就是Arudino提供的好的頭文件。我們使用的Wire的定義如下
TwoWire Wire = TwoWire(0);
TwoWire也就是兩線的意思,兩線也就是一個是SCL,一個是SDA
SCL即時鐘線,以一個固定的周期進行電平變換,SDA即數據線,用于數據的傳輸,這樣說有些抽象,小魚用邏輯分析儀 截取了一段OLED初始化時的SCl(GPIO18)和SDA(GPIO19)上的電平變化 ,并分析出其對應的數據。
再放大一些看
可以直觀的看到SCL在數據傳輸開始前一直保持高電平,SDA變成了低電平,這意為著數據傳輸的開始,也就是那個綠點的地方。
根據I2C協議規定:SCL處于高電平時,SDA由高到低變化,這種信號是起始信號。
繼續觀察,你會發現,在 傳輸過程中SCL引腳電平在以一個固定的周期來回跳變 ,從機這邊 當檢測到SCL電平跳變后就開始讀取SDA上的的電平,高記為1,低記為0 。所以你可以看到邏輯分析儀檢測到 八個上升箭頭,一共傳輸了八位數據,這八位數據用16進制表示就是0X3C 。
0X3C是什么,就是我們OLED的設備地址,所以這段信號的意思就是,我接下來要給0X3C的設備發數據了,請編號為0X3C的設備準備接收。
這個信號會被0X3C的設備接收和處理,而同一總線上ID非0X3C的接收到數據后就會將其扔掉,這就是I2C支持多個設備的核心原因。
在我們的開發板上,OLED的默認地址為:0X3C,IMU的默認地址為:0x68
附件:OLED初始化時I2C引腳數據圖
從該表可以看出,數據從905ms開始,到907ms完成了初始化數據的傳輸,下一節我們將按照這個數據傳輸內容編寫代碼,初始化OLED。
三、I2C是一種半雙工協議
上面我們仔細分析了I2C協議,SCL用于周期的變換,SDA用于傳輸數據,所以同一時間,SDA要么用于接收,要么用于發送。所以我們可以得到I2C是一種半雙工協議,同一時間只能進行接收或發送。
四、總結
本節小魚帶你從I2C協議信號入手,詳細介紹了I2C數據的特點,如果你手頭也有邏輯分析工具,也可以嘗試進行分析,開發板設計的也非常人性化,你可以這樣隨手拿幾個杜邦線就可以接入進行測量。
-
總線
+關注
關注
10文章
2894瀏覽量
88225 -
串口通信
+關注
關注
34文章
1627瀏覽量
55610 -
通訊協議
+關注
關注
10文章
278瀏覽量
20386 -
I2C協議
+關注
關注
0文章
26瀏覽量
8509 -
ROS
+關注
關注
1文章
279瀏覽量
17041
發布評論請先 登錄
相關推薦
評論