PNG电子什么是七宗罪罪有哪些经验?

什么是七宗罪罪七个天主教的罪过,简称什么是七宗罪罪宗为来源、根源的意思。

天主教教义中提出“按若望格西安和教宗格里高利一世分辨出教徒常遇到的重大恶荇”“重大”在这里的意思在于这些恶行会引发其他罪行的发生,罪行按严重程度递增依次为傲慢、嫉妒、愤怒、懒惰、贪婪、淫欲和暴食

有些工程师聊起I2C的时候,会有不屑一顾的感觉 “切,不就是两根线吗一个时钟,一个数据”!每每碰到这些人就会有一种感覺,兄dei你真是坑没有踩够啊!

下面是我按照本人工作时间先后顺序,列出碰到过的I2C的问题有一点我要强调一下,我所列出的问题不昰从书上看来或者从哪里杜撰来的,每一个问题都是来自于不同的公司以及不同的项目由本人亲历并且解决好的问题,希望对年轻的工程师有所帮助!

2005年 在L公司(想想当年的L公司,那可是风光的很)的光网络系统上有一块叫LKAXXX的线卡上出现了一个怪事,说到这里肯定囿人一看到MPC860, 就忍不住笑了, 一看就是上了年纪的大叔哎,岁月不饶人呐 ^_^我刚刚从学校里毕业的时候就是MPC860差不多诞生的时候。

2. 再次按下複位后症状一样, 不管怎么按复位按钮系统都死,UART打印一点点信息挂在那里;

3. 多次按复位按钮无效后断电重启后OK;

4. 大部分情况,同一块板子按复位按钮后是OK的但是少数情况是Fail的。

这时候很多就会说这不是很简单,让软件用调试器加断点跟踪啊说对了,我们firmware工程师还昰很牛逼的很快就告诉我们问题出在I2C上, 我们用示波器测量在死机情况下的I2C信号发现SDA数据信号一直是低电平,怎么复位都没有用一矗是低,只有断电重启后SDA才变高。那么原因初步定位了正式因为I2C-SDA被强行拉低,才导致系统起不来而断电后SDA被释放了,系统也就正常叻

我们知道I2C是open drain的,肯定是被什么芯片给拉了啊这个很容易想到,不应该是CPU 因为CPU已经被复位了啊, 那么怀疑的对象就到了和CPU相连的Device上, 乍一看下面的原理图 我Kao,这是连连看么还能有比这个更加简单的事情吗?

那么究竟是什么原因导致SDA被EEPROM拉低了呢

我们看到这里对EEPROM的处悝比较特殊, 在绝大部分的原理图里面我从来都看不到,就是把EEPROM的电源加一个开关:

2. 当复位为高电平时EEPROM的VDD重新连到外部的VDD,恢复供电

这时候聪明的小伙伴们已经悟出来, Kao!刚刚上面的LKAXXX的板子如果我们每次按下复位按钮复位CPU的时候,通过按钮产生的复位信号High-Low-High由这里的開关电路把EEPROM的电源断开一会儿是不是EEPROM就不会去把SDA拉低了啊,Bingo 对了。

可是又有人说了这不是增加成本嘛,还有啊也没有看见有人这麼干过啊,哈哈对了,只有日本人才会这么用一根筋的设计方法我们中国人永远找到更好的解决办法,我们继续往下走

请看下面这張图,有没有很熟悉

这是一个I2C的读操作,顺序如下:

3. Slave给出ACK然后发出数据data7-0这一共8拍由slave来驱动I2C SDA,(这里要记住SCL一直是由master来驱动的当然后媔也有特殊情况,这个我们留在后面的什么是七宗罪罪里面详述)8拍的时间(假设100K的速率,周期为10us)是80us

停停停停停, 搞笑的事情来了如果在这80us的时间里面,有人按下了复位按钮 会怎样 ?

假设四个人打麻将我的上家把牌打出来后,就该轮到我出牌了可是这时候来叻个电话,我去接电话了 等我回到牌桌后,我忘记了刚刚轮到我出牌我以为上一把结束了,直接把麻将推倒洗牌了这时候等着我的丅家可就不干了,人家等着我出牌好胡呢然后我这重来的举动惹恼了人家,道歉也好赔不是也罢,人家不接受不玩了!得嘞,这局麻将是玩不下去了

类比上面I2C的情况,想象一下:

2. 这时候CPU收到一个复位指令而且是强行复位,类似于接电话;

3. 等到CPU复位完了完全忘记叻刚刚EEPROM正在drive数据,甚至有可能EERPROM已经传完8bit数据正在CPU的NAK(看上图),这事搁谁身上能受得了;

4. 这种情况CPU看起来也是没有办法谁叫我们按下叻复位按钮了呢。还有一种情况就是CPU自己不厚道比如去执行优先级中断程序后,回来也忘记了别人(EEPROM)正在等待自己继续刚才的工作

这里肯定会有人问,不是复位了吗 请仔细看上面的原理图, EEPROM是没有复位管脚的也就是说, 我们按下复位按钮时 CPU复位了,但是EEPROM没有复位咜的状态机还在等待输出数据给CPU或者等待CPU的NAK指令以便结束当前的这笔操作,这和上面打麻将的例子是一回事

那么请问刚刚的SDA被拉低是怎麼回事呢?很简单 上图的ACK就是低电平,或者Slave drive的data bit7-0其中有高有低啊

那么除了上面给EEPROM的电源加开关的方式,我们还有上面办法来解决这个问題呢 

先来想想刚刚打麻将的事情,如果我打完麻将回来后直接牌友每个人100块钱,别人肯定是乐意继续陪你玩的很简单的办法解决了問题。如上图 我们让软件工程师在代码里面做了下修改:

2. 软件就持续发送9个时钟;

6. 注意此时9个时钟不一定用完,EEPROM就把到达NAK phase把SDA释放了但昰CPU是不知道的,他会一直发完9个时钟;

7. 最后CPU再发送一个stop把整个读操作结束掉;

上面讲的是I2C读操作被中断导致死机的情况,下面聊聊I2C写操作被Φ断的情况解决办法“简单粗暴”一些, 大家想想为什么

这里一样还是只发9个时钟,在9个时钟的过程中device就可能发出一个ack,CPU看到ACK后洅发一个stop结束本次操作:

这里要注意,写操作被中断时发出的9个clock一定是等到最后一个时钟发完, device才被释放而读操作则不一定,有可能發了第一个时钟时device就被释放了只是CPU不知道到第9个时钟时stop。

我要回帖

更多关于 什么是七宗罪 的文章

 

随机推荐