一文講透串行通信---I2C基礎

03/24 15:25
933
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

I2C,通常被稱為“I two C”,是“Inter-Integrated Circuit protocol”(互連集成電路協(xié)議)的縮寫。I2C 于1982年由飛利浦半導體公司(現(xiàn)為恩智浦半導體)發(fā)明,是一種低速通信協(xié)議,用于連接微處理器主設備與低速外設從設備。自2006年起,實現(xiàn)I2C協(xié)議不再需要許可證,許多半導體設備公司,都推出了兼容I2C的設備。

I2C協(xié)議被廣泛使用的原因有很多。它只需要兩條線路進行通信。與其他串行通信協(xié)議一樣,I2C有一條串行數(shù)據(jù)線和一條串行時鐘線。通過僅有的這兩條線路,I2C可以連接到總線上的多個設備。主設備可以通過串行數(shù)據(jù)線發(fā)送的I2C地址與任何從設備進行通信。I2C對于設備制造商來說簡單且經(jīng)濟,易于實現(xiàn)。

I2C 有幾種速度模式,首先是標準模式,這是一種串行協(xié)議,速度最高可達每秒100千比特。接下來是快速模式,其速度上限為每秒400千比特。這兩種協(xié)議都得到了廣泛支持,如果總線電容和驅(qū)動能力允許更高的速度,主設備可以使用快速模式。

快速模式增強版(Fast mode plus)允許通信速度高達每秒1兆比特。為了達到這一速度,驅(qū)動器可能需要額外的強度來滿足更快的上升和下降時間要求。

這三種模式在本質(zhì)上相對相似,都采用了相同的通信結構。然而,它們各自具有不同的時序規(guī)范,以適應不同的速度要求,而且設備中I2C的硬件實現(xiàn)方式也有所不同,以支持這些不同的速度。

I2C 還有兩種用于更高數(shù)據(jù)速率的模式。高速模式(High-Speed Mode)的數(shù)據(jù)速率可達每秒3.4兆比特。在這種模式下,主設備必須首先使用一個主代碼(master code)來啟用高速數(shù)據(jù)傳輸。這將激活從設備中的高速模式。此外,該模式可能還需要一個有源上拉電路(active pull-up),以便以更高的數(shù)據(jù)速率驅(qū)動通信線路。

超快速模式(Ultra-Fast Mode)是最快的運行模式,數(shù)據(jù)傳輸速率可達每秒5兆比特。這種模式僅支持寫入操作,并且在通信協(xié)議中省略了一些I2C特性。

I2C 成為一種常見協(xié)議的原因之一是其通信僅使用兩條線路。第一條線路是 SCL(Serial Clock Line),這是一個主要由主設備控制的串行時鐘。SCL 用于同步地將數(shù)據(jù)輸入和輸出從設備。第二條線路是 SDA(Serial Data Line),即串行數(shù)據(jù)線。SDA 用于在主設備和從設備之間傳輸數(shù)據(jù)。相比之下,串行外設接口(SPI)協(xié)議需要四條線路進行通信。除了串行時鐘外,SPI 的芯片選擇線用于選擇通信設備,還有兩條數(shù)據(jù)線,分別用于從設備的輸入和輸出。

對于 I2C,主設備控制串行時鐘 SCL,而 SDA 用于雙向傳輸數(shù)據(jù)。SDA 是雙向的,這意味著主設備和從設備都可以在該線上發(fā)送數(shù)據(jù)。例如,主設備可以向從設備發(fā)送配置數(shù)據(jù),而從設備可以將轉(zhuǎn)換數(shù)據(jù)發(fā)送回主設備。通信是半雙工的,即在總線上一次只有一個主設備或從設備在發(fā)送數(shù)據(jù)。

I2C 主設備開始和停止通信,這消除了總線爭用的潛在問題。此外,與從設備的通信是通過總線上的唯一地址發(fā)送的。這使得 I2C 總線上可以同時存在多個主設備和多個從設備。

