RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

幫助用戶理解I2C總線是如何工作的

工程師鄧生 ? 來(lái)源:玩轉(zhuǎn)嵌入式 ? 作者:玩轉(zhuǎn)嵌入式 ? 2022-09-07 09:59 ? 次閱讀

概述

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

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

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

06567ee8-2e3d-11ed-ba43-dac502259ad0.png

1、電特性

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

1.1 用于雙向通訊的開(kāi)漏極

開(kāi)漏輸出極允許將總線上的電壓拉低(大多數(shù)情況下是到地),或釋放總線以允許其被上拉電阻拉高。當(dāng)總線被主機(jī)或從機(jī)釋放,線上的上拉電阻負(fù)責(zé)將線上電壓上拉到電源軌。由于并沒(méi)有設(shè)備可以在總線上輸出高電平,這也就意味著總線在通訊中,將不會(huì)碰到一個(gè)設(shè)備輸出高,而另一個(gè)設(shè)備試圖輸出低所導(dǎo)致的短路問(wèn)題(電源軌到地)。

I2C總線要求處于多主機(jī)環(huán)境下的單個(gè)主機(jī)在輸出高而讀回的實(shí)際總線電平為低時(shí)(這意味著另一個(gè)設(shè)備拉低了它)中止通訊,因?yàn)榱硪粋€(gè)設(shè)備正在使用總線。采用推挽輸出方式的接口就沒(méi)有這么自由了,這也正是I2C總線的一個(gè)優(yōu)先。

06784b86-2e3d-11ed-ba43-dac502259ad0.png

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

1.1.1 開(kāi)漏極拉低

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

06907a80-2e3d-11ed-ba43-dac502259ad0.png

1.1.2 開(kāi)漏極釋放總線

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

06a02e8a-2e3d-11ed-ba43-dac502259ad0.png

2 I2C接口

2.1 I2C的常用操作

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

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

主機(jī)訪問(wèn)從機(jī)的大體流程如下所示:

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

發(fā)送方主機(jī)發(fā)送一個(gè)START標(biāo)志并且尋址接收方從機(jī)

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

發(fā)送方主機(jī)通過(guò)發(fā)送STOP標(biāo)志結(jié)束傳輸

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

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

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

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

接收方主機(jī)通過(guò)發(fā)送STOP標(biāo)志結(jié)束通訊

2.1.1 START與STOP標(biāo)志

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

06b13bee-2e3d-11ed-ba43-dac502259ad0.png

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

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

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

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

06cb6e88-2e3d-11ed-ba43-dac502259ad0.png

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

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

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

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

接收方無(wú)法進(jìn)行接收或發(fā)送,因?yàn)槠湔趫?zhí)行一些實(shí)時(shí)性功能(real-time function),無(wú)法與主機(jī)進(jìn)行通訊。

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

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

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

06ea0244-2e3d-11ed-ba43-dac502259ad0.png

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

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

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

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

3.1 寫(xiě)位于I2C總線上的從機(jī)

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

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

0707bad2-2e3d-11ed-ba43-dac502259ad0.png

3.2 讀位于I2C總線上的從機(jī)

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

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

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

071a8de2-2e3d-11ed-ba43-dac502259ad0.png


原文地址:https://www.ti.com/lit/an/slva704/slva704.pdf

??

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7542

    瀏覽量

    151311
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    300

    瀏覽量

    38311
  • I2C總線
    +關(guān)注

    關(guān)注

    8

    文章

    390

    瀏覽量

    60916

原文標(biāo)題:從硬件和軟件層面,理解IIC的工作原理

