博客專欄

        EEPW首頁 > 博客 > I2C總線協議分析

        I2C總線協議分析

        發布人:嵌入式Linux 時間:2023-01-13 來源:工程師 發布文章
        I2C總線概念

        I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。它只需要兩根線即可在連接于總線上的設備之間通信。I2C的兩根線SDA(串行數據線)和SCL(串行時鐘線)都是雙向I/O線,接口電路為開漏輸出,需通過上拉電阻接電源VCC,當總線空閑時,兩根線都是高電平。

        常見的硬件結構圖(一個適配器,兩根線,若干設備而已)


        I2C總線通信時序

        使用I2C通信時,必須指定主從設備,一般包含有I2C控制器的處理器被配置成主設備,掛接在i2c總線上的外設作為從設備。通信開始都是由主設備發起的,在i2c總線上的每個設備都有一個7bit位的地址,稱為i2c設備地址。

        主設備如何發起開始和停止通信信號?

        在SCL線為高電平時,將SDA線由高拉低,即發出一個start開始信號;當SCL為高電平時,將SDA由低拉高,即發送一個stop停止信號;那么這些操作都是由主設備的I2C控制器完成的。


        I2C總線上有很多的設備,如何保證一對一的通信?

        在I2C總線上的每個設備都有一個7bit位的地址,在I2C總線處于空閑狀態時,如果有主設備想發起通信,那么將由它先發出一個start信號占有總線,緊接著發送這個主設備想要進行通信的從設備的7bit位的地址,這個地址在I2C總線上處于廣播狀態,即總線上的所有設備都能看到這個地址,如果某一個從設備發現總線上傳輸的地址和自己的設備地址一樣,那么就發送一個應答信號,這時主從設備間的通信就建立了,這個時候I2C總線將處于busy狀態,其他的設備無法再使用總線,從而在總線上建立了一個一對一的通信。當通信結束時,由主設備發送一個stop信號,釋放總線,其他的設備就可以再次占用總線通信了。

        I2C上的主從設備如何通信?

        在I2C總線上傳輸的數據都是8bit位為單位的,所以當主機要往從機寫數據時時序如下:

        1. 發送start信號

        2. 發送7位地址+1個讀寫位0(0表示寫,1表示讀)

        3. 從機收到地址后,發送ACK應答信號

        4. 主機收到應答信號后發送要寫的8位數據

        5. 若從機收到主機發送的數據,發送ACK應答信號

        6. 如果主機要繼續寫,那么回到步驟4,如果寫完了那么發送stop信號,終止通信

        當主機要從從機讀取數據時時序如下:

        1. 發送start信號

        2. 發送7位地址+1個讀寫位1(0表示寫,1表示讀)

        3. 從機收到地址后,發送ACK應答信號

        4. 主機收到應答信號后等待接收從機的數據

        5. 從機發送主機要讀取的數據

        6. 若主機收到從機發送的數據,發送ACK應答信號

        7. 如果主機要繼續讀,那么回到步驟4,如果讀完了那么發送stop信號,終止通信


        那么在具體的使用場景中是什么樣子呢?從機設備內部往往有很多寄存器,如何讀寫這些寄存器呢?以RPR0521這個sensor作為從設備的實例進行分析:

        主機寫RPR0521中某個寄存器(寄存器的地址是8位的,寄存器中數據也是8位的)

        1. 主機發送完7位的從機地址和寫位

        2. 主機發送8位的要寫的從機的內部寄存器地址

        3. 從機收到后發送ACK

        4. 主機收到ACK后,然后發送要往這個寄存器寫的數據

        5. 如果主機不繼續寫數據就直接發送stop,如果還要往下一個寄存器繼續寫(寄存器地址必須連續)那么回到步驟4發送下一個數據,直到寫完發送stop


        主機讀RPR0521中某個寄存器的值(寄存器的地址是8位的,寄存器中數據也是8位的)

        1. 主機發送完7位的從機地址和寫位(一定要注意,先寫然后讀)

        2. 主機發送8位的要讀的從機的內部寄存器地址(用于確定要讀的寄存器的地址)

        3. 從機收到后發送ACK

        4. 主機收到ACK后發送7位的從機地址和讀位,然后等待接收數據

        5. 主機收到ACK和從機發送過來的數據

        6. 如果主機不讀了就發送stop,如果繼續讀就回到步驟5(從機會自動發送連續寄存器的數據)


        常用debug手段

        在實際項目中,通常會出現讀不到數據,那么我們就需要debug,最常見的debug手段就是使用示波器抓時序,下圖是I2C數據傳輸的時序:


        SDA的數據在SCL位高電平時保持穩定,在SCL為低電平時數據改變,所以我們應該在時鐘周期的高電平期間讀取有效數據進行分析。

        以上是我總結的I2C總線的基本協議,如有不足歡迎指出,謝謝閱讀!


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: I2C 總線協議

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 华池县| 云南省| 庆元县| 如东县| 邯郸市| 桂林市| 庆城县| 宁河县| 黑龙江省| 昌都县| 汾西县| 正蓝旗| 海城市| 宁河县| 南开区| 张北县| 临漳县| 平定县| 澎湖县| 富源县| 通许县| 康平县| 中西区| 武冈市| 新昌县| 治多县| 宁远县| 新河县| 光山县| 临夏县| 富阳市| 廉江市| 西贡区| 松阳县| 常德市| 射洪县| 平定县| 台安县| 静安区| 莱西市| 襄城县|