SDA 和 SCL 線通過開漏(open-drain)連接與總線上的所有設備相連。這需要一個上拉電阻連接到公共電源電壓。

開漏(open-drain)連接用于 SDA 和 SCL 兩條線路,并連接到一個 NMOS 晶體管。此圖展示了一個 I2C 設備通過上拉電阻連接到 SDA 或 SCL 線,并連接到 VDD。這種開漏連接控制 I2C 通信線路,并將其拉低或釋放為高電平。

為了設置 SDA 或 SCL 線的電壓電平,NMOS 被設置為導通(ON)或關閉(OFF)。當 NMOS 導通時,設備通過電阻將電流拉至地,從而使線路電平拉低。通常,I2C 從高電平到低電平的轉(zhuǎn)換速度很快,因為 NMOS 在 SDA 和 SCL 上向下拉。轉(zhuǎn)換的速度由 NMOS 的驅(qū)動強度和 SDA 或 SCL 上的總線電容決定。

當 NMOS 關閉時,設備停止拉取電流,上拉電阻將 SDA 或 SCL 線拉至 VDD 電壓,從而使線路呈現(xiàn)高電平。通過控制這種開漏(open-drain)連接,SDA 和 SCL 均可以被設置為高電平或低電平,從而實現(xiàn) I2C 通信。

由于 I2C 通信線路存在電容,SDA 或 SCL 線路的放電過程會呈現(xiàn)出指數(shù)型的 RC 時間常數(shù)特性,具體取決于上拉電阻的大小以及 I2C 總線上的電容值。

通常情況下,上拉電阻的阻值被設置在 1 千歐姆到 10 千歐姆之間??偩€的速度可能會對電阻的大小產(chǎn)生影響。如果采用更高的電阻值,I2C 總線拉高線路的速度可能會變慢,從而限制總線的速度。

總線線路的電容也會對通信產(chǎn)生影響。較高的電容會限制 I2C 通信的速度、總線上的設備數(shù)量以及設備之間的物理距離。

較小的上拉電阻具有更快的上升時間,但通信時需要更多的功率。較大的上拉電阻具有更慢的上升時間,從而導致通信速度變慢,但需要的功率更少。

I2C 使用開漏(open-drain)連接的一個好處是,總線爭用不會將總線置于破壞性狀態(tài)。通過開漏輸出,許多設備可以連接在一起。在任何連接的輸出上,如果任何一個輸出將線路拉低,那么線路就會呈現(xiàn)低電平。這種連接方式被稱為“線與(wired-OR)”。當所有輸出連接在一起時,輸出是所有輸出的邏輯“或”(OR)。

如果輸出是推挽(push-pull)類型,那么它們不能連接在一起,否則可能會出現(xiàn)破壞性狀態(tài)。推挽輸出具有互補的 NMOS 和 PMOS 晶體管,用于驅(qū)動輸出高電平或低電平。如果將它們連接在一起,一個輸出為高電平而另一個輸出為低電平,這種總線爭用會導致一個不確定的狀態(tài),可能會穩(wěn)定在電源中點。此外,一個設備的 NMOS 導通電流,而另一個設備的 PMOS 導通電流。這將從 VDD 到 GND 通過一個非常低阻抗的路徑傳導電流,傳導的電流量取決于晶體管的允許范圍。這可能會是一個相當大的電流,可能會損壞設備。

I2C 通信是由主設備通過發(fā)送 I2C 起始條件(START condition)來發(fā)起的。如果總線是空閑的,一個 I2C 主設備可以通過發(fā)送 I2C START 條件來搶占總線進行通信。為此,主設備首先將 SDA 拉低,然后將 SCL 拉低。這個序列表明主設備正在搶占 I2C 總線進行通信,迫使總線上的其他主設備暫停它們的通信。

當主設備完成其通信后,它先將 SCL 釋放為高電平,然后將 SDA 釋放為高電平。這表示一個 I2C 停止條件(STOP condition)。這會釋放總線,允許其他主設備進行通信,或者允許同一個主設備與另一個設備進行通信。

