前面說的“I2C七宗罪之第一罪”和復(fù)位有關(guān)系, 這一次我們來說說:
I2C和電源的關(guān)系
提到電源大家的心理通常是緊張滴,不自覺地發(fā)問:是不是問題很嚴(yán)重?是的, 非常嚴(yán)重, 而且通過軟件是沒有辦法解決的。我們先來看下面這張簡圖:
1.系統(tǒng)有風(fēng)扇,12V供電;
2.Fan和CPU之間有轉(zhuǎn)速檢測TACH和轉(zhuǎn)速控制PWM信號;
3.CPU左邊有一個顆I2C EXPANDER,用來做GPIO擴(kuò)展的;
4.DC-DC產(chǎn)生VCC-3.3V分別供給CPU和I2C Expander。
乍一看,也沒啥問題??!俗話說得好,平靜的水面下暗流涌動啊,我先來給大家一點(diǎn)點(diǎn)提示,看看誰能先猜到問題所在,我們來看看CPU PWM/TACH內(nèi)部結(jié)構(gòu)。
這個也沒有啥問題啊, 我們都知道IBIS buffer的樣子如下,這個在網(wǎng)絡(luò)上隨便google或者度娘,到處都是啊。
這些看起來都沒有什么問題,可是偏偏我們把這里的CPU(MCU)和風(fēng)扇放在一起就出問題了,看看下面這張示意圖,你也許會開始有feel:
我們從電源的上電順序開始:
1.插入12V電源,F(xiàn)an先開始運(yùn)轉(zhuǎn),注意此時DC-DC還沒有開始工作,也就是說VCC-3.3V還沒有產(chǎn)生;
2.由于風(fēng)扇的12V先上電,PWN/TACH信號線已經(jīng)有電了,于是通過圖中MCU的保護(hù)二極管(上管)對3.3V充電;
3.注意此時DC-DC仍然還沒有工作,但是3.3V已經(jīng)開始升壓,但是來源不是DC-DC Buck,而且來自Fan的I/O管腳漏過來的;
4.此時DC-DC電源開始工作,由于同步整流的電源BUCK都需要自舉,也就說我們通常所說的Bootstrap的電路,下管的MOSFET要先打開(關(guān)于電源部分我們后面再詳細(xì)敘述),產(chǎn)生的后果是把原先I/O漏過來的電壓拉到地;
5.Bootstrap電路開始工作后,DC-DC開始正式工作,從0開始產(chǎn)生VCC-3.3V。
于是我們就看了如上圖的波形, 圖中綠色的就是3.3V, 12V電源插入瞬間開始上升,然后在某一個時間,突然下降到0, 再重新上升到3.3V, 電源完成上電。
說到這, 有人開始問了,你不是討論I2C嗎? 怎么和我們討論起3.3V電源來了???別急別急, 事情都是慢慢明朗起來的。
如果此時你回去看最上面的第一張圖,那么你就發(fā)現(xiàn)圖中有一個I2C Expander,對了,問題就出自這里,通過我們從上面的討論,我們已經(jīng)知道, 3.3V的上電不是一帆風(fēng)順的,而是會有一個Spike,也就是一個倒鉤。如下面所示:
我再來給一張清晰一點(diǎn)圖,VCC每次上電都是先被12V-Fan I/O充電,然后跌落到地,在爬升會3.3V, 原因上面我已經(jīng)給出詳細(xì)的解釋,那么又有人問了,這個會有什么問題嗎?我先明確的回答,會出大問題。
我先來貼一段英文,我非常強(qiáng)烈建議大家平時工作中要養(yǎng)成讀英文論文的習(xí)慣,我倒不是崇洋媚外,老外那些大牛的文章,真的讓你覺得很精妙, 有時候自己翻譯成中文總覺得怪怪的,生怕曲解了大牛的原意,所以還是老老實(shí)實(shí)去讀原版文章,不要翻譯成中文。
If by any chance, the TACH pin is pulled or driven high while the Expander VCC is not applied (which should not be allowed during normal operation), the Expander could be powered up from the TACH pin through the connected internal diode between the pin and VCC. Such false power-up events do not ensure the required power supply to Expander the POR would not be ensured, and a lockup may occur.
Point和上面的英文意思差不多,就是I2C Expander(我們這里是CPU)被別的電路 通過I/O管腳商店了。我們先來把這顆粒I2C expander的內(nèi)部電路給畫一下, 我們看到這顆芯片沒有外部復(fù)位pin腳,所以一般內(nèi)部會有一個簡單設(shè)計(jì)的POR電路:
我們看到,當(dāng)3.3V VCC上電有倒鉤時,由于Fan通過TACH/PWM對I2C expander提前上電, 然后突然又倒回來, 在這個過程中有兩件事是不確定的:
The POR brings the Expander to a known working state (the default condition) by initializing the internal storage elements (flip-flops) and recognizing its connections (such as identifying the status of pins A1 and A0 as high or low, which is how the Expander slave address can be decided). Without the POR feature, the Expander may start up in a random state and thus may cause a lockup.
1.I2C expander是不是已經(jīng)上電成功了?我們不知道,因?yàn)?.3V上電到了半山腰又倒回來,此時芯片內(nèi)部的POR是不是對芯片完成內(nèi)部復(fù)位我們不清楚,不僅如此I2C expander有沒有準(zhǔn)確鎖定外部的strap pin腳的狀態(tài),我們也不清楚;
2.由于不能確定是否完成內(nèi)部存儲單元(觸發(fā)器)的初始化,I2X expander可能工作一個很random的狀態(tài),而不是我們需要的Idle狀態(tài)。
關(guān)于這個解釋,后來TI的工程師給出詳細(xì)的解釋, 英文我不就翻譯成中文了,請讀者仔細(xì)品味和理解:
The device has a 6 bit state machine (64 states) of which 49 valid state and 15 are invalid states. The above fix will work assuming the device comes up in a valid state. Typically on all our designs, an invalid state would lead to the idle state on the immediately next clock cycle. However, the PCF8575 is our very first I2C device and there are some invalid states that could latch the SDA line low indefinitely. The 9 clk cycle fix will not work if the device were to power up into an invalid state. The only way to bring the device out of this state is to provide a proper reset.
那我們說了那么多,究竟結(jié)果是怎么樣呢? 結(jié)果就是I2C expander產(chǎn)生了Lock up, I2C接口訪問不了,有時候還會拉住SCL或者SDA.
總結(jié)下來就是一句話:芯片需要POR電路來進(jìn)行復(fù)位,如果因?yàn)閯e的原因提前上電,導(dǎo)致POR工作不正常,那么就會有問題。
關(guān)于上面的現(xiàn)象還有另外一種解釋,就是當(dāng)VCC的倒鉤時,此時I2C Expander的內(nèi)部電路已經(jīng)被搞亂了, 但是有內(nèi)部POR的RC電路的平滑作用, 導(dǎo)致內(nèi)部Reset被濾平滑了,內(nèi)部Reset沒有碰到門限電壓,請仔細(xì)看上圖紅色的凹陷。
這樣導(dǎo)致芯片也不能正常復(fù)位,當(dāng)然也就不能正常工作了。請看大牛Howard Johnson的描述:
Howard Johnson : Power interruptions drive power-on-reset circuits crazy.. If a processor is involved, the dropout is long enough to make scrambled eggs of the processor’s internal state machines but not long enough to discharge the RC circuit. If the RC circuit doesn't discharge, ~RESET doesn't activate, and the processor spins out of control, powered on, but lost in space.