在之前的工作中遇到一次IIC匯流排的問題:一個主裝置和兩個從裝置使用的一路硬體IIC的環境下,當分別載入兩個從裝置驅動的時候,出現了IIC匯流排中的SDA被一直拉低,SCL有週期性的毛刺
(圖中SDA是黃色線,SCL是藍色線)
細節圖:
用邏輯分析儀抓取的:
其中一個從裝置是ATmel系列晶片,而問題就是出在Atmel的硬體IIC中。
經分析,在Atmel發送數據時產生了一個衝突,而在衝突的處理常式中,這裏直接重新初始化IIC。
查閱了有關datasheet:
意思是:
如果從裝置不能發送高電平或NACK,此時衝突標誌位會被置起。
於是就不能發送數據了,但是從裝置依然能正常工作。
這個衝突標誌位是臨時的,下一次的start信號會自動清除掉衝突標誌位。
該標誌用於使用地址解析協定的系統。 但是,檢測到的衝突是非地址解析協定情況,表明存在協定衝突,應將其視爲匯流排錯誤。
因此,原因是這樣的,在主機讀數據的過程中,從裝置控制SDA,主裝置控制SCL,此時重新初始化iic,也直接將管腳進行了初始化,直接打亂SCL的時鐘和長期佔有SDA。
於是,我嘗試將衝突處理常式中的重新初始化和return去掉,發現:
IIC當前的問題幀的數據是不對的,但並不影響之後的幀的數據,也不會造成匯流排持續拉低的問題。
修改方法:
在衝突處理常式中,僅做列印通知,並且主機做好相應的數據過濾。