MT6739 Android 8.1 I2C口電平轉換低電平無法到0V的解決辦法
項目使用MOS管做I2C的電平轉換,I2C有內部上拉電阻,如下圖:
同樣的電路在其他平臺已經驗證過了,到了MT6739這個平臺發現,當I2C爲master,向salve發送數據時,S1點(藍色)和D1點(黃色)的低電平如下:
可以看到S1點沒有完全到0V,導致MOS管沒有完全導通,所以D1點也沒有降爲0V;
感覺像是GPIO口內部,低電平時候,先經過一個等效電阻R之後,纔到GND,如圖:
爲了驗證上面的猜測,將電平轉換電路的R2電阻,改爲47K,減小MOS管的DS電流之後,S1點(藍色)和D1點(黃色)的低電平如下:
可以看到此時S1和D1的低電平都接近0V,推測原因,可能是因爲,DS的電流減小之後,流過內部等效電阻R的電流減小,R上的壓降也減小,S1點電壓接近0V,MOS管導通,D1點也可以被拉到接近0V;
猜測內部電阻產生的原因是因爲IO口內部有電流限制,當限制的電流比較小的時候,內部等效電阻R的阻值就比較大:
將電平轉換電路的R2電阻,恢復爲4.7K,然後修改IO口的驅動電流到最大值,下面DRV_CFG寄存器:
再測S1點(藍色)和D1點(黃色)的低電平如下:
可以看到此時S1和D1的低電平都接近0V,放大看如下圖:
但最低還是沒有完全到0V,推測原因,可能是因爲,增大IO驅動電流之後,內部等效電阻R的阻值確實減小,但是還有一定的阻值;
所以,確實是因爲電流限制的原因,導致內部形成等效電阻,哪如何能不限制電流?
詢問MTK後,修改如下寄存器:
將EH_CFG寄存器設置爲0,GPIO mode,測試如下:
可以明顯看到,低電平幾乎是0V,並且低電平下降速率也更快了,和其他平臺的表現一致,回頭再修改DRV_CFG寄存器,基本上對波形沒有什麼影響了!
所以,應該是EH_CFG寄存器爲1,I2C mode的時候,IO口對電流的限制比較小,導致內部等效電阻R阻值比較大;當EH_CFG寄存器爲0,GPIO mode的時候,IO口對電流的限制比較寬,或者幾乎沒有限制,內部等效電阻R阻值非常小!