I2C匯流排死鎖

2021-08-11 05:54:21 字數 1938 閱讀 6401

原文:

現象

最近發現訪問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匯流排被占用,會一直等待sda訊號變為高電平。這樣,i2c主裝置等待從裝置釋放sda訊號(等待sda變高),而同時i2c從裝置又在等待主裝置將scl訊號拉低以釋放應答訊號(等待scl變低),兩者相互等待,i2c匯流排進人一種死鎖狀態。同樣,當i2c進行讀操作,i2c從裝置應答後輸出資料,如果在這個時刻i2c主裝置異常復位而此時i2c從裝置輸出的資料位正好為0,也會導致i2c匯流排進入死鎖狀態。

解決辦法:

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

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

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

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

a.方法一

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

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

b.方法二

傳送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會再次連線輸入輸出側,使匯流排能夠正常工作。

總結:

從裝置準備回應ack,此時sda低,主裝置準備拉低scl以便接收ack,突然主裝置異常復位導致scl變高sda仍然低,此時主裝置會重新檢測匯流排發現sda低會等待從裝置釋放,而從裝置看到scl為高等待主裝置拉低scl接收ack回應,兩者相互死等,導致匯流排死鎖

i2c匯流排時序

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

I 2C匯流排簡介

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

I2C匯流排學習

i2c的時序圖,如下所示 匯流排應當時序圖 i2c時序要求 空閒狀態 scl和sda都是處於高電平。起始訊號 在scl時鐘線為高電平期間,sda輸出下降沿。停止訊號 在scl時鐘線為高電平期間,sda輸出上公升沿。應答訊號 傳送器每傳送乙個位元組,就在時鐘scl第9個脈衝釋放資料線,由接收器反饋乙個...