I2C 使用一系列的 1 和 0 來進行串行通信。SDA 用于傳輸數(shù)據(jù)位,而 SCL 是串行時鐘,用于對位序列進行計時。

當 SDA 釋放線路時,允許上拉電阻將線路拉至高電平,從而發(fā)送邏輯 1。

當 SDA 將線路拉低時,設置一個接近地電平的低電平,從而發(fā)送邏輯 0。

在 SCL 脈沖時接收 1 和 0。對于一個有效的位,在該位的 SCL 上升沿和下降沿之間,SDA 不會發(fā)生變化。如果 SDA 在 SCL 的上升沿和下降沿之間發(fā)生變化,這可能會被解釋為 I2C 總線上的 STOP 或 START 條件。

I2C 協(xié)議被劃分為多個幀(frames)。通信從主設備發(fā)送一個地址幀(address frame)開始。地址幀后面跟著一個或多個數(shù)據(jù)幀(data frames),每個數(shù)據(jù)幀包含一個字節(jié)(byte)。每個幀還包含一個確認位(acknowledge bit),以確保從設備或主設備已經(jīng)接收到了通信內(nèi)容。

在地址幀的開始,主設備發(fā)起一個 START 條件。首先,主設備將 SDA 拉低,然后將 SCL 拉低以完成 START 操作。這使得主設備能夠在沒有總線上其他主設備爭用的情況下?lián)屨伎偩€。

每個 I2C 從設備都有一個相關的 I2C 地址。當主設備想要與某個特定設備通信時,它會使用該設備的地址在隨后的 I2C 幀中發(fā)送或接收數(shù)據(jù)。I2C 地址由 7 位組成,總線上的 I2C 設備應具有唯一的地址。

一個 7 位地址通常意味著有2^7(或 128 個)唯一的地址。然而,有一些 I2C 地址是保留的,這限制了可能的設備數(shù)量。地址通過 SDA 作為數(shù)據(jù)線和 SCL 作為串行時鐘線發(fā)送。憑借這些信息,你應該能夠讀懂設備的 I2C 通信內(nèi)容,并理解主設備與從設備之間發(fā)送和接收的內(nèi)容。

在地址之后是讀寫位。如果該位是 1,那么主設備要求從設備從它那里讀取數(shù)據(jù)。如果該位是 0,那么主設備要求向從設備寫入數(shù)據(jù)。

在主設備和從設備之間的任何一次通信字節(jié)之后,都會使用一個額外的位來驗證通信是否成功。在地址字節(jié)通信結束時,從設備會在 SCL 脈沖期間將 SDA 拉低,以表明它理解到它被主設備聯(lián)系到了。這被稱為 ACK(確認位)。如果這個位是高電平,那么沒有從設備理解到它被聯(lián)系到了,通信是不成功的。如果這個位是高電平,這被稱為 NACK(未確認),即沒有確認位。

地址幀之后是一個或多個數(shù)據(jù)幀。這些幀是一次發(fā)送一個字節(jié)的。

在數(shù)據(jù)字節(jié)傳輸完成后,會有一個確認信號(ACK)。如果數(shù)據(jù)字節(jié)是寫入設備的,那么從設備會將 SDA 拉低以確認(ACK)傳輸。如果數(shù)據(jù)字節(jié)是從設備讀取的,主設備會將 SDA 拉低以確認(ACK)數(shù)據(jù)的接收。

在通信完成后,主設備發(fā)出一個 I2C 停止條件(STOP condition)。首先釋放 SCL,然后釋放 SDA。這表示主設備表明通信已完成,并且 I2C 總線被釋放。

這是主設備和從設備之間任何 I2C 通信的基本設置。通信可能包含多個字節(jié)的數(shù)據(jù),并且可能需要對設備進行一次寫操作和一次讀操作,才能讀取任何給定的設備寄存器。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