文章出處:【微信號(hào):玩轉(zhuǎn)嵌入式,微信公眾號(hào):玩轉(zhuǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    I2C總線為什么要接上拉電阻

    I2C為什么要接上拉電阻?因?yàn)樗情_(kāi)漏輸出。 為什么是開(kāi)漏輸出? I2C協(xié)議支持多個(gè)主設(shè)備與多個(gè)從設(shè)備在一條總線上,如果不用開(kāi)漏輸出,而用推挽輸出,會(huì)出現(xiàn)主設(shè)備之間短路的情況。所以總線
    的頭像 發(fā)表于 11-20 10:07 ?441次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>為什么要接上拉電阻

    詳解I2C總線與SPI總線的區(qū)別

    I2C(Inter-Integrated Circuit)表示集成電路互連,是一種用于線路板內(nèi)部芯片之間通信的總線
    的頭像 發(fā)表于 10-16 15:16 ?3870次閱讀
    詳解<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>與SPI<b class='flag-5'>總線</b>的區(qū)別

    了解I2C總線

    電子發(fā)燒友網(wǎng)站提供《了解I2C總線.pdf》資料免費(fèi)下載
    發(fā)表于 10-08 11:13 ?2次下載
    了解<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>

    I2C總線上拉電阻計(jì)算

    電子發(fā)燒友網(wǎng)站提供《I2C總線上拉電阻計(jì)算.pdf》資料免費(fèi)下載
    發(fā)表于 10-08 09:54 ?1次下載
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>上拉電阻計(jì)算

    物聯(lián)網(wǎng)嵌入式軟件中的I2C總線設(shè)計(jì)詳解

    I2C(Inter-Integrated Circuit)通信總線,作為嵌入式系統(tǒng)設(shè)計(jì)中的一個(gè)關(guān)鍵組成部分,其靈活性和高效率使其在高級(jí)應(yīng)用中備受青睞。本文旨在提供關(guān)于I2C通信總線的深
    的頭像 發(fā)表于 09-29 16:21 ?368次閱讀
    物聯(lián)網(wǎng)嵌入式軟件中的<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>設(shè)計(jì)詳解

    I2C總線上拉電阻的必要性

    數(shù)據(jù)線加上拉電阻。這一設(shè)計(jì)不僅關(guān)乎技術(shù)的實(shí)現(xiàn),更涉及系統(tǒng)安全和信號(hào)傳輸效率的優(yōu)化。本文將深入探討在I2C總線上加上拉電阻的必要性及其帶來(lái)的技術(shù)優(yōu)勢(shì)。 我們需要理解I2C
    的頭像 發(fā)表于 09-09 17:16 ?997次閱讀

    優(yōu)秀實(shí)踐:I3C共享總線上的I2C器件

    電子發(fā)燒友網(wǎng)站提供《優(yōu)秀實(shí)踐:I3C共享總線上的I2C器件.pdf》資料免費(fèi)下載
    發(fā)表于 09-06 09:49 ?0次下載
    優(yōu)秀實(shí)踐:<b class='flag-5'>I3C</b>共享<b class='flag-5'>總線</b>上的<b class='flag-5'>I2C</b>器件

    I2C總線協(xié)議的工作原理和尋址格式

    等特點(diǎn),在嵌入式系統(tǒng)設(shè)計(jì)中得到了廣泛應(yīng)用。本文將詳細(xì)介紹I2C總線協(xié)議的工作原理和尋址格式,幫助讀者深入理解該協(xié)議。
    的頭像 發(fā)表于 05-27 15:47 ?1719次閱讀

    I2C總線物理拓?fù)浣Y(jié)構(gòu)

    I2C總線上可掛接的設(shè)備數(shù)量受總線的最大電容400pF限制,如果所掛接的是相同型號(hào)的器件,則還受器件地址位的限制。
    發(fā)表于 03-15 11:03 ?824次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>物理拓?fù)浣Y(jié)構(gòu)

    什么是I2C協(xié)議 I2C總線的控制邏輯

    在實(shí)際使用過(guò)程中,I2C比較容易出現(xiàn)的一個(gè)問(wèn)題就是死鎖 ,死鎖在I2C中主要表現(xiàn)為:I2C死鎖時(shí)表現(xiàn)為SCL為高,SDA一直為低。
    發(fā)表于 03-12 09:17 ?1048次閱讀
    什么是<b class='flag-5'>I2C</b>協(xié)議 <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的控制邏輯

    I2C總線的特點(diǎn)及應(yīng)用

    I2C總線最主要的優(yōu)點(diǎn)是其簡(jiǎn)單性和有效性。占用的空間小,降低了互連成本。總線的長(zhǎng)度可高達(dá)7.6m,并且能夠以10kbps的最大傳輸速率支持40個(gè)組件。
    發(fā)表于 02-02 15:56 ?722次閱讀

    藍(lán)牙串口通訊總線——I2C/SPI/UART

    嵌入式工程師在做串口通信調(diào)試工作的時(shí)候,會(huì)經(jīng)常用到I2C、SPI、UART這3條總線,I2C、SPI、UART這三種通信總線在嵌入式領(lǐng)域很常
    的頭像 發(fā)表于 01-22 09:41 ?1614次閱讀
    藍(lán)牙串口通訊<b class='flag-5'>總線</b>——<b class='flag-5'>I2C</b>/SPI/UART

    關(guān)于I2C總線的6個(gè)問(wèn)題分析

    I2C總線上的上拉電阻范圍是多少? 回答: 總線電容是走線部分、連接部分、管腳部分的電容的總和。總線電容限制了上拉電阻(Rp) 的最大值,因?yàn)?b class='flag-5'>
    發(fā)表于 12-25 09:19 ?1677次閱讀
    RM新时代网站-首页