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