一從二主IIC連接調試


最近有個項目需要實現快速開機出攝像頭預覽(2s內),但是我的板子linux上的qt應用起來都要10s左右了,於是在硬件上增加了一個屏驅芯片TW8836,這是一個mcu,可以直接獲取攝像頭數據送到lcd顯示。

板子上電后首先由8836點亮屏幕並輸出攝像頭預覽,待arm起來后控制8836切換顯示,8836接受arm lvds信號並送到lcd顯示,同時8836將camera數據(bt656)回傳給arm.

由於我們這邊主要是搞arm,沒有更多的預留時間去熟悉研究8836這顆mcu的用法,但是我們板子上還有一顆當做看門狗的stm32,可以通過iic設置8836的寄存器,從而實現相應功能,最后硬件大致框圖如下

 

板子上電前期,stm32先通過iic控制8836輸出camera預覽,待arm起來后,再由arm通過iic控制8836顯示arm輸出的內容。這過程中就涉及到兩個主機公國iic控制同一個從機的邏輯。

首先驗證smt32單獨通過iic單獨控制8836,驗證ok。

其次驗證arm單獨通過iic單獨控制8836,驗證ok。

但是將stm32 、8836及arm都通過iic連接在一起的時候,stm32可以與8836通訊,但是arm無法與8836通訊。

對應log如下:

[root@t3_p3 ~]# insmod gt9xx_ts.ko 
[   24.608866] kyleprint: >>> goodix_ts_init
[   24.613541] ctp_fetch_sysconfig_para: ctp_power_io is invalid. 
[   24.621138] tab:-----------------ms 1----------------------
[   24.627253] GTP9xx***CTP*** ctp_wakeup:status:0,ms = 0
[   24.633091] GTP9xx***config_info.wakeup_gpio.gpio = 227
[   24.690100] GTP9xx***CTP*** ctp_wakeup:status:1,ms = 0
[   24.695742] GTP9xx***config_info.wakeup_gpio.gpio = 227
[   24.720675] i2c-core: driver [gt9xx] using legacy suspend method
[   24.727331] i2c-core: driver [gt9xx] using legacy resume method
[   24.734093] GTP9xxctp_detect: addr = 45
[   24.738550] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.747991] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.757244] i2c_test:I2C retry timeout, reset chip.
[   24.780260] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.789830] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.799080] i2c_test:I2C retry timeout, reset chip.
[   24.820227] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.829752] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.838982] i2c_test:I2C retry timeout, reset chip.
[   24.860384] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.869811] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.879086] i2c_test:I2C retry timeout, reset chip.
[   24.900415] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.909992] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   24.919239] i2c_test:I2C retry timeout, reset chip.
[   25.150324] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.159883] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.169112] i2c_test:get tw8836_id failed ret = -70
[   25.380296] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.389787] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.399036] i2c_test:get tw8836_id failed ret = -70
[   25.610448] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.620066] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.629189] i2c_test:get tw8836_id failed ret = -70
[   25.840414] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.849863] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   25.859075] i2c_test:get tw8836_id failed ret = -70
[   26.070362] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.079971] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.089269] i2c_test:get tw8836_id failed ret = -70
[   26.300313] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.309776] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.319022] i2c_test:get tw8836_id failed ret = -70
[   26.530240] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.539667] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.549098] i2c_test:get tw8836_id failed ret = -70
[   26.760332] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.769763] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.779047] i2c_test:get tw8836_id failed ret = -70
[   26.990276] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   26.999848] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   27.009101] i2c_test:get tw8836_id failed ret = -70
[   27.220466] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   27.230077] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[   27.239151] i2c_test:get tw8836_id failed ret = -70
[   27.244752] ctp_detect:I2C connection might be something wrong

iic從設備沒有響應,只能用示波器抓波形觀察,發現sda數據項一直處於高電平無法拉低,但是在stm32與8836通訊的時候卻可以正常高低切換。

回想對比,發現問題的根本原因是,我在stm32操作完iic后沒有將scl和sda釋放,因為stm32那邊的iic走的是軟件模擬的方式,空閑狀態下SDA和SCL兩個io口都被我拉高了,導致arm這邊無法將電平拉低。

最后在stm iic部分,每次操作完iic就將SDA 和SCL釋放,設置成輸入狀態。

釋放io口后arm已經可以正常與8836通訊,能夠正常獲取到chip id 0x36

 

 

[  686.617078] kyleprint: >>> goodix_ts_init
[  686.621729] ctp_fetch_sysconfig_para: ctp_power_io is invalid. 
[  686.630192] goodix_ts_init:requst irq gpio fail!
[  686.635399] tab:-----------------ms 1----------------------
[  686.635399] GTP9xx***CTP*** ctp_wakeup:status:0,ms = 0
[  686.635399] GTP9xx***config_info.wakeup_gpio.gpio = 227
[  686.690186] GTP9xx***CTP*** ctp_wakeup:status:1,ms = 0
[  686.695816] GTP9xx***config_info.wakeup_gpio.gpio = 227
[  686.721011] i2c-core: driver [gt9xx] using legacy suspend method
[  686.727638] i2c-core: driver [gt9xx] using legacy resume method
[  686.734423] GTP9xxctp_detect: addr = 45
[  686.739420] i2c_test pass
[  686.950714] i2c_test: i= 1 get tw8836_id 0x00 ret 2 
[  686.956180] i2c_test: i= 1 get tw8836_id 0x36 ret 2 
[  687.170542] i2c_test: i= 2 get tw8836_id 0x00 ret 2 
[  687.176041] i2c_test: i= 2 get tw8836_id 0x36 ret 2 
[  687.390399] i2c_test: i= 3 get tw8836_id 0x00 ret 2 
[  687.395851] i2c_test: i= 3 get tw8836_id 0x36 ret 2 
[  687.610415] i2c_test: i= 4 get tw8836_id 0x00 ret 2 
[  687.615858] i2c_test: i= 4 get tw8836_id 0x36 ret 2 
[  687.830542] i2c_test: i= 5 get tw8836_id 0x00 ret 2 
[  687.835980] i2c_test: i= 5 get tw8836_id 0x36 ret 2 
[  688.050448] i2c_test: i= 6 get tw8836_id 0x00 ret 2 
[  688.055920] i2c_test: i= 6 get tw8836_id 0x36 ret 2 
[  688.270492] i2c_test: i= 7 get tw8836_id 0x00 ret 2 
[  688.275955] i2c_test: i= 7 get tw8836_id 0x36 ret 2 
[  688.490476] i2c_test: i= 8 get tw8836_id 0x00 ret 2 
[  688.495963] i2c_test: i= 8 get tw8836_id 0x36 ret 2 
[  688.710888] i2c_test: i= 9 get tw8836_id 0x00 ret 2 
[  688.716341] i2c_test: i= 9 get tw8836_id 0x36 ret 2 
[  688.930820] i2c_test: i= 10 get tw8836_id 0x00 ret 2 
[  688.936359] i2c_test: i= 10 get tw8836_id 0x36 ret 2

 


免責聲明!

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



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