<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設(shè)計應(yīng)用 > I2C通訊不了?是不是硬件有問題?

          I2C通訊不了?是不是硬件有問題?

          作者: 時間:2024-03-28 來源: 收藏

          我們經(jīng)常會遇到各種各樣的問題,一些通信接口也會出現(xiàn),自然也不例外。假如遇到沒反應(yīng),那么可能會出現(xiàn)這種情況:軟件工程師說,我軟件都已經(jīng)配好了,但是就是讀寫不到數(shù)據(jù),是不是有問題”。

          本文引用地址:http://www.ex-cimer.com/article/202403/456961.htm

          這個時候,就需要我們了解的通信時序,我們可以通過示波器抓取通信的波形,看是否滿足通信時序要求,主機有沒有發(fā)送數(shù)據(jù)?I2C通信地址對不對?如果主機有發(fā)送數(shù)據(jù),從機是否有正常應(yīng)答?通信信號質(zhì)量是否OK?如此這般,一般是能夠查到問題在哪里的。

          基于上面的問題,這會要求我們掌握I2C的通信時序。畢竟,你只有知道它是長什么樣子,你才能知道它對不對下面就簡單介紹下I2C的通信時序。

          概述

          I2C總線是一種十分流行并且強大的總線,其多用于一個主機(或多個)與單個或多個從設(shè)備的場景。圖1表明了多種不同的外設(shè)可以共享這種只需要兩根線便可以連接到處理器的總線,相對于其他接口來說,這也是I2C總線可以提供的最大優(yōu)勢之一。

          這篇應(yīng)用筆記的目標(biāo)是幫助用戶理解I2C總線是如何工作的。

          圖1展示了一個典型的用于嵌入式系統(tǒng)中的I2C總線,其上掛載了多種從設(shè)備。作為I2C主機的從微控制器控制著IO拓展、不同傳感器、EEPROM、多個ADC/多個DAC、等等。所有這些設(shè)備只需要通過來自主機的兩根引腳來控制。

          640-2.png

          電特性

          I2C總線使用開漏輸出控制器,在同一線路上帶有一個輸入緩沖器,這樣便可以允許在單根數(shù)據(jù)線上實現(xiàn)雙向數(shù)據(jù)流傳輸。

          用于雙向的開漏極

          漏輸出極允許將總線上的電壓拉低(大多數(shù)情況下是到地),或釋放總線以允許其被上拉電阻拉高。當(dāng)總線被主機或從機釋放,線上的上拉電阻負(fù)責(zé)將線上電壓上拉到電源軌。由于并沒有設(shè)備可以在總線上輸出高電平,這也就意味著總線在中,將不會碰到一個設(shè)備輸出高,而另一個設(shè)備試圖輸出低所導(dǎo)致的短路問題(電源軌到地)。I2C總線要求處于多主機環(huán)境下的單個主機在輸出高而讀回的實際總線電平為低時(這意味著另一個設(shè)備拉低了它)中止通訊,因為另一個設(shè)備正在使用總線。采用推挽輸出方式的接口就沒有這么自由了,這也正是I2C總線的一個優(yōu)勢。

          640-3.png

          圖2展示了位于SDA/SCL線上的主從設(shè)備的內(nèi)部簡化結(jié)構(gòu),其由一個用于讀取數(shù)據(jù)的緩沖器,以及一個用于發(fā)送數(shù)據(jù)的下拉場效應(yīng)管組成。一個設(shè)備只被允許拉低總線(規(guī)定為短路到地)或釋放總線(對地呈現(xiàn)高阻態(tài))以允許上拉電阻拉升總線電平。當(dāng)處理I2C設(shè)備時,有一個重要的概念需要闡明:沒有設(shè)備可以保持總線為高這個特性使得雙向通訊得以實現(xiàn)。

          開漏極拉低

          正如前面章節(jié)所述,開漏輸出只能將總線拉低,或者釋放總線然后依靠上拉電阻拉高總線。圖3展示了總線拉低時的電流流向。當(dāng)邏輯電路想要發(fā)送一個低電平時,其會使能下拉場效應(yīng)管,場效應(yīng)管會通過短路到地的方式拉低線路。

          640-4.png

          開漏極釋放總線

          當(dāng)從機或主機想要傳輸一個邏輯電平高,它只能通過使能場效應(yīng)管的方式釋放總線。這將會使得總線處于浮空狀態(tài),同時上拉電阻將會將總線電平拉高到供電軌,此電平被當(dāng)作高電平看待。圖4展示了電流如何流過用于拉高總線的上拉電阻。

          640-5.png

          I2C接口

          I2C的常用操作

          I2C總線是一種雙向接口,其使用被稱為主機的控制器與從設(shè)備進行通訊。從機不會主動傳輸任何數(shù)據(jù),除非其被主機尋址。每個處于I2C總線上的設(shè)備均有獨有的設(shè)備地址,以用于與位于同一總線上的其他設(shè)備做區(qū)分。很多從機需要在啟動后進行配置以設(shè)置設(shè)備行為。這通常在主機訪問從機的內(nèi)部寄存器映射時完成,這些寄存器均有獨一無二的寄存器地址。單個設(shè)備可以具有一個或多個寄存器,這些寄存器可以用來存儲或讀寫數(shù)據(jù)。

          I2C總線的物理接口由串行時鐘線(SCL)和串行數(shù)據(jù)線(SDA)組成。SCL和SDA均需要通過上拉電阻連接到Vcc上拉電阻的大小由I2C線路上的等效電容大小決定(想要了解更多,可以參考TI的I2C Pull-up Resistor Calculation這份文檔,文檔號:SLVA689)。數(shù)據(jù)傳送只能在總線空閑時初始化。如果SDA和SCL在一個STOP標(biāo)志后均處于高電平狀態(tài),這時可以認(rèn)為總線處在空閑狀態(tài)。

          主機訪問從機的大體流程如下所示

          1、假設(shè)一個主機想要向從機發(fā)送數(shù)據(jù):

          a、發(fā)送方主機發(fā)送一個START標(biāo)志并且尋址接收方從機

          b、發(fā)送方主機發(fā)送數(shù)據(jù)到接收方從機

          c、發(fā)送方主機通過發(fā)送STOP標(biāo)志結(jié)束傳輸

          2、如果主機想要從從機接收/讀取數(shù)據(jù):

          a、接收方主機發(fā)送START標(biāo)志并尋址發(fā)送方從機

          b、接收方主機發(fā)送需要讀取的寄存器地址到發(fā)送方從機

          c、接收方主機從發(fā)送方從機接收數(shù)據(jù)

          d、接收方主機通過發(fā)送STOP標(biāo)志結(jié)束通訊

          START與STOP標(biāo)志

          主機可以通過發(fā)送START標(biāo)志初始化與設(shè)備的I2C通訊,或者發(fā)送STOP標(biāo)志結(jié)束通訊。當(dāng)SCL處于高電平時,SDA上的下降沿意味著一個START標(biāo)志,而SDA上的上升沿意味著一個STOP標(biāo)志。

          640-6.png

          重復(fù)的START標(biāo)志

          重復(fù)的START標(biāo)志與通常的START標(biāo)志作用類似,其用于STOP標(biāo)志后緊接START標(biāo)志的情況時,用于代替這兩者。它看上去與START標(biāo)志一致,但是與START標(biāo)志不同的是,重復(fù)的START標(biāo)志在STOP標(biāo)志之前出現(xiàn)(也就是總線不處于空閑狀態(tài)時)。當(dāng)主機希望開始一次新的通訊,但又不希望發(fā)送STOP標(biāo)志使總線進入空閑狀態(tài)時這會非常管用,這樣可以防止當(dāng)前主機的總線控制權(quán)被其他主機搶奪(當(dāng)處于多主機環(huán)境下)。

          數(shù)據(jù)有效性與字節(jié)格式

          數(shù)據(jù)位伴隨著SCL上的每一個時鐘脈沖被傳輸。單個字節(jié)由SDA線上的8位數(shù)據(jù)組成,其可以是設(shè)備地址、寄存器地址或者讀自/寫入設(shè)備的數(shù)據(jù)。數(shù)據(jù)以大端在前(MSB)的方式傳輸。在START標(biāo)志與STOP標(biāo)志之間可以傳輸任意數(shù)量的數(shù)據(jù)字節(jié)。SDA線上的數(shù)據(jù)必須在時鐘電平為高時保持穩(wěn)定,因為SCL線為高時,SDA線上的變動將會被當(dāng)作控制指令(START或STOP)。

          640-7.png

          應(yīng)答(ACK)和非應(yīng)答(NACK)

          數(shù)據(jù)的每一字節(jié)(包括地址字節(jié))后總是伴隨著來自接收方的1位ACK位。ACK位使得接收方可以告知發(fā)送方當(dāng)前字節(jié)已成功接收,并且可以發(fā)送下一字節(jié)。

          在接收方發(fā)送ACK位前,發(fā)送方必須釋放總線。接收方通過在ACK/NACK時鐘周期(第9時鐘周期)的低電平相位拉低SDA線來發(fā)送一個ACK位,如此一來,SDA線將會在ACK/NACK時鐘周期的高電平相位保持為低電平。設(shè)置與保持時間必須著重注意。

          如果SDA線在ACK/NACK時鐘周期保持為高電平,這將會被作為NACK。有好幾種狀態(tài)將會導(dǎo)致NACK的產(chǎn)生:

          1、接收方無法進行接收或發(fā)送,因為其正在執(zhí)行一些實時性功能(real-time function),無法與主機進行通訊。

          2、在發(fā)送期間,接收方收到了無法識別的數(shù)據(jù)或指令。

          3、在發(fā)送期間,接收方無法接收更多數(shù)據(jù)字節(jié)(也就是緩沖區(qū)滿了)。

          4、作為接收方的主機完成了數(shù)據(jù)讀取,因此通過發(fā)送一個NACK通知從機。

          640-8.png

          I2C總線數(shù)據(jù)

          數(shù)據(jù)可以寫入/讀自從機,但是這是通過讀寫從設(shè)備內(nèi)部的寄存器完成的。

          包含信息的寄存器處于從機的內(nèi)存中,無論這些信息是配置信息還是一些需要回發(fā)給主機的采樣數(shù)據(jù)。為了指示從機去執(zhí)行某一任務(wù),主機必須向這些寄存器內(nèi)寫入信息。

          雖然通常來說I2C從機是具有多個寄存器的,但也需要注意并不是所有從機都是這樣。對于一個只具有單個寄存器的簡易從機來說,可以通過在從機地址后直接發(fā)送數(shù)據(jù)的方式來直接寫這個單一的寄存器,而不需要再對寄存器進行尋址。一個通過I2C總線控制的8位I2C開關(guān)可以很好的作為單寄存器設(shè)備的例子。由于它通過1位來使能/失能一個通道,因此只需要1個寄存器,主機可以在從機地址后直接寫入寄存器數(shù)據(jù),跳過寄存器編碼部分。

          寫位于I2C總線上的從機

          要在I2C總線上執(zhí)行寫操作,主機會發(fā)送一個START標(biāo)志以及從機地址到總線上,并且將最后1位(讀寫位)設(shè)為0以表明這是寫操作。當(dāng)從機發(fā)送應(yīng)答位之后,主機便發(fā)送希望寫入的寄存器地址。從機再一次應(yīng)答,通知主機從機已準(zhǔn)備好。這之后,主機開始發(fā)送寄存器數(shù)據(jù)到從機。當(dāng)主機發(fā)送完所有需要發(fā)送的數(shù)據(jù)(有時只是一個字節(jié)),其將會通過發(fā)送STOP標(biāo)志結(jié)束通訊。

          圖8展示了一個寫入單個字節(jié)到從機寄存器的例子。

          640-9.png

          讀位于I2C總線上的從機

          從從機讀取數(shù)據(jù)與寫入數(shù)據(jù)類似,但是有一些額外的步驟。

          為了讀取從機,主機必須先指示從機自己想要讀取哪個寄存器。這一步通過執(zhí)行與寫操作類似的開始通訊步驟完成,發(fā)送讀寫位為0的設(shè)備地址(意味著一次寫操作),緊跟著希望讀的寄存器的地址。一旦從機應(yīng)答了此地址,主機將會再一次發(fā)送START標(biāo)志,并發(fā)送讀寫位為1的設(shè)備地址(意味著一次讀操作)。這時,從機將會應(yīng)答讀請求,同時主機釋放總線但是保持到從機的時鐘供應(yīng)。在通訊流程的這一部分,主機將會作為接收方主機,同時從機將會作為發(fā)送方從機。

          主機將會繼續(xù)發(fā)送時鐘脈沖,但是會釋放SDA線以便于從機傳輸數(shù)據(jù)。在每個字節(jié)數(shù)據(jù)的結(jié)尾,主機將會發(fā)送一個ACK到從機,讓從機知道主機準(zhǔn)備好接收更多的數(shù)據(jù)。一旦主機接收完成期待的字節(jié)數(shù)量,它將會發(fā)送一個NACK,通知從機終止通訊并要求從機釋放總線。緊接著主機將會發(fā)送一個STOP標(biāo)志結(jié)束通訊。

          圖9展示了從從機寄存器讀取單個字節(jié)的例子。

          640-10.png

          免責(zé)聲明:本號對所有原創(chuàng)、轉(zhuǎn)載文章的陳述與觀點均保持中立,推送文章僅供讀者學(xué)習(xí)和交流。文章、圖片等版權(quán)歸原作者享有,如有侵權(quán),聯(lián)系刪除。



          關(guān)鍵詞: I2C 通訊 硬件

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();