I2C匯流排死鎖原因及解決方法

2021-07-22 04:23:23 字數 1656 閱讀 6785

i2c匯流排死鎖原因及解決方法

zhm4976

最近發現訪問i2c裝置時,主裝置復位可能會引起i2c死鎖,表現為scl為高,sda一直為低,後發現是從裝置拉死i2c匯流排,從裝置斷電之後,sda變高,上電後通訊正常。後來通過拉低scl訊號線,sda就會自動變成高電平,i2c匯流排恢復。

在正常情況下,i2c匯流排協議能夠保證匯流排正常的讀寫操作。但是,當i2c主裝置異常復位時(看門狗動作,板上電源異常導致復位晶元動作,手動按鈕復位等等)有可能導致i2c匯流排死鎖產生。下面詳細說明一下匯流排死鎖產生的原因。

在i2c主裝置進行讀寫操作的過程中.主裝置在開始訊號後控制scl產生8個時鐘脈衝,然後拉低scl訊號為低電平,在這個時候,從裝置輸出應答訊號,將sda訊號拉為低電平。如果這個時候主裝置異常復位,scl就會被釋放為高電平。此時,如果從裝置沒有復位,就會繼續i2c的應答,將sda一直拉為低電平,直到scl變為低電平,才會結束應答訊號。 而對於i2c主裝置來說.復位後檢測scl和sda訊號,如果發現sda訊號為低電平,則會認為i2c匯流排被占用,會一直等待scl和sda訊號變為高電 平。這樣,i2c主裝置等待從裝置釋放sda訊號,而同時i2c從裝置又在等待主裝置將scl訊號拉低以釋放應答訊號,兩者相互等待,i2c匯流排進人一種 死鎖狀態。同樣,當i2c進行讀操作,i2c從裝置應答後輸出資料,如果在這個時刻i2c主裝置異常復位而此時i2c從裝置輸出的資料位正好為0,也會導 致i2c匯流排進入死鎖狀態。

方法

(1)盡量選用帶復位輸人的i2c從器件。

(2)將所有的從i2c裝置的電源連線在一起,通過mos管連線到主電源,而mos管的導通關斷由i2c主裝置來實現。

(3)在i2c從裝置設計看門狗的功能。

(4)在i2c主裝置中增加i2c匯流排恢復程式。

每次i2c主裝置復位後,如果檢測到sda資料線被拉低,則

控制i2c中的scl時鐘線產生9個時鐘脈衝(針對8位資料的情況,「9個clk可以啟用」的方法來自nxp的文件,nxp(philips)作為i2c匯流排的鼻祖,這樣的說法是可信的),這樣i2c從裝置就可以完成被掛起的讀操作,從死鎖狀態中恢復過來。

這種方法有很大的侷限性,因為大部分主裝置的i2c模組由內建的硬體電路來實現,軟體並不能夠直接控制scl訊號模擬產生需要時鐘脈衝。

或者,傳送i2c_stop條件也能讓從裝置釋放匯流排。

如果是gpio模擬i2c匯流排實現,那麼在i2c操作之前,加入i2c匯流排狀態檢測

i2c_probe

,如果匯流排被占用,則可嘗試恢復匯流排,待匯流排釋放後,再進行操作。要保證i2c操作最小單元的完整性,不被其他事件(中斷、高優先順序執行緒,等)打斷。

(5)在i2c匯流排上增加乙個額外的匯流排恢復裝置。這個裝置監視i2c匯流排。當裝置檢測到sda訊號被拉低超過指定時間時,就在scl匯流排上產生9個時鐘 脈衝,使i2c從裝置完成讀操作,從死鎖狀態上恢復出來。匯流排恢復裝置需要有具有程式設計功能,一般可以用微控制器或cpld實現這一功能。

(6)在i2c上串人乙個具有死鎖恢復的i2c緩衝器,如linear公司的ltc4307是乙個雙向的i2c匯流排緩衝器,並且具有i2c匯流排死鎖恢復的功能。ltc4307匯流排輸入側連線主裝置,匯流排輸出側連線所有從裝置。

當ltc4307檢測到輸出側sda或scl訊號被拉低30ms時,就自動斷開i2c匯流排輸入側與輸出側的連線.並且在輸出側scl訊號上產生16個時鐘脈衝來釋放匯流排。當匯流排成功恢復後,ltc4307會再次連線輸入輸出側,使匯流排能夠正常工作。

I2C匯流排死鎖

原文 現象 最近發現訪問i2c裝置時,主裝置復位可能會引起i2c死鎖,表現為scl為高,sda一直為低,後發現是從裝置拉死i2c匯流排,從裝置斷電之後,sda變高,上電後通訊正常。後來通過拉低scl訊號線,sda就會自動變成高電平,i2c匯流排恢復。原因 在正常情況下,i2c匯流排協議能夠保證匯流排...

死鎖產生原因及解決方法

死鎖 執行緒級 死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源而造成的一種阻塞的現象 產生的4個條件 1 互斥使用 即乙個執行緒在使用時,另外執行緒不可使用 2 不可搶占資源 資源請求者不能強制從資源佔有者手中奪取資源 3 占有且等待 當前執行緒在請求其他資源時,保持對原有資源占有 4 迴...

i2c匯流排時序

一心想踏入linux device driver的世界,想著i2c匯流排相對於usb等其他匯流排較為簡單,就以i2c作為切入點,希望可以逐步理解ldd的設計思想,並能理解其裝置模型的概念。在此對近期於i2c匯流排及驅動原始碼的理解做備忘,以免徒勞。平台友善之臂s70 tiny6410 cpusams...