亚洲AV无一区二区三区,精品国产成人AV在线,一区二区三区四区精品五码,精品国产免费1区

干貨 - 從軟硬件層面,理解I2C總線(xiàn)是如何工作的!

2023-05-25 10:00:00 徐繼 49

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

這篇文章的目標是幫助電子工程師理解I2C總線(xiàn)是如何工作的。

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

pcba

圖1

1、電特性

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

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

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

pcba

圖2

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

1.1.1 開(kāi)漏極拉低

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

pcba

圖3

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

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

pcba

圖4

2 I2C接口

2.1 I2C的常用操作

I2C總線(xiàn)是一種雙向接口,其使用被稱(chēng)為主機的控制器與從設備進(jìn)行通訊。從機不會(huì )主動(dòng)傳輸任何數據,除非其被主機尋址。每個(gè)處于I2C總線(xiàn)上的設備均有獨有的設備地址,以用于與位于同一總線(xiàn)上的其他設備做區分。很多從機需要在啟動(dòng)后進(jìn)行配置以設置設備行為。這通常在主機訪(fǎng)問(wèn)從機的內部寄存器映射時(shí)完成,這些寄存器均有獨一無(wú)二的寄存器地址。單個(gè)設備可以具有一個(gè)或多個(gè)寄存器,這些寄存器可以用來(lái)存儲或讀寫(xiě)數據。
I2C總線(xiàn)的物理接口由串行時(shí)鐘線(xiàn)(SCL)和串行數據線(xiàn)(SDA)組成。SCL和SDA均需要通過(guò)上拉電阻連接到Vcc。上拉電阻的大小由I2C線(xiàn)路上的等效電容大小決定(想要了解更多,可以參考I2C Pull-up Resistor Calculation這份文檔,文檔號:SLVA689)。數據傳送只能在總線(xiàn)空閑時(shí)初始化。如果SDA和SCL在一個(gè)STOP標志后均處于高電平狀態(tài),這時(shí)可以認為總線(xiàn)處在空閑狀態(tài)。
主機訪(fǎng)問(wèn)從機的大體流程如下所示:

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

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

  • 發(fā)送方主機發(fā)送數據到接收方從機

  • 發(fā)送方主機通過(guò)發(fā)送STOP標志結束傳輸

 

2、如果主機想要從從機接收/讀取數據:

  • 接收方主機發(fā)送START標志并尋址發(fā)送方從機

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

  • 接收方主機從發(fā)送方從機接收數據

  • 接收方主機通過(guò)發(fā)送STOP標志結束通訊

 

2.1.1 START與STOP標志

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

pcba

圖5

2.1.2 重復的START標志

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

2.2 數據有效性與字節格式

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

pcba

圖6


2.3 應答(ACK)和非應答(NACK)

數據的每一字節(包括地址字節)后總是伴隨著(zhù)來(lái)自接收方的1位ACK位。ACK位使得接收方可以告知發(fā)送方當前字節已成功接收,并且可以發(fā)送下一字節。
在接收方發(fā)送ACK位前,發(fā)送方必須釋放總線(xiàn)。接收方通過(guò)在A(yíng)CK/NACK時(shí)鐘周期(第9時(shí)鐘周期)的低電平相位拉低SDA線(xiàn)來(lái)發(fā)送一個(gè)ACK位,如此一來(lái),SDA線(xiàn)將會(huì )在A(yíng)CK/NACK時(shí)鐘周期的高電平相位保持為低電平。設置與保持時(shí)間必須著(zhù)重注意。

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

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

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

  • 在發(fā)送期間,接收方無(wú)法接收更多數據字節(也就是緩沖區滿(mǎn)了)。

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

pcba

圖7

 3、I2C總線(xiàn)數據

數據可以寫(xiě)入/讀自從機,但是這是通過(guò)讀寫(xiě)從設備內部的寄存器完成的。
包含信息的寄存器處于從機的內存中,無(wú)論這些信息是配置信息還是一些需要回發(fā)給主機的采樣數據。為了指示從機去執行某一任務(wù),主機必須向這些寄存器內寫(xiě)入信息。

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

3.1 寫(xiě)位于I2C總線(xiàn)上的從機

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

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

pcba

圖8

3.2 讀位于I2C總線(xiàn)上的從機

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

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

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

pcba

圖9


微信公眾號