在一些PCB的layout中,大家往往會看到在I2C通信的接口處,往往會接入一個4.7K的電阻,有的datasheet上面明確有要求,需要接入,有的則沒有要求。
I2C接口
對于單片機來講,有些IO內部的上拉電阻可以使能,這樣就省去了外部的上拉電阻,這是對于單片機帶有標準I2C通信協議接口,若是只帶有模擬I2C協議接口,那么就需要考慮接入上拉電阻問題。下圖是攝像頭進行配置通信時SCL和SDA需要進行上拉電阻的連接。
?在大多數情況下,由于I2C接口采用Open Drain機制,器件本身只能輸出低電平,無法主動輸出高電平,只能通過外部上拉電阻RP將信號線拉至高電平。因此I2C總線上的上拉電阻是必須的,如圖1所示。
圖1
因為I2C總線在空閑時必須拉高,只有是高的才能拉成低的,所以這是之所以規定空閑時必須為高的一個原因,要是保持“低”的話,那是不可能成為“多主”總線的。
其實I2C總線接口在工作時只會檢測高低電平,他不會在乎有無上拉電阻的問題,所以總線必須滿足時序要求。
上拉電阻的大小,會牽扯到兩個問題,一個是功耗,一個是速度問題,兩者是一個矛盾體。如果你想盡量提高速度,那么就牽涉到總線電容的問題,其實很容易理解,上拉電阻與總線的電容形成了RC,高速時將直接影響通訊!因為總線拉高時有個充電時間以及高電平的閥值,如果還沒有充電到足以保證從器件可以識別的高電平的閥值時主器件就以為完成了一個總線動作的話,那么通訊肯定是不能進行的!
如果你想盡可能降低功耗,那么就要盡可能增大電阻以最大可能的減小電路各部分的消耗電流從而實現整體降低功耗!但不可能無限大,否則充電時間你會受不了的!
//========================================================
I2C上拉電阻大小
I2C上拉電阻確定有一個計算公式:
Rmin={Vdd(min)-o.4V}/3mA
Rmax=(T/0.874) *c,?? ( T=1us 100KHz, T=0.3us 400KHz )
C是Bus capacitance
Rp最大值由總線最大容限(Cbmax)決定,Rp最小值由Vio與上拉驅動電流(最大取3mA)決定;
于是 Rpmin=5V/3mA≈1.7K(@Vio=5V)或者2.8V/3mA≈1K(@Vio=2.8V)
Rpmax取值:標準模式,100Kbps總線的負載最大容限<=400pF;快速模式,400Kbps總線的負載最大容限<=200pF,根據具體使用情況、目前的器件制造工藝、PCB的走線距離等因素以及標準的向下兼容性,設計中以快速模式為基礎,即總線負載電容<200pF,也就是傳輸速度可以上到400Kbps是不成問題的。于是Rpmax可以取的范圍是1.8K~7K @ Vio=5V對應50pF~200pF。
根據Rpmin與Rpmax的限制范圍,一般取5.1K @ Vio=5V , 負載容限的環境要求也容易達到。在2.8V系統中,console設計選3.3K,portable/handset等低供耗的設計選4.7K犧牲速度換取電池使用時間。
總的來說:電源電壓限制了上拉電阻的最小值 ;負載電容(總線電容)限制了上拉電阻的最大值
補充:在I2c總線可以串連300歐姆電阻RS可以用于防止SDA和SCL線的高電壓毛刺。I2C協議還定義了串聯在SDA、SCL線上電阻Rs。該電阻的作用是,有效抑制總線上的干擾脈沖進入從設備,提高可靠性。這個電阻的選擇一般在100~200ohm左右。當然,這個電阻并不是必須的,在惡劣噪聲環境中,可以選用。
//========================================================
I2C上拉電阻討論
RP不宜過小,一般不低于1KΩ
一般IO 端口的驅動能力在2mA~4mA量級。如果RP阻值過小,VDD灌入端口的電流將較大,這導致端口輸出的低電平值增大(I2C協議規定,端口輸出低電平的最高允許值為0.4V);如果灌入端口的電流過大,還可能損壞端口。故通常上拉電阻應選取不低于1KΩ的電阻(當VDD=3V時,灌入電流不超過3mA)。
RP不宜過大,一般不高于10KΩ
由于端口輸出高電平是通過RP實現的,線上電平從低到高變化時,電源通過RP對線上負載電容CL充電,這需要一定的時間,即上升時間。端口信號的上升時間可近似用充電時間常數RPCL乘積表示。
信號線負載電容(對地)由多方面組成,包括器件引腳、PCB信號線、連接器等。如果信號線上掛有多個器件,負載電容也會增大。比如總線規定,對于的400kbps速率應用,信號上升時間應小于300ns;假設線上CL為20PF,可計算出對應的RP值為15KΩ。
如果RC充電時間常數過大,將使得信號上升沿變化緩慢,達不到數據傳輸的要求。
因此一般應用中選取的都是幾KΩ量級的上拉電阻,比如都選取4K7的電阻。
小阻值的RP電阻增大了端口 Sink電流,故在可能的情況下,RP取值應稍大一點,以減少耗電。另外,通常情況下,SDA,SCL兩條線上的上拉電阻取值是一致的,并上拉到同一電源上。
//========================================================
I2C應用中上拉電阻電源問題
在部中分應用中,還存在主從設備以及上拉電阻電源不一致的情況,比如Camera模組。在很多設計方案中,Camera模組不工作時,并不是進入Power Down模式,而是直接關閉模組供電VDDS。此時,處理器與模組相互連接的所有信號線都應該進入高阻態,否則就會有電流漏入模組;而對于此時的I2C控制信號線來說,由于上拉電阻的存在,必須關斷上拉電阻電源VDDP。如果上拉電阻使用的是系統電源VDDM(VDDP=VDDM),無法關閉,就會有漏電流進入模組;因此這種情況下,應該使用VDDS作為上拉電阻電源(VDDP=VDDS),這樣上拉電阻電源與Slave電源即可同時關閉,切斷了漏電路徑。
另外需要注意的是,在上述應用實例中選擇的IO,應該選取上電默認為輸入(或高阻)才行。