I2C匯流排被占用

2021-06-15 10:38:08 字數 1737 閱讀 9962

**網易dp先生關於i2c的博文,便於學習時查詢

最近發現訪問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匯流排死鎖原因及解決方法 - dp - dp: 生活的腳步,進步的點滴...

這種方法有很大的侷限性,因為大部分主裝置的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匯流排時序

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

I2C匯流排死鎖

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

I 2C匯流排簡介

總共有五種工作狀態 a 匯流排非忙狀態 該狀態時資料線 sda 和時鐘線 scl 都保持高電平。b 啟動狀態 當時鐘線 scl 為高電平狀態時,資料線 sda 由高電平變為低電平的下降沿被認為是 啟動 訊號。c 停止狀態 當時鐘線 scl 為高電平狀態時,資料線 sda 由低電平變為高電平的下降沿被...