今天除錯驅動的時候發現了乙個問題,初始化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操作函式進行進一步封裝,實現對晶元暫存...