引言:本文從I2C協(xié)議的概述開始,描述協(xié)議的歷史、不同速度模式、物理層和數(shù)據(jù)幀結(jié)構(gòu),最后介紹I2C混合電壓系統(tǒng)中電平兼容性以及上拉電阻大小計(jì)算。
1.概述
1.1 I2C協(xié)議歷史
I2C,通常被稱為I'two'C,代表集成電路間協(xié)議。I2C由飛利浦半導(dǎo)體公司(現(xiàn)為恩智浦半導(dǎo)體公司)于1982年開發(fā),是一種低速通信協(xié)議,用于連接微控制器和處理器等控制器設(shè)備與數(shù)據(jù)轉(zhuǎn)換器和其他外圍設(shè)備等目標(biāo)設(shè)備。
I2C是使用串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL)的雙線串行通信協(xié)議。該協(xié)議支持通信總線上的多個(gè)目標(biāo)設(shè)備,還可以支持發(fā)送和接收命令和數(shù)據(jù)的多個(gè)控制器。
圖1:I2C總線典型應(yīng)用
由于該協(xié)議只需要兩條通信線路,I2C在很多工程中有廣泛的應(yīng)用,如數(shù)據(jù)采集領(lǐng)域的串行ADC、DAC、攝像頭配置,X射線管配置等。除此之外,由于I2C協(xié)議占用引腳特別少,硬件實(shí)現(xiàn)簡單,可擴(kuò)展型強(qiáng),現(xiàn)在被廣泛地使用在系統(tǒng)內(nèi)多個(gè)集成電路(IC)間的通信。
1.2 I2C的速度模式
I2C有5種速度模式,從標(biāo)準(zhǔn)模式(Sm),快速模式(Fm),快速模式+(Fm+)模式。這三種模式相對相似,使用相同的通信結(jié)構(gòu)。然而,所有模式都具有不同的時(shí)序規(guī)范,并且設(shè)備中I2C的硬件實(shí)現(xiàn)方式不同以適應(yīng)不同的速度。
I2C還具有用于更高數(shù)據(jù)速率的另外兩種模式。高速模式(Hs模式)和超快模式(UFm)是最快的操作模式。表1-1顯示了不同的I2C模式及其各自的數(shù)據(jù)速率。
表1:不同I2C模式的最大傳輸速率
2. 物理層
2.1 2線通信
I2C系統(tǒng)的特點(diǎn)是為總線上的所有設(shè)備提供兩條共享通信線路。這兩條線路用于雙向半雙工通信。I2C允許多個(gè)控制器和多個(gè)目標(biāo)設(shè)備。這兩條線路上都需要上拉電阻器。圖2顯示了I2C物理層的典型實(shí)現(xiàn)。
圖2:典型的I2C實(shí)現(xiàn)
第一條線是SCL,它是主要由控制器設(shè)備控制的串行時(shí)鐘。SCL用于將數(shù)據(jù)同步地時(shí)鐘輸入或輸出目標(biāo)設(shè)備。
第二條線是SDA,它是串行數(shù)據(jù)線。SDA用于將數(shù)據(jù)傳輸到目標(biāo)設(shè)備或從目標(biāo)設(shè)備傳輸數(shù)據(jù)。
I2C控制器設(shè)備啟動和停止通信,這消除了總線爭用的潛在問題。通過總線上的唯一地址發(fā)送與目標(biāo)設(shè)備的通信。這允許I2C總線上的多個(gè)控制器和多個(gè)目標(biāo)設(shè)備。
SDA和SCL線路具有到總線上所有設(shè)備的開漏連接。這需要一個(gè)上拉電阻到一個(gè)公共電壓源。
2.2 漏極開路連接
漏極開路連接用于SDA和SCL線路,并連接到NMOS晶體管。該漏極開路連接控制I2C通信線路并將線路拉低或釋放線路高。漏極開路指的是NMOS關(guān)閉時(shí)的NMOS總線連接。圖3顯示了NMOS打開時(shí)的漏極開路連接。
圖3:當(dāng)NMOS導(dǎo)通時(shí),開路漏極連接將線路拉低
要設(shè)置SDA或SCL線的電壓電平,需將NMOS設(shè)置為打開或關(guān)閉。當(dāng)NMOS打開時(shí),設(shè)備通過電阻器將電流拉到地。這將打開的NMOS拉低。通常,當(dāng)NMOS在SDA或SCL上下拉時(shí),I2C從高到低的轉(zhuǎn)變是快速轉(zhuǎn)變。轉(zhuǎn)變的速度由NMOS驅(qū)動強(qiáng)度和SDA或SCL上的任何總線電容決定。
當(dāng)NMOS關(guān)閉時(shí),器件停止拉電流,上拉電阻器將SDA或SCL線拉至VDD。圖2-3顯示了NMOS關(guān)閉時(shí)漏極開路。上拉電阻器將線路拉高。開路漏極線的轉(zhuǎn)變較慢,因?yàn)榫€是相對于總線電容上拉的,并且不是主動驅(qū)動的。
圖4:NMOS關(guān)斷時(shí)上拉電阻器將線路拉高
通過控制該漏極開路連接,SDA和SCL都可以設(shè)置為高電平和低電平,從而實(shí)現(xiàn)I2C通信。
由于I2C通信線路上的電容,SDA和SCL線路以指數(shù)穩(wěn)定RC時(shí)間常數(shù)放電,這取決于上拉電阻器的大小和I2C總線上的電容。更高的電容限制了I2C通信的速度、設(shè)備的數(shù)量以及總線上設(shè)備之間的物理距離。較小的上拉電阻器具有更快的上升時(shí)間,但需要更多的功率用于通信。較大的上拉電阻器具有較慢的上升時(shí)間,導(dǎo)致較慢的通信,但需要較少的功率。
2.3 非破壞性總線競爭
使用開放漏極的I2C的好處之一是總線爭用不會使總線進(jìn)入破壞狀態(tài)。通過開漏輸出,許多設(shè)備可以連接在一起,而不會發(fā)生破壞性爭用。對于該連接上的任何輸出,如果任何輸出將線路拉低,則線路為低。這種連接被稱為有線AND連接。當(dāng)連接在一起時(shí),輸出是所有輸出的邏輯AND。
圖5:推挽式與開漏輸出的比較
如果輸出是推挽式的,那么在沒有破壞狀態(tài)的可能性的情況下,輸出就不能連接在一起。推挽輸出(通常用于SPI通信)具有互補(bǔ)的NMOS和PMOS晶體管,它們驅(qū)動輸出為高或低。圖5顯示了在爭用中開漏和推挽輸出之間的比較。
采用開放式漏極連接,任何設(shè)備都可以隨時(shí)將連接拉低。每當(dāng)任何設(shè)備將線路拉低時(shí),線路都會顯示為低電平,但不會顯示為破壞性爭用。
在推挽輸出中,輸出也被連接在一起。如果總線上有兩個(gè)設(shè)備處于活動狀態(tài),并且一個(gè)輸出為高,另一個(gè)輸出低,則此總線爭用具有未確定的狀態(tài),可能在中間供電點(diǎn)處解決。此外,一個(gè)器件具有NMOS導(dǎo)通電流,而另一個(gè)器件則具有PMOS導(dǎo)通電流。這些器件通過非常低的阻抗路徑將電流從VDD供應(yīng)到GND,傳導(dǎo)晶體管允許的盡可能多的電流。這種爭用的結(jié)果可能是大量的電流,可能會損壞設(shè)備。
3. I2C協(xié)議
3.1 I2C起始和停止協(xié)議
I2C通信是在I2C啟動條件下從控制器設(shè)備啟動的。如果總線開路,I2C控制器通過發(fā)送I2C START來請求總線進(jìn)行通信。為此,控制器設(shè)備首先將SDA拉低,然后將SCL拉低。此序列表示控制器設(shè)備正在請求I2C總線進(jìn)行通信,從而迫使總線上的其他控制器設(shè)備保持其通信。
圖6:I2C啟動和停止協(xié)議
當(dāng)控制器設(shè)備已經(jīng)完成通信時(shí),SCL釋放高電平,然后SDA釋放高電平。這表示I2C停機(jī)狀態(tài)。這釋放了總線以允許其他控制器通信或允許同一控制器與另一設(shè)備通信。圖6顯示了I2C啟動和停止的協(xié)議。
3.2 邏輯“1”和邏輯“0”
I2C使用1和0的序列進(jìn)行串行通信。SDA用于數(shù)據(jù)位,而SCL是對位序列進(jìn)行計(jì)時(shí)的串行時(shí)鐘。當(dāng)SDA釋放線路時(shí),發(fā)送一個(gè)邏輯1,允許上拉電阻器將線路拉至高電平。當(dāng)SDA在線路上下拉時(shí),將發(fā)送一個(gè)邏輯零,在接地附近設(shè)置一個(gè)低電平。圖7顯示了I2C通信的數(shù)字1和0的表示。
圖7:I2C數(shù)據(jù)邏輯“1”和邏輯“0”
當(dāng)SCL被脈沖化時(shí),1和0被接收。對于有效位,SDA不會在該位的SCK的上升沿和下降沿之間變化。SDA在SCL的上升沿與下降沿之間的變化可以解釋為I2C總線上的START或STOP條件。
3.3 I2C通信幀格式
I2C協(xié)議被分解為多個(gè)幀。通信開始于控制器設(shè)備在START之后發(fā)送地址幀。地址幀后面跟著一個(gè)或多個(gè)數(shù)據(jù)幀,每個(gè)數(shù)據(jù)幀由一個(gè)字節(jié)組成。每個(gè)幀還具有一個(gè)確認(rèn)比特(ACK),以提醒控制器目標(biāo)設(shè)備或控制器設(shè)備已經(jīng)接收到通信。圖8顯示了兩個(gè)I2C通信幀的示意圖。
圖8:I2C地址和數(shù)據(jù)幀
在地址幀的開始,控制器設(shè)備啟動START條件??刂破髟O(shè)備首先將SDA拉低,然后將SCL拉低用于START。這允許控制器設(shè)備在沒有來自總線上的其他控制器設(shè)備的爭用的情況下請求總線。每個(gè)I2C目標(biāo)設(shè)備都具有相關(guān)聯(lián)的I2C地址。當(dāng)開始與特定目標(biāo)設(shè)備通信時(shí),控制器使用目標(biāo)設(shè)備地址在I2C幀中發(fā)送或接收數(shù)據(jù)。I2C地址由I2C總線上的7個(gè)位和R/Wn組成,每個(gè)設(shè)備在總線上都有一個(gè)唯一的地址。
7位地址意味著128個(gè)唯一地址。然而,有幾個(gè)保留的I2C地址限制了可能的設(shè)備的數(shù)量。發(fā)送地址時(shí),SDA作為數(shù)據(jù),SCL作為串行時(shí)鐘。
該幀地址后面的第8位是讀寫(R/W)位。如果該位為1,則控制器要求從目標(biāo)設(shè)備讀取數(shù)據(jù)。如果該位為0,則控制器要求將數(shù)據(jù)寫入目標(biāo)設(shè)備。
在任何通信字節(jié)之后,額外的第9位用于驗(yàn)證通信是否成功。在地址字節(jié)通信結(jié)束時(shí),目標(biāo)設(shè)備在SCL脈沖期間下拉SDA,以向控制器指示地址已被接收。這被稱為確認(rèn)(ACK)比特。如果該比特為高,則沒有目標(biāo)設(shè)備接收到該地址,并且通信不成功。如果比特是高的,這被稱為NACK,并且沒有ACK。
地址幀后面跟著一個(gè)或多個(gè)數(shù)據(jù)幀。這些幀一次發(fā)送一個(gè)字節(jié)。在每個(gè)數(shù)據(jù)字節(jié)被傳輸之后,會有另一個(gè)ACK。如果數(shù)據(jù)字節(jié)是對設(shè)備的寫入,則目標(biāo)設(shè)備將SDA拉低以確認(rèn)傳輸。如果數(shù)據(jù)字節(jié)是從設(shè)備讀取的,則控制器將SDA拉低以確認(rèn)數(shù)據(jù)已被接收。ACK是一個(gè)有用的調(diào)試工具。該位的缺失可以指示目標(biāo)外圍設(shè)備沒有接收到用于通信的適當(dāng)I2C地址,或者控制器外圍設(shè)備沒有收到期望的數(shù)據(jù)。
通信完成后,控制器發(fā)出I2C STOP條件。首先釋放SCL,然后釋放SDA??刂破魇褂肧TOP指示通信已完成,I2C總線已釋放。
這是控制器設(shè)備和目標(biāo)設(shè)備之間的任何I2C通信的基本協(xié)議。通信可以由多個(gè)字節(jié)的數(shù)據(jù)組成。在目標(biāo)設(shè)備具有多個(gè)數(shù)據(jù)和配置寄存器的某些情況下,從設(shè)備的讀取可以從對設(shè)備的寫入開始,以指示要讀取哪個(gè)寄存器。
4. I2C高級議題
4.1 電壓電平轉(zhuǎn)換
設(shè)計(jì)大型系統(tǒng)的一個(gè)常見問題是系統(tǒng)內(nèi)不同電壓電平的混合。這些不同的電壓可以為不同的I2C控制器和目標(biāo)設(shè)備供電。電源中不匹配的電壓可能會中斷通信,甚至損壞設(shè)備。
圖9:PCA3906 I2C電壓電平轉(zhuǎn)換器
對于不匹配的電源電壓,最好的選擇是使用特殊設(shè)備橋接兩個(gè)電源電壓。圖9顯示了使用I2C電壓電平轉(zhuǎn)換器橋接兩個(gè)不同電源電壓之間通信的示例。有兩組上拉,每個(gè)電壓電平一組。作為一個(gè)通用的電壓轉(zhuǎn)換器,PCA9306允許不同電源電平之間的通信。
4.2 上拉電阻大小計(jì)算
為了設(shè)計(jì)系統(tǒng),使總線速度足夠快,以滿足協(xié)議總線速度,本節(jié)介紹如何計(jì)算上拉電阻的值。
對于SDA和SCL的漏極開路連接,從這些線路從高到低以及從低到高的轉(zhuǎn)換取決于器件漏極開路的電流吸收、總線電容和上拉電阻值?;谶@些不同的參數(shù),可以計(jì)算I2C總線速度的最小和最大電阻。
圖10:影響上拉電阻大小的因素
推薦的正常上拉電阻為1kΩ至10kΩ。電阻越高,I2C通信越慢。由于電阻較低,I2C通信需要更多的功率。基于幾個(gè)不同的參數(shù),可以計(jì)算I2C總線速度的最小和最大電阻。
表2列出了I2C總線的比特率、總線的最大上升時(shí)間以及總線上的最大電容負(fù)載。所有這些參數(shù)都用于確定最小和最大上拉電阻值。
表2:I2C總線參數(shù)特性
除了這些參數(shù)外,還考慮了I2C輸入和輸出電壓的最小值和最大值。表3描述了這些電壓。
表3:I2C總線參數(shù)特性
(1)最小上拉電阻計(jì)算
圖11顯示了I2C總線的漏極開路連接以及SDA或SCL的輸出波形。SDA和SCL總線從設(shè)備的電流拉低轉(zhuǎn)換為低電平。
圖11:基于下拉電流的最小上拉電阻
當(dāng)設(shè)備釋放SDA或SCL時(shí),總線連接到VCC電壓。當(dāng)激活時(shí),器件漏極將總線輸出拉到接近接地的位置。輸出必須下降到輸出低電平電壓VOL。該設(shè)備用電流IOL將總線拉低。VOL和IOL(3mA電流匯點(diǎn))如表3所示。根據(jù)該電流,計(jì)算上拉所需的最小電阻。如果電阻較小,則輸出電流不能將總線的輸出電壓拉低到足以被識別為數(shù)字低。這如下公式所示。
求出最小上拉電阻,從3.3 V的電源電壓中減去0.4 V的輸出低電壓。然后除以3 mA的總線所拉的電流。這導(dǎo)致最小電阻為967Ω。
(2)最大上拉電阻計(jì)算
漏極開路連接釋放輸出電流后,上拉電阻將總線連接拉高。總線輸出波形具有指數(shù)穩(wěn)定。當(dāng)電阻器將電壓從地上拉時(shí),電壓穩(wěn)定時(shí)間基于總線電容(CB)。由于I2C標(biāo)準(zhǔn)上升時(shí)間規(guī)范,最大上拉電阻受到總線電容的限制。對于更高的電阻,上拉輸出上升得太慢,并且沒有足夠快地達(dá)到邏輯高位。
圖12:最大上拉電阻計(jì)算
隨時(shí)間的指數(shù)方程如下公式所示:
上升時(shí)間基于從電源電壓的0.3倍的數(shù)字輸入低電壓(VIL)到電源電壓的0.7倍的數(shù)字輸出高電壓(VIH)的轉(zhuǎn)變。上升時(shí)間如表2所示,而VIL和VIH如表3所示。
根據(jù)上述方程,可以根據(jù)最大上拉電阻和總線電容來求解上升時(shí)間。在這個(gè)例子中,計(jì)算是針對400pF的總線電容(針對最大總線電容)和3.3V的電源電壓。根據(jù)上升時(shí)間,然后求解最大上拉電阻。
上升時(shí)間取決于I2C模式。對于此示例,可以使用標(biāo)準(zhǔn)模式。取1000ns的上升時(shí)間,除以0.8473乘以400pF的量。這給出了2.95kΩ的最大電阻。
最小電阻為967Ω,最大電阻為2.95kΩ,這些值的電阻范圍似乎很窄。然而,這個(gè)小范圍是因?yàn)樯侠娮杵鞯拇笮∈窃谧畲髽?biāo)準(zhǔn)模式總線電容為400pF的情況下計(jì)算的??偩€電容量異常大,尤其是對于板上的寄生電容而言。如果設(shè)計(jì)具有較低的總線電容(很可能),則可以增加最大電阻,從而減少I2C總線上的功耗。
4. 小結(jié)
I2C是一種常見的通信協(xié)議,本文對I2C協(xié)議的歷史、速度模式、物理層、數(shù)據(jù)幀結(jié)構(gòu)以及混合電壓系統(tǒng)中電平兼容性以及上拉電阻大小計(jì)算均進(jìn)行了詳細(xì)介紹,后續(xù)將基于本文I2C理論知識學(xué)習(xí),利用FPGA實(shí)現(xiàn)EEPROM器件I2C接口驅(qū)動設(shè)計(jì),敬請關(guān)注。