前面说的“I2C七宗罪之第一罪”和复位有关系, 这一次我们来说说:
I2C和电源的关系
提到电源大家的心理通常是紧张滴,不自觉地发问:是不是问题很严重?是的, 非常严重, 而且通过软件是没有办法解决的。我们先来看下面这张简图:
1.系统有风扇,12V供电;
2.Fan和CPU之间有转速检测TACH和转速控制PWM信号;
3.CPU左边有一个颗I2C EXPANDER,用来做GPIO扩展的;
4.DC-DC产生VCC-3.3V分别供给CPU和I2C Expander。
乍一看,也没啥问题啊!俗话说得好,平静的水面下暗流涌动啊,我先来给大家一点点提示,看看谁能先猜到问题所在,我们来看看CPU PWM/TACH内部结构。
这个也没有啥问题啊, 我们都知道IBIS buffer的样子如下,这个在网络上随便google或者度娘,到处都是啊。
这些看起来都没有什么问题,可是偏偏我们把这里的CPU(MCU)和风扇放在一起就出问题了,看看下面这张示意图,你也许会开始有feel:
我们从电源的上电顺序开始:
1.插入12V电源,Fan先开始运转,注意此时DC-DC还没有开始工作,也就是说VCC-3.3V还没有产生;
2.由于风扇的12V先上电,PWN/TACH信号线已经有电了,于是通过图中MCU的保护二极管(上管)对3.3V充电;
3.注意此时DC-DC仍然还没有工作,但是3.3V已经开始升压,但是来源不是DC-DC Buck,而且来自Fan的I/O管脚漏过来的;
4.此时DC-DC电源开始工作,由于同步整流的电源BUCK都需要自举,也就说我们通常所说的Bootstrap的电路,下管的MOSFET要先打开(关于电源部分我们后面再详细叙述),产生的后果是把原先I/O漏过来的电压拉到地;
5.Bootstrap电路开始工作后,DC-DC开始正式工作,从0开始产生VCC-3.3V。
于是我们就看了如上图的波形, 图中绿色的就是3.3V, 12V电源插入瞬间开始上升,然后在某一个时间,突然下降到0, 再重新上升到3.3V, 电源完成上电。
说到这, 有人开始问了,你不是讨论I2C吗? 怎么和我们讨论起3.3V电源来了啊?别急别急, 事情都是慢慢明朗起来的。
如果此时你回去看最上面的第一张图,那么你就发现图中有一个I2C Expander,对了,问题就出自这里,通过我们从上面的讨论,我们已经知道, 3.3V的上电不是一帆风顺的,而是会有一个Spike,也就是一个倒钩。如下面所示:
我再来给一张清晰一点图,VCC每次上电都是先被12V-Fan I/O充电,然后跌落到地,在爬升会3.3V, 原因上面我已经给出详细的解释,那么又有人问了,这个会有什么问题吗?我先明确的回答,会出大问题。
我先来贴一段英文,我非常强烈建议大家平时工作中要养成读英文论文的习惯,我倒不是崇洋媚外,老外那些大牛的文章,真的让你觉得很精妙, 有时候自己翻译成中文总觉得怪怪的,生怕曲解了大牛的原意,所以还是老老实实去读原版文章,不要翻译成中文。
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的内部电路给画一下, 我们看到这颗芯片没有外部复位pin脚,所以一般内部会有一个简单设计的POR电路:
我们看到,当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是不是已经上电成功了?我们不知道,因为3.3V上电到了半山腰又倒回来,此时芯片内部的POR是不是对芯片完成内部复位我们不清楚,不仅如此I2C expander有没有准确锁定外部的strap pin脚的状态,我们也不清楚;
2.由于不能确定是否完成内部存储单元(触发器)的初始化,I2X expander可能工作一个很random的状态,而不是我们需要的Idle状态。
关于这个解释,后来TI的工程师给出详细的解释, 英文我不就翻译成中文了,请读者仔细品味和理解:
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.
那我们说了那么多,究竟结果是怎么样呢? 结果就是I2C expander产生了Lock up, I2C接口访问不了,有时候还会拉住SCL或者SDA.
总结下来就是一句话:芯片需要POR电路来进行复位,如果因为别的原因提前上电,导致POR工作不正常,那么就会有问题。
关于上面的现象还有另外一种解释,就是当VCC的倒钩时,此时I2C Expander的内部电路已经被搞乱了, 但是有内部POR的RC电路的平滑作用, 导致内部Reset被滤平滑了,内部Reset没有碰到门限电压,请仔细看上图红色的凹陷。
这样导致芯片也不能正常复位,当然也就不能正常工作了。请看大牛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.