最近做項(xiàng)目測(cè)試時(shí)發(fā)現(xiàn)I2C data信號(hào)低電平不能完全到0電平,如下圖
量測(cè)到低電平最大值150mV左右,檢查SOC及負(fù)載端SPEC,低電平最大值都是VIL max =0.35VDD 對(duì)于1.8V的IO 電平,這個(gè)電壓是0.35x1.8=0.63V 顯然150mV<<630mV,不影響邏輯判斷,因此從項(xiàng)目的角度考慮,此問題并不影響項(xiàng)目,可以忽略。只是做項(xiàng)目的角度考慮,此問題就可以結(jié)束了。
但拍電視也不能在第一集就結(jié)束吧,顯然還需要繼續(xù)分析……
但要深究原因,那就又得重新抓起……,那就從新抓起吧,反問:為啥會(huì)出現(xiàn)不到0的情況?
最容易想到的是內(nèi)部MOS有壓降,啥情況下有壓降,電流大了會(huì)有壓降,對(duì),所有的MOS在開啟時(shí)都有Ron,雖然都很小,但在電流大的時(shí)候這個(gè)壓降在所難免,查了下高通IO 電壓壓降,顯示最大50mV,也就是正常GPIO在低電平50mV就是最大。
那為啥這里會(huì)這么大,原因是I比較大,正常使用GPIO,上拉會(huì)選擇4.7K-100K,4.7K 算是比較強(qiáng)的上拉了,而這里I2C大部分在2.2K,而這里測(cè)試時(shí)上拉是1k。因此理論上通路的電流是1.8/1k=1.8mA,正常GPIO驅(qū)動(dòng)電流是2-16mA step 2mA,按理說也是夠用。
為了驗(yàn)證是電流能力問題,做了兩個(gè)實(shí)驗(yàn),
1.將通路電流降低,即將上拉改大,修改到2.2K
2.將通路電流能力提高,即將MOS的電流能力增加修改到4mA.
如上兩個(gè)驗(yàn)證下來都會(huì)降低低電平時(shí)的電壓,能降到100mV左右。
從軟件配置看,默認(rèn)的I2C電流是2mA,默認(rèn)GPIO也是2mA.
另外查了下CSDN類似的問題,如下這位仁兄做實(shí)驗(yàn)和我的類似,不過他最后將I2C的pad改成了GPIO模式,然后低電平就到0了。
MT6739 Android 8.1 I2C口電平轉(zhuǎn)換低電平無法到0V的解決辦法_楊涂涂的博客-CSDN博客_i2c低電平無法拉到0v
基于此:有兩個(gè)問題
1.為什么GPIO模式能到0,而I2C模式不能到0?
2.I2C 的GPIO能修改為Push-Pull嗎?
我們知道GPIO模式pin配置通常是Push-pull(PP),而I2C 配置是OpenDrain(OD),為了說明簡(jiǎn)單,下文稱為PP和OD。
如下是STM32 GPIO框圖,Push-pull電路看的很清楚
?高通SOC內(nèi)部電路類似,如下只是降Push-pull和Pull Up這些細(xì)節(jié)電路用了框表示
?先思考第一個(gè)問題
第一個(gè)問題的描述并不準(zhǔn)確,它是基于場(chǎng)景的描述,并沒有給出指定的條件,如果修改為:
同樣的GPIO MOS(內(nèi)部N-MOS+P-MOS不變)電路情況下,為什么Push-pull能到0,而OD不能到0?
這樣的問題,答案是問題不準(zhǔn)確,如果是內(nèi)部電路不變(至少P-MOS 在PP和OD下是同一個(gè))那么如果PP能到0,OD也能到0(在上升和下降時(shí)間很短的情況,如上的波形能看出上升和下降時(shí)間都很短)。
只有在上升和下降時(shí)間很長(zhǎng)時(shí)才有可能出現(xiàn)PP能到0,而OD不能到0,因?yàn)镺D的上升和下降tao=RC,R 更大。而沒有外加電容時(shí)寄生電容大概是pF 級(jí)別,低速電路都可以忽略。但那位仁兄加了MOS后的下降沿看起來很大,并不能完全忽略。
因此回到該場(chǎng)景下,為什么在那位仁兄的SOC上,GPIO的低電平能到0,而I2C的低電平不能到0,還是因?yàn)镸OS電流能力,I2C的電流默認(rèn)是2mA,GPIO 他期望的是沒有電流限制。沒有看到配成GPIO時(shí)的電流。
GPIO電路通常是Push-pull電路,即N-MOS和P-MOS都處在開關(guān)狀態(tài),要么打開要么關(guān)閉,那么GPIO又是怎么去控制電流的呢?
我們知道,只有MOS處在可變電阻區(qū)時(shí)(放大區(qū)),電流才能變化,但此時(shí)DS之間的壓降很大,GPIO肯定不能用這種模式。
猜想:1.內(nèi)部可能是多個(gè)Push-pull電路并聯(lián)
? ? ? ? 2.使用Jfet之類的fet控制,在電流可控區(qū)域依然沒有壓降,這個(gè)猜想出現(xiàn)不到1分鐘就自我否定了,原因是Jfet在電流可變時(shí)也有壓降,另外現(xiàn)在的SOC都是CMOS電路,那就說明了是MOSFET構(gòu)成的。
因此只有1是可能的猜想,為了驗(yàn)證這個(gè)猜想,找了很久資料,最終找到確實(shí)是并聯(lián)了PP電路。
如下是它提供的電路
Digital output with programmable current
The current drive of the output pad is an important parameters for low-power application. Using a 2mA current limits the power dissipation but provokes low speed switching. When 2mA and 4mA drivers work simultaneously, a 6mA current is available to charge and discharge the output signal faster, at the cost of a higher power dissipation.
?
?因此如果是2-16mA 可編程,那么內(nèi)部應(yīng)該是2||4||6||8 4個(gè)PP電路。而為了減少功耗,默認(rèn)通常是2mA.
查到這里已經(jīng)查到了IC設(shè)計(jì)的基本概念,屬于電路設(shè)計(jì)的上游,由此本職工作要做好,經(jīng)常會(huì)涉及上下游的知識(shí)。做好并不容易。
基于此PP能到0,而OD不能到0,本質(zhì)上內(nèi)部走的不是同一個(gè)電路。
?回到第二個(gè)問題:I2C能用PP模式嗎?
回想I2C通信過程,大概是maste?發(fā)送8bit數(shù)據(jù),等待slaver 回復(fù)ack,或者反過來,因此在SOC端,發(fā)送8bit再讀1bit,摘取協(xié)議中電路如下。
?如主機(jī)為PP,從機(jī)依然是OD,那么主機(jī)發(fā)送數(shù)據(jù)(高低電平)還是按照GPIO傳輸一樣輸出,第9bit時(shí)不需要輸出,此時(shí)總線設(shè)置為輸入,數(shù)據(jù)走如上標(biāo)注2的位置,因此也不沖突,這樣看,在單主機(jī)多從機(jī)的情況下,主機(jī)發(fā)送是可以設(shè)置為PP。
但I(xiàn)2C是多主機(jī)多從機(jī)的通信協(xié)議,在多主機(jī)時(shí),主機(jī)如果都設(shè)置為PP,那么存在短路情況,因此肯定不行,協(xié)議規(guī)定OD是合理的。
基于以上這些理解,繼續(xù)查看之前的波形,發(fā)現(xiàn)第9bit?時(shí)電平能回到0,而9bit是slave發(fā)送給maste的,因此再次判定是SOC內(nèi)部的N-MOS的驅(qū)動(dòng)不夠。
(嚴(yán)格意義上說還有走線阻抗的存在,因?yàn)闇y(cè)試時(shí)是偏向slave負(fù)載端測(cè)試的,這樣走線的阻抗都計(jì)算在了maste端的RS上,但畢竟很小,沒深究)
因此如上圖就是maste發(fā)送給slave的數(shù)據(jù),如果反過來slave發(fā)送數(shù)據(jù)給maste,那么不能到0的應(yīng)該只有ack
?數(shù)據(jù)流向及測(cè)試位置示意。
總結(jié):
1.I2C data 低電平不能到0是由于通路電流較大,GPIO 內(nèi)部MOS 內(nèi)阻分到了部分電壓,通路電流或者增加通路電流能力都可以降低此電壓,通常都在SPEC范圍內(nèi),可不修改。
基于不到0 的電平可以判斷數(shù)據(jù)的流向。
2.GPIO 內(nèi)部輸出電流能力控制是通過切換或者并聯(lián)不同的PP電路實(shí)現(xiàn),因此PP模式和OD模式時(shí)可能并不是同一個(gè)電路,盡管他們都是由同一個(gè)pin輸出。文章來源:http://www.zghlxwxcb.cn/news/detail-423028.html
3.I2C 修改為Push-Pull的操作,只在單主機(jī)上可行,多主機(jī)時(shí)依然要遵守協(xié)議。(這一點(diǎn)可能不準(zhǔn)確,有經(jīng)驗(yàn)的同學(xué)幫忙評(píng)論留言)文章來源地址http://www.zghlxwxcb.cn/news/detail-423028.html
到了這里,關(guān)于由I2C data信號(hào)低電平不到0,再思考I2C及GPIO的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!