I2C,通常被稱為“I two C”,是“Inter-Integrated Circuit protocol”(互連集成電路協(xié)議)的縮寫。I2C 于1982年由飛利浦半導(dǎo)體公司(現(xiàn)為恩智浦半導(dǎo)體)發(fā)明,是一種低速通信協(xié)議,用于連接微處理器主設(shè)備與低速外設(shè)從設(shè)備。自2006年起,實(shí)現(xiàn)I2C協(xié)議不再需要許可證,許多半導(dǎo)體設(shè)備公司,都推出了兼容I2C的設(shè)備。
I2C協(xié)議被廣泛使用的原因有很多。它只需要兩條線路進(jìn)行通信。與其他串行通信協(xié)議一樣,I2C有一條串行數(shù)據(jù)線和一條串行時(shí)鐘線。通過僅有的這兩條線路,I2C可以連接到總線上的多個(gè)設(shè)備。主設(shè)備可以通過串行數(shù)據(jù)線發(fā)送的I2C地址與任何從設(shè)備進(jìn)行通信。I2C對(duì)于設(shè)備制造商來說簡單且經(jīng)濟(jì),易于實(shí)現(xiàn)。
I2C 有幾種速度模式,首先是標(biāo)準(zhǔn)模式,這是一種串行協(xié)議,速度最高可達(dá)每秒100千比特。接下來是快速模式,其速度上限為每秒400千比特。這兩種協(xié)議都得到了廣泛支持,如果總線電容和驅(qū)動(dòng)能力允許更高的速度,主設(shè)備可以使用快速模式。
快速模式增強(qiáng)版(Fast mode plus)允許通信速度高達(dá)每秒1兆比特。為了達(dá)到這一速度,驅(qū)動(dòng)器可能需要額外的強(qiáng)度來滿足更快的上升和下降時(shí)間要求。
這三種模式在本質(zhì)上相對(duì)相似,都采用了相同的通信結(jié)構(gòu)。然而,它們各自具有不同的時(shí)序規(guī)范,以適應(yīng)不同的速度要求,而且設(shè)備中I2C的硬件實(shí)現(xiàn)方式也有所不同,以支持這些不同的速度。
I2C 還有兩種用于更高數(shù)據(jù)速率的模式。高速模式(High-Speed Mode)的數(shù)據(jù)速率可達(dá)每秒3.4兆比特。在這種模式下,主設(shè)備必須首先使用一個(gè)主代碼(master code)來啟用高速數(shù)據(jù)傳輸。這將激活從設(shè)備中的高速模式。此外,該模式可能還需要一個(gè)有源上拉電路(active pull-up),以便以更高的數(shù)據(jù)速率驅(qū)動(dòng)通信線路。
超快速模式(Ultra-Fast Mode)是最快的運(yùn)行模式,數(shù)據(jù)傳輸速率可達(dá)每秒5兆比特。這種模式僅支持寫入操作,并且在通信協(xié)議中省略了一些I2C特性。
I2C 成為一種常見協(xié)議的原因之一是其通信僅使用兩條線路。第一條線路是 SCL(Serial Clock Line),這是一個(gè)主要由主設(shè)備控制的串行時(shí)鐘。SCL 用于同步地將數(shù)據(jù)輸入和輸出從設(shè)備。第二條線路是 SDA(Serial Data Line),即串行數(shù)據(jù)線。SDA 用于在主設(shè)備和從設(shè)備之間傳輸數(shù)據(jù)。相比之下,串行外設(shè)接口(SPI)協(xié)議需要四條線路進(jìn)行通信。除了串行時(shí)鐘外,SPI 的芯片選擇線用于選擇通信設(shè)備,還有兩條數(shù)據(jù)線,分別用于從設(shè)備的輸入和輸出。
對(duì)于 I2C,主設(shè)備控制串行時(shí)鐘 SCL,而 SDA 用于雙向傳輸數(shù)據(jù)。SDA 是雙向的,這意味著主設(shè)備和從設(shè)備都可以在該線上發(fā)送數(shù)據(jù)。例如,主設(shè)備可以向從設(shè)備發(fā)送配置數(shù)據(jù),而從設(shè)備可以將轉(zhuǎn)換數(shù)據(jù)發(fā)送回主設(shè)備。通信是半雙工的,即在總線上一次只有一個(gè)主設(shè)備或從設(shè)備在發(fā)送數(shù)據(jù)。
I2C 主設(shè)備開始和停止通信,這消除了總線爭用的潛在問題。此外,與從設(shè)備的通信是通過總線上的唯一地址發(fā)送的。這使得 I2C 總線上可以同時(shí)存在多個(gè)主設(shè)備和多個(gè)從設(shè)備。
SDA 和 SCL 線通過開漏(open-drain)連接與總線上的所有設(shè)備相連。這需要一個(gè)上拉電阻連接到公共電源電壓。
開漏(open-drain)連接用于 SDA 和 SCL 兩條線路,并連接到一個(gè) NMOS 晶體管。此圖展示了一個(gè) I2C 設(shè)備通過上拉電阻連接到 SDA 或 SCL 線,并連接到 VDD。這種開漏連接控制 I2C 通信線路,并將其拉低或釋放為高電平。
為了設(shè)置 SDA 或 SCL 線的電壓電平,NMOS 被設(shè)置為導(dǎo)通(ON)或關(guān)閉(OFF)。當(dāng) NMOS 導(dǎo)通時(shí),設(shè)備通過電阻將電流拉至地,從而使線路電平拉低。通常,I2C 從高電平到低電平的轉(zhuǎn)換速度很快,因?yàn)?NMOS 在 SDA 和 SCL 上向下拉。轉(zhuǎn)換的速度由 NMOS 的驅(qū)動(dòng)強(qiáng)度和 SDA 或 SCL 上的總線電容決定。
當(dāng) NMOS 關(guān)閉時(shí),設(shè)備停止拉取電流,上拉電阻將 SDA 或 SCL 線拉至 VDD 電壓,從而使線路呈現(xiàn)高電平。通過控制這種開漏(open-drain)連接,SDA 和 SCL 均可以被設(shè)置為高電平或低電平,從而實(shí)現(xiàn) I2C 通信。
由于 I2C 通信線路存在電容,SDA 或 SCL 線路的放電過程會(huì)呈現(xiàn)出指數(shù)型的 RC 時(shí)間常數(shù)特性,具體取決于上拉電阻的大小以及 I2C 總線上的電容值。
通常情況下,上拉電阻的阻值被設(shè)置在 1 千歐姆到 10 千歐姆之間。總線的速度可能會(huì)對(duì)電阻的大小產(chǎn)生影響。如果采用更高的電阻值,I2C 總線拉高線路的速度可能會(huì)變慢,從而限制總線的速度。
總線線路的電容也會(huì)對(duì)通信產(chǎn)生影響。較高的電容會(huì)限制 I2C 通信的速度、總線上的設(shè)備數(shù)量以及設(shè)備之間的物理距離。
較小的上拉電阻具有更快的上升時(shí)間,但通信時(shí)需要更多的功率。較大的上拉電阻具有更慢的上升時(shí)間,從而導(dǎo)致通信速度變慢,但需要的功率更少。
I2C 使用開漏(open-drain)連接的一個(gè)好處是,總線爭用不會(huì)將總線置于破壞性狀態(tài)。通過開漏輸出,許多設(shè)備可以連接在一起。在任何連接的輸出上,如果任何一個(gè)輸出將線路拉低,那么線路就會(huì)呈現(xiàn)低電平。這種連接方式被稱為“線與(wired-OR)”。當(dāng)所有輸出連接在一起時(shí),輸出是所有輸出的邏輯“或”(OR)。
如果輸出是推挽(push-pull)類型,那么它們不能連接在一起,否則可能會(huì)出現(xiàn)破壞性狀態(tài)。推挽輸出具有互補(bǔ)的 NMOS 和 PMOS 晶體管,用于驅(qū)動(dòng)輸出高電平或低電平。如果將它們連接在一起,一個(gè)輸出為高電平而另一個(gè)輸出為低電平,這種總線爭用會(huì)導(dǎo)致一個(gè)不確定的狀態(tài),可能會(huì)穩(wěn)定在電源中點(diǎn)。此外,一個(gè)設(shè)備的 NMOS 導(dǎo)通電流,而另一個(gè)設(shè)備的 PMOS 導(dǎo)通電流。這將從 VDD 到 GND 通過一個(gè)非常低阻抗的路徑傳導(dǎo)電流,傳導(dǎo)的電流量取決于晶體管的允許范圍。這可能會(huì)是一個(gè)相當(dāng)大的電流,可能會(huì)損壞設(shè)備。
I2C 通信是由主設(shè)備通過發(fā)送 I2C 起始條件(START condition)來發(fā)起的。如果總線是空閑的,一個(gè) I2C 主設(shè)備可以通過發(fā)送 I2C START 條件來搶占總線進(jìn)行通信。為此,主設(shè)備首先將 SDA 拉低,然后將 SCL 拉低。這個(gè)序列表明主設(shè)備正在搶占 I2C 總線進(jìn)行通信,迫使總線上的其他主設(shè)備暫停它們的通信。
當(dāng)主設(shè)備完成其通信后,它先將 SCL 釋放為高電平,然后將 SDA 釋放為高電平。這表示一個(gè) I2C 停止條件(STOP condition)。這會(huì)釋放總線,允許其他主設(shè)備進(jìn)行通信,或者允許同一個(gè)主設(shè)備與另一個(gè)設(shè)備進(jìn)行通信。
I2C 使用一系列的 1 和 0 來進(jìn)行串行通信。SDA 用于傳輸數(shù)據(jù)位,而 SCL 是串行時(shí)鐘,用于對(duì)位序列進(jìn)行計(jì)時(shí)。
當(dāng) SDA 釋放線路時(shí),允許上拉電阻將線路拉至高電平,從而發(fā)送邏輯 1。
當(dāng) SDA 將線路拉低時(shí),設(shè)置一個(gè)接近地電平的低電平,從而發(fā)送邏輯 0。
在 SCL 脈沖時(shí)接收 1 和 0。對(duì)于一個(gè)有效的位,在該位的 SCL 上升沿和下降沿之間,SDA 不會(huì)發(fā)生變化。如果 SDA 在 SCL 的上升沿和下降沿之間發(fā)生變化,這可能會(huì)被解釋為 I2C 總線上的 STOP 或 START 條件。
I2C 協(xié)議被劃分為多個(gè)幀(frames)。通信從主設(shè)備發(fā)送一個(gè)地址幀(address frame)開始。地址幀后面跟著一個(gè)或多個(gè)數(shù)據(jù)幀(data frames),每個(gè)數(shù)據(jù)幀包含一個(gè)字節(jié)(byte)。每個(gè)幀還包含一個(gè)確認(rèn)位(acknowledge bit),以確保從設(shè)備或主設(shè)備已經(jīng)接收到了通信內(nèi)容。
在地址幀的開始,主設(shè)備發(fā)起一個(gè) START 條件。首先,主設(shè)備將 SDA 拉低,然后將 SCL 拉低以完成 START 操作。這使得主設(shè)備能夠在沒有總線上其他主設(shè)備爭用的情況下?lián)屨伎偩€。
每個(gè) I2C 從設(shè)備都有一個(gè)相關(guān)的 I2C 地址。當(dāng)主設(shè)備想要與某個(gè)特定設(shè)備通信時(shí),它會(huì)使用該設(shè)備的地址在隨后的 I2C 幀中發(fā)送或接收數(shù)據(jù)。I2C 地址由 7 位組成,總線上的 I2C 設(shè)備應(yīng)具有唯一的地址。
一個(gè) 7 位地址通常意味著有2^7(或 128 個(gè))唯一的地址。然而,有一些 I2C 地址是保留的,這限制了可能的設(shè)備數(shù)量。地址通過 SDA 作為數(shù)據(jù)線和 SCL 作為串行時(shí)鐘線發(fā)送。憑借這些信息,你應(yīng)該能夠讀懂設(shè)備的 I2C 通信內(nèi)容,并理解主設(shè)備與從設(shè)備之間發(fā)送和接收的內(nèi)容。
在地址之后是讀寫位。如果該位是 1,那么主設(shè)備要求從設(shè)備從它那里讀取數(shù)據(jù)。如果該位是 0,那么主設(shè)備要求向從設(shè)備寫入數(shù)據(jù)。
在主設(shè)備和從設(shè)備之間的任何一次通信字節(jié)之后,都會(huì)使用一個(gè)額外的位來驗(yàn)證通信是否成功。在地址字節(jié)通信結(jié)束時(shí),從設(shè)備會(huì)在 SCL 脈沖期間將 SDA 拉低,以表明它理解到它被主設(shè)備聯(lián)系到了。這被稱為 ACK(確認(rèn)位)。如果這個(gè)位是高電平,那么沒有從設(shè)備理解到它被聯(lián)系到了,通信是不成功的。如果這個(gè)位是高電平,這被稱為 NACK(未確認(rèn)),即沒有確認(rèn)位。
地址幀之后是一個(gè)或多個(gè)數(shù)據(jù)幀。這些幀是一次發(fā)送一個(gè)字節(jié)的。
在數(shù)據(jù)字節(jié)傳輸完成后,會(huì)有一個(gè)確認(rèn)信號(hào)(ACK)。如果數(shù)據(jù)字節(jié)是寫入設(shè)備的,那么從設(shè)備會(huì)將 SDA 拉低以確認(rèn)(ACK)傳輸。如果數(shù)據(jù)字節(jié)是從設(shè)備讀取的,主設(shè)備會(huì)將 SDA 拉低以確認(rèn)(ACK)數(shù)據(jù)的接收。
在通信完成后,主設(shè)備發(fā)出一個(gè) I2C 停止條件(STOP condition)。首先釋放 SCL,然后釋放 SDA。這表示主設(shè)備表明通信已完成,并且 I2C 總線被釋放。
這是主設(shè)備和從設(shè)備之間任何 I2C 通信的基本設(shè)置。通信可能包含多個(gè)字節(jié)的數(shù)據(jù),并且可能需要對(duì)設(shè)備進(jìn)行一次寫操作和一次讀操作,才能讀取任何給定的設(shè)備寄存器。