[問題]Atiny1617 關於IIC匯流排一直被拉低的原因分析

2020-08-09 10:09:25

在之前的工作中遇到一次IIC匯流排的問題:一個主裝置和兩個從裝置使用的一路硬體IIC的環境下,當分別載入兩個從裝置驅動的時候,出現了IIC匯流排中的SDA被一直拉低,SCL有週期性的毛刺

(圖中SDA是黃色線,SCL是藍色線)

細節圖:

用邏輯分析儀抓取的:

其中一個從裝置是ATmel系列晶片,而問題就是出在Atmel的硬體IIC中。

經分析,在Atmel發送數據時產生了一個衝突,而在衝突的處理常式中,這裏直接重新初始化IIC。

查閱了有關datasheet:

意思是:

如果從裝置不能發送高電平或NACK,此時衝突標誌位會被置起。

於是就不能發送數據了,但是從裝置依然能正常工作。

這個衝突標誌位是臨時的,下一次的start信號會自動清除掉衝突標誌位。

該標誌用於使用地址解析協定的系統。 但是,檢測到的衝突是非地址解析協定情況,表明存在協定衝突,應將其視爲匯流排錯誤。

 

因此,原因是這樣的,在主機讀數據的過程中,從裝置控制SDA,主裝置控制SCL,此時重新初始化iic,也直接將管腳進行了初始化,直接打亂SCL的時鐘和長期佔有SDA。

於是,我嘗試將衝突處理常式中的重新初始化和return去掉,發現:

IIC當前的問題幀的數據是不對的,但並不影響之後的幀的數據,也不會造成匯流排持續拉低的問題。

修改方法:

在衝突處理常式中,僅做列印通知,並且主機做好相應的數據過濾。