I2C總線(xiàn)設計注意事項
對于硬件工程師,I2C再熟悉不過(guò)了,兩根線(xiàn),一根數據SDA一根時(shí)鐘SCL。當時(shí)在使用avr CPU設計數據采集器產(chǎn)品的CPU主板,外掛了Silicon lab的溫濕度傳感器Si7013,實(shí)時(shí)時(shí)鐘,主要實(shí)現溫濕度、時(shí)鐘及電流電壓等信號通過(guò)I2C總線(xiàn)到達CPU進(jìn)行處理,并且由MCU EFM32WG290F64控制在液晶上和上位機界面上的CPU自帶的I2C總線(xiàn)外掛的六個(gè)I2C從設備,如下圖1所示。
本文引用地址:http://dyxdggzs.com/article/201812/396200.htm

圖1:Avr的I2C接口電路圖
最初時(shí)候,此CPU主板的I2C接口僅掛了實(shí)時(shí)時(shí)鐘和溫度芯片,采用CPU自帶的I2C接口。在調試時(shí),波形都比較正常,上升沿和下降沿都能符合要求,通常跑的速率為100KHz。然而后期改版,需要在I2C接口上增加四個(gè)I2C設備,線(xiàn)路也相應地變長(cháng),在調試的時(shí)候,就發(fā)現CPU主板上電后,I2C工作異常,偶爾會(huì )讀不到任何信息。
經(jīng)過(guò)了長(cháng)時(shí)間的查問(wèn)題階段,發(fā)現通過(guò)I2C接口的SDA和SCL上拉電阻的大小與放置位置都是有講究的。通常I2C上拉電阻放在CPU引出的位置,若沒(méi)有外掛的I2C芯片就不需要加上拉電阻,這點(diǎn)在我們的CPU主板是沒(méi)有問(wèn)題的。然后就是上拉電阻,這個(gè)通常講的就是與速率有關(guān),我們將上拉電阻從4.7K,2.2K,1K甚至幾百歐姆都測試過(guò),在1K和2.2K的情況下,上升沿和下降沿會(huì )比較陡一點(diǎn)。速率100KHZ下采用2.2K的上拉電阻測試出的I2C波形,如圖2所示。

圖2:在100Khz下,采用2.2K的上拉電阻測試出的I2C波形
最終測出的情況,在上拉電阻為4.7K的時(shí)候,速率在100KHZ,波形是正常的;在2.2K的時(shí)候,速率在100Khz的時(shí)候,波形也是正常;在1K的時(shí)候,速率為400Khz,波形也正常;在470歐姆的時(shí)候,速率為400KHZ,波形就會(huì )畸變。我們采用的上拉2.2K,速率為100KHZ的接口,仍出現CPU板電后I2C工作異常,讀不到任何異常信息。后發(fā)現是SDA被一直拉低了,SCL一直為高,I2C被死鎖了。
為了解決這種問(wèn)題,在網(wǎng)絡(luò )上找到一種采用IO模擬I2C的方式,調試了一周后,發(fā)現這個(gè)問(wèn)題得到了解決。將I2C接口當做普通IO來(lái)操作可能是改動(dòng)最小的一種方式。其實(shí)針對這個(gè)問(wèn)題,還有一些辦法可以使用:
1)盡量選用帶復位輸人的I2C從器件。
2)將所有的從I2C設備的電源連接在一起,通過(guò)MOS管連接到主電源,而MOS管的導通關(guān)斷由I2C主設備來(lái)實(shí)現。
3)在I2C從設備設計看門(mén)狗的功能。
4)在I2C總線(xiàn)上增加一個(gè)額外的總線(xiàn)恢復設備,用來(lái)監視I2C總線(xiàn)。當設備檢測到SDA信號被拉低超過(guò)指定時(shí)間時(shí),就在SCL總線(xiàn)上產(chǎn)生9個(gè)時(shí)鐘脈沖,使I2C從設備完成讀操作,從死鎖狀態(tài)上恢復出來(lái)??偩€(xiàn)恢復設備需要有具有編程功能,一般可以用單片機或CPLD實(shí)現這一功能。
由于avr CPU帶多個(gè)I2C從設備出現死鎖的問(wèn)題,雖然能夠通過(guò)IO模擬解決問(wèn)題,但是對于編程來(lái)說(shuō)比較麻煩,IO模擬在高速上面效果并不好。后來(lái)更換了Silicon Labs的MCU,型號為EFM32WG290F64,做了一個(gè)最小系統板,外圍電路不變,I2C死鎖問(wèn)題不再存在,有效地解決了我的I2C問(wèn)題。采用EFM32WG290F64讀到的I2C波形如下:

圖3:EFM32WG290F64讀到的I2C波形
另外,設計中通過(guò)采用了多片溫濕度傳感器Si7013,精度也非常高,特別在高溫條件下,測試的濕度準確率也非常高。其實(shí)I2C接口在我們的設計中再常見(jiàn)不過(guò),但在設計中還是要特別注意以下幾點(diǎn),能夠充分考慮以下的要點(diǎn),I2C設計就可以游刃有余。
1)I2C線(xiàn)路的負載電容不能超過(guò)400pF;
2)需要滿(mǎn)足上升沿和下降沿的時(shí)序關(guān)系;
3)I2C上拉電阻和速率有著(zhù)密切的聯(lián)系,需要選擇合理;
4)如何判斷死鎖的情況,如上面所示,并提供了一系列的解決方案。
評論