I2C總線設(shè)計(jì)注意事項(xiàng)
對(duì)于硬件工程師,I2C再熟悉不過了,兩根線,一根數(shù)據(jù)SDA一根時(shí)鐘SCL。當(dāng)時(shí)在使用avr CPU設(shè)計(jì)數(shù)據(jù)采集器產(chǎn)品的CPU主板,外掛了Silicon lab的溫濕度傳感器Si7013,實(shí)時(shí)時(shí)鐘,主要實(shí)現(xiàn)溫濕度、時(shí)鐘及電流電壓等信號(hào)通過I2C總線到達(dá)CPU進(jìn)行處理,并且由MCU EFM32WG290F64控制在液晶上和上位機(jī)界面上的CPU自帶的I2C總線外掛的六個(gè)I2C從設(shè)備,如下圖1所示。
本文引用地址:http://www.ex-cimer.com/article/201812/396200.htm
圖1:Avr的I2C接口電路圖
最初時(shí)候,此CPU主板的I2C接口僅掛了實(shí)時(shí)時(shí)鐘和溫度芯片,采用CPU自帶的I2C接口。在調(diào)試時(shí),波形都比較正常,上升沿和下降沿都能符合要求,通常跑的速率為100KHz。然而后期改版,需要在I2C接口上增加四個(gè)I2C設(shè)備,線路也相應(yīng)地變長(zhǎng),在調(diào)試的時(shí)候,就發(fā)現(xiàn)CPU主板上電后,I2C工作異常,偶爾會(huì)讀不到任何信息。
經(jīng)過了長(zhǎng)時(shí)間的查問題階段,發(fā)現(xiàn)通過I2C接口的SDA和SCL上拉電阻的大小與放置位置都是有講究的。通常I2C上拉電阻放在CPU引出的位置,若沒有外掛的I2C芯片就不需要加上拉電阻,這點(diǎn)在我們的CPU主板是沒有問題的。然后就是上拉電阻,這個(gè)通常講的就是與速率有關(guān),我們將上拉電阻從4.7K,2.2K,1K甚至幾百歐姆都測(cè)試過,在1K和2.2K的情況下,上升沿和下降沿會(huì)比較陡一點(diǎn)。速率100KHZ下采用2.2K的上拉電阻測(cè)試出的I2C波形,如圖2所示。
圖2:在100Khz下,采用2.2K的上拉電阻測(cè)試出的I2C波形
最終測(cè)出的情況,在上拉電阻為4.7K的時(shí)候,速率在100KHZ,波形是正常的;在2.2K的時(shí)候,速率在100Khz的時(shí)候,波形也是正常;在1K的時(shí)候,速率為400Khz,波形也正常;在470歐姆的時(shí)候,速率為400KHZ,波形就會(huì)畸變。我們采用的上拉2.2K,速率為100KHZ的接口,仍出現(xiàn)CPU板電后I2C工作異常,讀不到任何異常信息。后發(fā)現(xiàn)是SDA被一直拉低了,SCL一直為高,I2C被死鎖了。
為了解決這種問題,在網(wǎng)絡(luò)上找到一種采用IO模擬I2C的方式,調(diào)試了一周后,發(fā)現(xiàn)這個(gè)問題得到了解決。將I2C接口當(dāng)做普通IO來(lái)操作可能是改動(dòng)最小的一種方式。其實(shí)針對(duì)這個(gè)問題,還有一些辦法可以使用:
1)盡量選用帶復(fù)位輸人的I2C從器件。
2)將所有的從I2C設(shè)備的電源連接在一起,通過MOS管連接到主電源,而MOS管的導(dǎo)通關(guān)斷由I2C主設(shè)備來(lái)實(shí)現(xiàn)。
3)在I2C從設(shè)備設(shè)計(jì)看門狗的功能。
4)在I2C總線上增加一個(gè)額外的總線恢復(fù)設(shè)備,用來(lái)監(jiān)視I2C總線。當(dāng)設(shè)備檢測(cè)到SDA信號(hào)被拉低超過指定時(shí)間時(shí),就在SCL總線上產(chǎn)生9個(gè)時(shí)鐘脈沖,使I2C從設(shè)備完成讀操作,從死鎖狀態(tài)上恢復(fù)出來(lái)。總線恢復(fù)設(shè)備需要有具有編程功能,一般可以用單片機(jī)或CPLD實(shí)現(xiàn)這一功能。
由于avr CPU帶多個(gè)I2C從設(shè)備出現(xiàn)死鎖的問題,雖然能夠通過IO模擬解決問題,但是對(duì)于編程來(lái)說(shuō)比較麻煩,IO模擬在高速上面效果并不好。后來(lái)更換了Silicon Labs的MCU,型號(hào)為EFM32WG290F64,做了一個(gè)最小系統(tǒng)板,外圍電路不變,I2C死鎖問題不再存在,有效地解決了我的I2C問題。采用EFM32WG290F64讀到的I2C波形如下:
圖3:EFM32WG290F64讀到的I2C波形
另外,設(shè)計(jì)中通過采用了多片溫濕度傳感器Si7013,精度也非常高,特別在高溫條件下,測(cè)試的濕度準(zhǔn)確率也非常高。其實(shí)I2C接口在我們的設(shè)計(jì)中再常見不過,但在設(shè)計(jì)中還是要特別注意以下幾點(diǎn),能夠充分考慮以下的要點(diǎn),I2C設(shè)計(jì)就可以游刃有余。
1)I2C線路的負(fù)載電容不能超過400pF;
2)需要滿足上升沿和下降沿的時(shí)序關(guān)系;
3)I2C上拉電阻和速率有著密切的聯(lián)系,需要選擇合理;
4)如何判斷死鎖的情況,如上面所示,并提供了一系列的解決方案。
評(píng)論