一、I2C總線定義
要搞清楚一種總線,就跟了解一件事情的來(lái)龍去脈一樣,首先要弄清楚由來(lái)。
I2C是Inter-Intergrated Circuit的簡(jiǎn)稱,英文翻譯過(guò)來(lái)是:內(nèi)置集成電路。為什么I2C是內(nèi)置集成電路?I2C總線是由Philips公司在80年代初開(kāi)發(fā)的一種簡(jiǎn)單、雙向二線制同步串行總線,為了讓主板、嵌入式系統(tǒng)用以連接低速的周邊設(shè)備而發(fā)展的,從這個(gè)字面上意思上來(lái)看,I2C是一種低速率的串行總線,為了解決低速設(shè)備接入高速設(shè)備而存在的。
I2C可以寫(xiě)成I2C、IIC,I2C之所以被廣泛應(yīng)用,因?yàn)檫@種通信總線比較簡(jiǎn)單,物理上只需要兩根線--串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL),即可在連接于總線上的器件傳送信息。這里說(shuō)明一點(diǎn),I2C僅限于板級(jí)間走線,因?yàn)橥ㄐ啪嚯x受到一些參數(shù)限制,比如總線的負(fù)載電容、總線上的電流等等。 既然是雙方或者多方通信,肯定會(huì)有發(fā)起的一方。我們將發(fā)起通信的這一方稱為主器件,主器件用來(lái)啟動(dòng)總線傳送數(shù)據(jù),并產(chǎn)生時(shí)鐘,數(shù)據(jù)在時(shí)鐘脈沖的作用下,去尋址從器件。此時(shí)任何被尋址的器件均被認(rèn)為是從器件。在總線上主和從、發(fā)和收的關(guān)系不是恒定的,而取決于此時(shí)數(shù)據(jù)的傳輸方向。主機(jī)負(fù)責(zé)產(chǎn)生時(shí)鐘和終止數(shù)據(jù)傳送。
二、工作原理
下圖是I2C總線電路的結(jié)構(gòu)分析,虛框內(nèi)是IC內(nèi)的電路,虛框外是外部電路。
從上圖可以看出:I2C兩根線:一根串行時(shí)鐘線SCL、一根串行數(shù)據(jù)線SDA,且兩根線對(duì)應(yīng)到器件的兩個(gè)pin均是雙向的,也就是說(shuō)主器件和從器件不是恒定不變的。
Pin腳的電路結(jié)構(gòu)為開(kāi)漏輸出(開(kāi)漏輸出的典型特點(diǎn)是需外接上拉電阻才能對(duì)外輸出高電平),所以需要通過(guò)上拉電阻接電源VCC,保證總線空閑時(shí)兩根線都是高電平,且能夠?qū)崿F(xiàn)高低電平的變化。總線在傳輸數(shù)據(jù)時(shí),當(dāng)SCL電平為高時(shí),SDA數(shù)據(jù)有效,且需要保持一定的時(shí)間;當(dāng)SCL為低電平時(shí),SDA數(shù)據(jù)無(wú)效,允許變化。
I2C總線有主從之分,連接總線的外部器件也都是CMOS器件,輸出級(jí)也都是開(kāi)漏電路,在總線上消耗的電流很小,這樣保證I2C總線不需要太大的電流驅(qū)動(dòng)能力。但I(xiàn)2C總線上可擴(kuò)展的器件數(shù)量主要是由電容負(fù)載來(lái)決定,因?yàn)槊總€(gè)器件的總線接口都有一定的等效電容,而線路中電容會(huì)影響總線傳輸速度,當(dāng)電容過(guò)大時(shí),有可能造成傳輸錯(cuò)誤。所以需要根據(jù)不同的負(fù)載電容去估算支持的最大從設(shè)備數(shù)量。I2C總線的電容負(fù)載能力為400pF(通過(guò)驅(qū)動(dòng)擴(kuò)展可達(dá)到4000pF),每一個(gè)器件的輸入都相當(dāng)于一個(gè)等效電容,由于I2C總線擴(kuò)展器件的連接方式為并聯(lián),因?yàn)镮2C總線的等效電容等于每個(gè)器件的等效電容之和,等效電容存在會(huì)造成傳輸信號(hào)波形的畸變,在超出范圍時(shí),會(huì)導(dǎo)致數(shù)據(jù)傳輸出錯(cuò)。
由上圖可以看出,Rp是上拉電阻,CL就是該器件I2C接口的對(duì)GND電容,上拉電阻Rp計(jì)算方式:(VDDmax-UINLmax)/Rpmin< (2~4)mA(I/O口的灌電流)其中:VDDmax:電源電壓的最大值,UINLmax:I/O口上允許的低電平的最大值(CMOS電路結(jié)構(gòu)中UINL<=0.7V)
舉例:評(píng)估出一個(gè)最小的上拉電阻阻值
已知:電源電壓VDD=5V±%10,IO端口的驅(qū)動(dòng)能力為3mA,UINmax=0.7V,則最小的上拉電阻計(jì)算如下:
(VDDmax-UINmax)/Rpmin<3mA 代入數(shù)據(jù),得Rpmin=1.6k;
上拉電阻Rp的最大值計(jì)算
總線電容是線路連接和管腳的總電容,它決定了Rp的最大值
1)標(biāo)準(zhǔn)模式:每條總線線路的最大電容負(fù)載都為400pF,且Tr<300ns;
2)快速模式:每條總線線路的最大電容負(fù)載都為200pF,且Tr<300ns;
I2C的速率:
標(biāo)準(zhǔn)模式SM(Standard mode):100kbit/s,
快速模式FM(Fast mode):400kbit/s,
快速+模式(Fast mode Plus):1Mbit/s
高速模式HS(High-speed mode):3.4Mbit/s
快速模式器件的輸入有抑制毛刺的功能,SDA和SCL輸入有施密特觸發(fā)器;
快速模式器件的輸入緩沖器對(duì)SDA和SCL信號(hào)的下降沿有斜率控制功能;
如果快速模式器件的電源電壓被關(guān)斷,SDA和SCL的I/O管腳必須懸空,不能阻塞總線;
評(píng)估I2C總線一個(gè)最大的上拉電阻阻值方法
I2C端口輸出高電平是通過(guò)Rp上拉到VDD實(shí)現(xiàn),線上電平由低到高的變化,電源通過(guò)Rp對(duì)線上負(fù)載電容Cl充電,從低電平切換到高電平,是需要一定時(shí)間的,即上升時(shí)間,這個(gè)上升時(shí)間可以近似用充電時(shí)間常數(shù)RpCl表示,瑞昱100kbit/s速率應(yīng)用,信號(hào)上升時(shí)間小于300ns,假設(shè)線上的Cl為20pF,計(jì)算出對(duì)應(yīng)的Rp值為17k。(計(jì)算公式:Rpmax=tr/(0.8473Cb)),tr為上升時(shí)間,Cb為總線電容。最大的Rpmax是變化的,需要根據(jù)實(shí)際的Cb計(jì)算。
如果Rp*Cl充電時(shí)間常數(shù)過(guò)大,將是信號(hào)上升沿變化緩慢,達(dá)不到傳輸數(shù)據(jù)要求;如果Rp太小,則會(huì)增大端口的sink電流,在可能的情況下,Rp取值大要一些,以減少好點(diǎn)。
電路干擾:在I2C設(shè)備的電源入口處要加濾波電容,一般加10nF或100nF;SDA和SCL上如果有干擾,要做濾波處理,總線上串接幾十歐姆的電容,對(duì)地加幾十pF電容;
三、通信流程
I2C通信特征總的來(lái)說(shuō),主要是同步串行通信、非差分、低速率。
I2C的在數(shù)據(jù)傳輸過(guò)程中共有三種類型的信號(hào):開(kāi)始信號(hào)START,結(jié)束信號(hào)END,應(yīng)答信號(hào)ACK/NACK.
開(kāi)始信號(hào):SCL為高電平時(shí),SDA由高電平跳變?yōu)榈碗娖?,表示開(kāi)始通信;
停止信號(hào):SCL為高電平時(shí),SDA由低電平跳變?yōu)楦唠娖剑硎窘Y(jié)束通信;
應(yīng)答信號(hào)ACK(NACK):在接收數(shù)據(jù)的IC在接收到一個(gè)字節(jié)數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖(NACK是高電平脈沖,應(yīng)答信號(hào)一般是在第9個(gè)時(shí)鐘傳輸),表示已經(jīng)收到數(shù)據(jù)。開(kāi)始和結(jié)束信號(hào)都是由主機(jī)發(fā)車,應(yīng)答信號(hào)是由從機(jī)發(fā)出。
數(shù)據(jù)的有效性:當(dāng)開(kāi)始傳輸數(shù)據(jù)時(shí),I2C是在SCL為高電平時(shí)采樣,所以SDA線上的數(shù)據(jù)必須在時(shí)鐘SCL高電平周期內(nèi)保持穩(wěn)定的高電平或者低電平狀態(tài),否則會(huì)導(dǎo)致通信失敗。同樣,只有在SCL線上的時(shí)鐘信號(hào)是低電平時(shí),SDA線上的電平才能改變。
空閑狀態(tài):SCL,SDA線上都是高電平。
ACK/NACK說(shuō)明:
1.主機(jī)向從機(jī)發(fā)送數(shù)據(jù),從機(jī)無(wú)法接收或者無(wú)法識(shí)別解析數(shù)據(jù)時(shí),會(huì)發(fā)送NACK;
2.從機(jī)向主機(jī)發(fā)送數(shù)據(jù),主機(jī)不想接收了,主機(jī)會(huì)發(fā)送NACK,這時(shí)從機(jī)釋放SDA總線,好讓主機(jī)接下來(lái)發(fā)送STOP信號(hào)。
發(fā)起通信的流程
首先主機(jī)會(huì)線拉低SDA總線,標(biāo)志我要開(kāi)始通信了,接下來(lái)主機(jī)會(huì)發(fā)送 7bit的地址+1bit的讀寫(xiě)位 如果某個(gè)從設(shè)備地址和主機(jī)發(fā)的地址吻合,就會(huì)發(fā)出一個(gè)ACK信號(hào),通信就此建立。之后的讀寫(xiě)操作,要具體看從設(shè)備的通訊規(guī)范,比如讀一個(gè)寄存器可能要如下操作:
圖中,灰色表示主機(jī)發(fā)送,白色表示從機(jī)發(fā)送。主機(jī)之所以如此發(fā)送數(shù)據(jù),是根據(jù)從機(jī)的通信手冊(cè)來(lái)的,并不是標(biāo)準(zhǔn)的I2C協(xié)議規(guī)定的,主機(jī)并不知道這些數(shù)據(jù)的意義,只有從機(jī)知道。
傳輸步驟
1.在SCL線為高電平時(shí),主機(jī)通過(guò)將SDA線從高電平切換到低電平來(lái)啟動(dòng)總線通信
2.主機(jī)想總線發(fā)送要與之通信的從機(jī)的7位或者10位地址,以及讀寫(xiě)位。
3.每個(gè)從機(jī)將主機(jī)發(fā)送的地址與自己的地址進(jìn)行比較,如果地址匹配,則從機(jī)將SDA線拉低一位,返回一個(gè)ACK位,如果主機(jī)的地址與從機(jī)的地址不匹配,則從機(jī)將SDA線拉高。
4.主機(jī)發(fā)送或接受數(shù)據(jù)幀:
5.傳輸完每個(gè)數(shù)據(jù)幀后,接收設(shè)備將另一個(gè)ACK位返回給發(fā)送方,以確認(rèn)成功接收到該幀。
6.隨后主機(jī)將SCL切換為高電平,然后再將SDA切換為高電平,從而向從機(jī)發(fā)送停止條件。
以上是單個(gè)字節(jié)的傳輸步驟詳解,多字節(jié)的讀寫(xiě)和頁(yè)寫(xiě),后面我們根據(jù)代碼再介紹。
四、I2C通信優(yōu)缺點(diǎn)
與其他通信協(xié)議相比,I2C聽(tīng)起來(lái)很復(fù)雜,以下是其優(yōu)缺點(diǎn)的總結(jié)。
優(yōu)點(diǎn)
缺點(diǎn)
- 數(shù)據(jù)傳輸速率比SPI慢
- 數(shù)據(jù)幀的大小限制為8位
評(píng)論