引言:調(diào)試I2C從器件的第一步就是嘗試去讀它的地址,如果無法讀取地址或者向其發(fā)送讀寫命令卻沒有收到ACK回饋,都說明與器件通訊失敗。常規(guī)發(fā)生無法讀取I2C地址的情況時,第一懷疑點往往是硬件互聯(lián)出現(xiàn)問題,本節(jié)分享一個和軟件相關(guān)的調(diào)試案例。
1.問題背景
一枚視頻轉(zhuǎn)換芯片的I2C連接前端MCU上,調(diào)試時發(fā)現(xiàn)I2C通訊失敗,同一總線上的另外兩個器件地址均正常。發(fā)送讀寫命令波形也沒有ACK反饋,檢查過硬件互聯(lián)和Reset配置,均沒有問題。
2.懷疑點和排除過程
總線器件過多
考慮到一個I2C上掛載了三個從器件,分支和節(jié)點過多,并且走線也不短,所以懷疑是從器件過多導(dǎo)致Cload過大,無法和遠(yuǎn)端通訊成功。于是摘掉和另外兩個器件的互聯(lián)電阻,再次嘗試,依然無法通訊,并且測量得到的波形質(zhì)量并不差,如圖1-所示,我們向地址0X8A發(fā)送命令,卻沒有ACK回饋,說明并不是總線負(fù)載電容問題。
圖1-1:向設(shè)備發(fā)送讀寫命令波形
復(fù)位操作
雖然上電后復(fù)位Reset就為高電平,但是嘗試在從器件啟動后再復(fù)位一次,再嘗試讀取I2C地址,依然無法讀到,側(cè)面說明和時序沒有關(guān)系。為了驗證無法通訊是不是器件本身的問題,將其與MCU斷開,直接飛線I2C通過盒子連接到上位機,發(fā)現(xiàn)可以讀到地址,并且讀寫寄存器均正常,如下圖1-2是邏輯分析儀抓取到的波形圖,有明顯的ACK標(biāo)志。
圖1-2:與上位機通訊抓取的讀寫波形
排除掉硬件互聯(lián)和引腳配置以及器件本身的問題,那么只有一個問題就是MCU端的I2C參數(shù)配置出現(xiàn)問題。
主器件I2C參數(shù)
那么主器件I2C涉及哪些參數(shù)呢,總線速度100KHz(標(biāo)準(zhǔn)),400KHz(快速),1MHz(超快速)、Data setup Time、Data hold Time等等這些參數(shù)可調(diào),如圖1-4抓取上位機和器件通訊成功的波形,測試的Data hold Time大概為560ns,遠(yuǎn)遠(yuǎn)大于圖1-5器件手冊中的10-250ns,說明手冊中的此參數(shù)標(biāo)注和實際不符,而MCU端I2C配置的是100ns,所以才通訊失敗。
圖1-3:與上位機通訊波形時間參數(shù)測量
圖1-4:與上位機通訊波形時間參數(shù)測量
圖1-5:器件手冊I2C時間參數(shù)
3.如何修正
如表1-5聯(lián)系原廠核對修改后的參數(shù),修改主機I2C設(shè)置的Data hold time即可。
圖1-6:更正后的時間參數(shù)
4.總結(jié)
對于支持不同通訊速率的I2C設(shè)備,高速率的往往可以兼容低速率的,比如1MHz-I2C的A器件,它可以接收來自100KHz、400KHz、1MHz的速率信息,但是如果與它互聯(lián)的B器件只支持400KHz,那么B只能接收A發(fā)送100KHz、400KHz的信息。而100KHz、400KHz、1MHz的時間參數(shù)都有差異,在調(diào)試時不僅速率要匹配,與速率相關(guān)的時間參數(shù)也必須修改以保持兼容,因為芯片里面的I2C收發(fā)器ADC轉(zhuǎn)換速率與頻率f息息相關(guān),而ADC轉(zhuǎn)換速率就決定著這些時間參數(shù)。
圖1-7:I2C主從機基本結(jié)構(gòu)
從圖1-8可以明顯看出,三種速率下的數(shù)據(jù)保持時間和數(shù)據(jù)設(shè)置時間均有明顯的差異,以上述參數(shù)為例,Data hold time實際為560ns,說明器件僅支持到快速模式,但實際設(shè)置為100ns,而器件并不能支持這么快的采樣速度,所以無法識別Bit位,因此僅僅保持SCK一致,通訊也會fail。
圖1-8:幾種I2C模式的時間參數(shù)
另外有的器件支持好幾種系統(tǒng)時鐘(Syetem Clock),這時候其I2C時間參數(shù)可能就以System Clcok為單位,而不是直觀的us/ms,如圖1-9所示:
圖1-9:和系統(tǒng)時間掛鉤的I2C參數(shù)
-
mcu
+關(guān)注
關(guān)注
146文章
17984瀏覽量
367217 -
調(diào)試
+關(guān)注
關(guān)注
7文章
612瀏覽量
34741 -
通訊
+關(guān)注
關(guān)注
9文章
927瀏覽量
35678 -
總線
+關(guān)注
關(guān)注
10文章
2960瀏覽量
89788 -
I2C
+關(guān)注
關(guān)注
28文章
1541瀏覽量
127905
發(fā)布評論請先 登錄
MM32F013x上實現(xiàn)I2C多地址的功能應(yīng)用
I2C地址跳變問題的調(diào)試案例

arduino讀取I2C總線上連接設(shè)備的地址
mpu6050對應(yīng)i2c地址是什么_如何讀取數(shù)據(jù)

嵌入式linux應(yīng)用讀寫i2c示例

I2C掃描儀之如何在Arduino上查找I2C地址

如何提高I2C調(diào)試效率?

Android Things I2C地址掃描器

評論