I2C總線SCL信號無法正常拉高的問題

    昨天板子起來以後,發現I2C總線不能正常工作。掛載到I2C總線上的設備出去RTC可以正常工作外,其他都“完蛋”了。於是抓波,發現SCL高電平無法達到3.3V的幅值。起初以爲是上拉電阻太大了,於是更換爲阻值更小的,但發揮的作用微乎其微,只能勉強上拉到2.3V左右。

    緊接着去查電路和PCB設計,這次PCB走線有些繞,整板看上去類似一個“幾”字,3.3V的上拉靠近源端一側。由於各種原因,此次使用GPIO模擬的I2C的時序來對I2C設備進行控制。因此,目標再一次轉移到GPIO的問題上來。首先,這些IO口爲複用管腳,在配置上作爲輸出,那麼SOC內部應該有弱上拉。按照這個思路,我將外部上拉電阻全部幹掉。在kennel當中,把這個兩個PIN當作IO口在操作。進行簡單的拉高和拉低操作,結果問題依然存在。

    模擬SCL的GPIO口的高電平還是上不去。於是就去網絡尋求幫助,在網絡上找到了一篇關於I2C總線的博客(http://blog.21ic.com/user1/1721/archives/2005/5753.html),這篇博文中描述到:上拉電阻Rp的值由三個參數決定:電源電壓、總線電容和連接器件的數量(輸入電流+漏電流)。此處再援引另外一篇博文(http://yuqix.blog.51cto.com/979066/226504)中提到的關於上拉電阻的計算公式:

Rmin={Vdd(min)-o.4V}/3mA
Rmax=(T/0.874) *c,   T=1us 100KHz, T=0.3us 400KHz C是Bus capacitance
這裏提到的兩個公司,在原版的I2C協議當中,我找到了如下依據:

    結合引用博文的一些數據,我確定我的上拉電阻選型還是合適的。事實證明,當我拿掉這兩個上拉電阻之後,信號也沒有任何改善,從而也證明了問題並非是由上拉電阻選擇不當造成的。

由於這塊單板與以前單板相比,I2C總線上多增加了一顆AD芯片,其餘原理圖均保持了原有的設計。因此,我們又把這顆AD也拆了。但是問題依然沒有得到解決。考慮到I2C走線較長,可能存在壓降的問題以及上拉電阻應該靠近源端的原則。我將在板的I2C器件的SCL就近上拉,然後繼續進行測試。當板子重新掉電重啓之後,高電平上去了。但是同時發現低電平又下不來了,有大概0.8V左右的壓差。這點讓我感到非常的費解。

    仔細排查原理圖發現,在一顆音頻芯片的I2C管腳上,對地接了50PF的濾波電容。由於容值很小,無論如何充電也一定就是造成低電平無法到0V的原因。爲了保險,我又把這兩個電容也拆了。結果,問題依然沒有解決。電容的嫌疑排除了。此時繼續覈查原理圖,發現I2C總線上的一個音頻芯片的復位管腳所接的GPIO口發生了變化,與上次版本不一致,且在這個復位線上只有一個3.3V的上拉。

    對於大多數芯片來說,當芯片上電時要對ASIC內部的專用寄存器進行初始化,因此在芯片上電以後,復位管腳還需要保持一段時間內有效,否者該芯片的寄存處初始化可能失敗。因此,順着這樣的邏輯,我們將該音頻芯片拆除後又進行了一次測試,一切正常。同時,我們也排除了AD的I2C控制器出問題的情況。

    繼續,返回仔細看看這個顆芯片的datasheet,果然在“硬件復位”一章中到了官方的說明。這顆芯片需要在上電以後,reset管腳必須要保持10ns以上的保持時間。這樣這顆芯片的寄存器才能正常初始化。接口才能正常工作。

經過相關負責人燒寫之後,I2C總線成功啓動。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章