IIC掛死問題解決過程


0.環境:arm CPU 帶有IIC控制器作為slave端,帶有調試串口。

1.bug表現:IIC slave 在系統啟動后概率掛死,導致master無法detect到slave。

 

猜測1:認為IIC device程序有問題

檢查1:查看程序發現有可能溢出的部分,使用IIC 工具刷過量數據到slave,未出問題。

猜測2:認為IIC device寄存器進入異常狀態未能恢復

檢查2:檢查正常IIC寄存器和異常狀態IIC寄存器,未能發現問題。

猜測3:時鍾分頻問題

檢查3:詢問同事,答固定分頻。

猜測4:看波形分析

檢查4:波形未量到,測量波形導致通信異常,部分設備破壞,放棄該方法。

 

2.發現新情況:系統啟動過程中如果調試串口有數據輸入,問題會概率出現。如果串口沒有輸入則多次測試不會出現問題。

 

猜測1:串口中斷導致IIC初始化時被打斷產生問題。

檢查1:刪除調試串口設備樹節點,發現IIC啟動100%出現問題 T-T。

猜測2: 100%復現的問題和之前的概率出現的問題相同

檢查2:檢查寄存器,檢查設備detect 表現,認為是相同問題。

 

3.刪除調試串口,IIC受影響的原因?

刪除串口設備樹節點,IIC device 必出問題。

 

猜測1:懷疑調試串口外部硬件電平高低導致IIC外設受影響

檢查1:檢查原理圖,未發現影響的可能性。

猜測2:懷疑串口初始化部分處理了部分IIC設備依賴的初始化(導致不初始化串口IIC不能正常工作)。

檢查2:查看串口初始化代碼未能發現有值得注意的初始化。

猜測3:懷疑串口初始化影響公共寄存器間接影響IIC。

檢查3:發現公共寄存器IIC div分頻部分和正常工作的分頻不一樣,改回后問題解決。

 

4.公共寄存器怎么被修改的?

刪除串口設備后公共寄存器值不正常,串口收到數據后公共寄存器值不正常。

 

猜測1:調試串口或IIC代碼異常導致寄存器值被修改。

檢查1:增加打印,發現問題原因在於IIC初始化過程中分頻寄存器設置失敗。但是同樣方法在IIC device端初始化時設置該寄存器是成功的。

5.公共寄存器為什么不能寫入?

猜測1: 特定配置下IIC 分頻寄存器為只讀

檢查1:芯片設計方核實不存在這樣的設計。

檢查1:在寫入分頻寄存器前增加打印,dump所有公共寄存器。和正常公共寄存器做比較,未發現問題。寫入IIC分頻器成功。

猜測2:增加打印信息后寫入成功為必現,去掉打印會寫入不成功。

檢查2:證實猜測。

猜測3:寫入成功和讀取公共寄存器相關

檢查3:減少dump范圍,小范圍dump寫入失敗,大范圍dump寫入成功。

猜測4:寫入成功和寫入時間相關

檢查4:dump的寄存器次數不變dump相同寄存器。證實寫入成功與寫入時間相關。

 

6.為什么不能寫入和時間相關?

思考:可能和時鍾初始化相關,但是公共寄存器的時鍾初始化狀態dump是正常的。

 

猜測1:dump過程中時鍾初始化完成(證據:增加dump后寫入正常)。

檢查1:減少dump范圍,發現公共寄存器的mpll穩定寄存器未穩定。

猜測2:時鍾相關初始化未完成導致寫入失敗。

檢查2:根據時鍾依賴,在寫入前增加等待,同時去掉打印,寫入成功。

 

去掉串口設備導致問題100%復現,原因是串口不用初始化導致IIC 時鍾分頻更早初始化,寫入IIC分頻寄存器失敗。

 

總結:

1.解決問題過程中,曾經懷疑過時鍾分頻問題但是未檢查寄存器,導致問題解決時間拉長。

2.最開始未能考慮問題和時間相關的情況,如果直接思考該可能性,預計提高解決問題速度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM