linux I2C裝置寫操作錯誤的分析過程

2021-06-25 22:35:28 字數 869 閱讀 1301

今天除錯驅動的時候發現了乙個問題,初始化i2c裝置的時候寫i2c出錯,kernel標準錯誤型別是input/output error。

一般出現input/output error錯誤,都跟硬體多少有點關係,但是在其他版本的sdk上測試確認這個i2c裝置沒問題,可以正常工作。所以認為是i2c通訊沒問題,肯定是其他問題導致的。

i2c的通訊依靠sda、scl,這兩根控制線的空閒狀態分別是:

sda:持續高電平。

scl:持續高電平。

i2c寫操作出錯時,檢測到的控制線的狀態分別是:

sda:有脈衝訊號。

scl:有脈衝訊號。

i2c匯流排的控制協議:scl為high時,sda下降沿開始傳輸資料;scl為high時,sda上公升沿停止傳輸。通過在核心中新增列印,發現了出錯的地方:

wait_for_completion_timeout()

既然scl和sda都有脈衝訊號,說明資料確實是在傳輸,但是為何會出錯,當然只會有以下幾種可能:

1、從裝置位址不對。

2、從裝置工作狀態不對。

可以確認位址正確,那就只剩下從裝置工作狀態不對的情況。要麼元器件損壞、要麼休眠、復位等等··

通過對比兩個不同版本的sdk工作時的i2c裝置的控制引腳狀態,發現reset引腳的電平正好是反的。通訊錯誤的軟體版本--裝置的reset引腳為低電平;另外乙個為高電平。檢視裝置的datasheet,其定義:reset引腳常態為高電平、18個工作時鐘以上的低電平進行復位操作。

所以這個問題可以總結為裝置一直處於復位狀態,導致i2c通訊不成功。通過修改復位引腳輸出電平,通訊正常,問題解決。通過這個問題,可以反思問題的表象不一定就是問題的本質,如果一直在表象上去做工作,一定會浪費很多很多的時間,適當改變思維方式,也許就是那麼簡單。

Linux I2C裝置驅動學習

一 i2c 簡介 1 i2c簡介 a 優點 i2c匯流排僅用兩根訊號線 scl sda 就實現了裝置之間的資料互動,極大簡化了對硬體資源和pcb板佈線空間的占用 b 用途 eeprom 實時鐘 小型lcd等裝置與cpu的介面中 2 i2c驅動體系 i2c框架 通用 適應性強 i2c核心 i2c匯流排...

linux i2c 裝置節點讀寫

最近需要操作24c02,封裝了一下函式方便以後操作。原始碼 include include include include include include include include define i2c default timeout 1 define i2c default retry 3 ...

手把手教你寫Linux I2C裝置驅動2

要想在linux下讀寫晶元的i2c暫存器,一般需要在linux編寫乙份該晶元的i2c驅動,關於linux下如何編寫i2c驅動,前一篇文章 手把手教你寫linux i2c裝置驅動 已經做了初步的介紹,並且留下了兩個疑問尚未解決,第乙個是如何對linux提供的i2c操作函式進行進一步封裝,實現對晶元暫存...