在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      博客專欄

      EEPW首頁 > 博客 > I2C總線協(xié)議分析

      I2C總線協(xié)議分析

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

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

      常見的硬件結(jié)構(gòu)圖(一個(gè)適配器,兩根線,若干設(shè)備而已)


      I2C總線通信時(shí)序

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

      主設(shè)備如何發(fā)起開始和停止通信信號(hào)?

      在SCL線為高電平時(shí),將SDA線由高拉低,即發(fā)出一個(gè)start開始信號(hào);當(dāng)SCL為高電平時(shí),將SDA由低拉高,即發(fā)送一個(gè)stop停止信號(hào);那么這些操作都是由主設(shè)備的I2C控制器完成的。


      I2C總線上有很多的設(shè)備,如何保證一對(duì)一的通信?

      在I2C總線上的每個(gè)設(shè)備都有一個(gè)7bit位的地址,在I2C總線處于空閑狀態(tài)時(shí),如果有主設(shè)備想發(fā)起通信,那么將由它先發(fā)出一個(gè)start信號(hào)占有總線,緊接著發(fā)送這個(gè)主設(shè)備想要進(jìn)行通信的從設(shè)備的7bit位的地址,這個(gè)地址在I2C總線上處于廣播狀態(tài),即總線上的所有設(shè)備都能看到這個(gè)地址,如果某一個(gè)從設(shè)備發(fā)現(xiàn)總線上傳輸?shù)牡刂泛妥约旱脑O(shè)備地址一樣,那么就發(fā)送一個(gè)應(yīng)答信號(hào),這時(shí)主從設(shè)備間的通信就建立了,這個(gè)時(shí)候I2C總線將處于busy狀態(tài),其他的設(shè)備無法再使用總線,從而在總線上建立了一個(gè)一對(duì)一的通信。當(dāng)通信結(jié)束時(shí),由主設(shè)備發(fā)送一個(gè)stop信號(hào),釋放總線,其他的設(shè)備就可以再次占用總線通信了。

      I2C上的主從設(shè)備如何通信?

      在I2C總線上傳輸?shù)臄?shù)據(jù)都是8bit位為單位的,所以當(dāng)主機(jī)要往從機(jī)寫數(shù)據(jù)時(shí)時(shí)序如下:

      1. 發(fā)送start信號(hào)

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

      3. 從機(jī)收到地址后,發(fā)送ACK應(yīng)答信號(hào)

      4. 主機(jī)收到應(yīng)答信號(hào)后發(fā)送要寫的8位數(shù)據(jù)

      5. 若從機(jī)收到主機(jī)發(fā)送的數(shù)據(jù),發(fā)送ACK應(yīng)答信號(hào)

      6. 如果主機(jī)要繼續(xù)寫,那么回到步驟4,如果寫完了那么發(fā)送stop信號(hào),終止通信

      當(dāng)主機(jī)要從從機(jī)讀取數(shù)據(jù)時(shí)時(shí)序如下:

      1. 發(fā)送start信號(hào)

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

      3. 從機(jī)收到地址后,發(fā)送ACK應(yīng)答信號(hào)

      4. 主機(jī)收到應(yīng)答信號(hào)后等待接收從機(jī)的數(shù)據(jù)

      5. 從機(jī)發(fā)送主機(jī)要讀取的數(shù)據(jù)

      6. 若主機(jī)收到從機(jī)發(fā)送的數(shù)據(jù),發(fā)送ACK應(yīng)答信號(hào)

      7. 如果主機(jī)要繼續(xù)讀,那么回到步驟4,如果讀完了那么發(fā)送stop信號(hào),終止通信


      那么在具體的使用場(chǎng)景中是什么樣子呢?從機(jī)設(shè)備內(nèi)部往往有很多寄存器,如何讀寫這些寄存器呢?以RPR0521這個(gè)sensor作為從設(shè)備的實(shí)例進(jìn)行分析:

      主機(jī)寫RPR0521中某個(gè)寄存器(寄存器的地址是8位的,寄存器中數(shù)據(jù)也是8位的)

      1. 主機(jī)發(fā)送完7位的從機(jī)地址和寫位

      2. 主機(jī)發(fā)送8位的要寫的從機(jī)的內(nèi)部寄存器地址

      3. 從機(jī)收到后發(fā)送ACK

      4. 主機(jī)收到ACK后,然后發(fā)送要往這個(gè)寄存器寫的數(shù)據(jù)

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


      主機(jī)讀RPR0521中某個(gè)寄存器的值(寄存器的地址是8位的,寄存器中數(shù)據(jù)也是8位的)

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

      2. 主機(jī)發(fā)送8位的要讀的從機(jī)的內(nèi)部寄存器地址(用于確定要讀的寄存器的地址)

      3. 從機(jī)收到后發(fā)送ACK

      4. 主機(jī)收到ACK后發(fā)送7位的從機(jī)地址和讀位,然后等待接收數(shù)據(jù)

      5. 主機(jī)收到ACK和從機(jī)發(fā)送過來的數(shù)據(jù)

      6. 如果主機(jī)不讀了就發(fā)送stop,如果繼續(xù)讀就回到步驟5(從機(jī)會(huì)自動(dòng)發(fā)送連續(xù)寄存器的數(shù)據(jù))


      常用debug手段

      在實(shí)際項(xiàng)目中,通常會(huì)出現(xiàn)讀不到數(shù)據(jù),那么我們就需要debug,最常見的debug手段就是使用示波器抓時(shí)序,下圖是I2C數(shù)據(jù)傳輸?shù)臅r(shí)序:


      SDA的數(shù)據(jù)在SCL位高電平時(shí)保持穩(wěn)定,在SCL為低電平時(shí)數(shù)據(jù)改變,所以我們應(yīng)該在時(shí)鐘周期的高電平期間讀取有效數(shù)據(jù)進(jìn)行分析。

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


      *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



      關(guān)鍵詞: I2C 總線協(xié)議

      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