0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C七宗罪之第一罪

h1654155971.8456 来源:lq 2018-11-30 15:51 次阅读

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

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

I2C第一罪

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

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

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

先来描述一下问题:

1.经常当有人按下Resetbutton后发现系统起不来了,UART console打印了一半就死在那里;

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

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

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

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

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

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

我们再来看一张图:

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

1.当复位为低电平时,EEPROM的VDD连到低,断电;

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

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

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

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

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

1.Master发出start;

2.Master发出地址和读命令;

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

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

举个“栗子”

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

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

1.80us的时候 EEPROM Slave正在配合CPU输出读的数据,人家玩得正high呢;

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

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

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

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

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

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

我们继续看图:

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

1.当检测到SDA被拉低后;

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

3.在发9个clock的过程中SDA会变高变低;

4.当Device发完所有数据后,SDA被释放;

5.此时状态机到达NAK的phase时,SDA释放变高,产生了一个NAK;

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

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

The 9 clock pulses make the hanging device’s state machine move to the next state after each clock pulse while the SDA released (not pulled down) which will cause a NACK when the state machine will move to the ACK phase. The NACK will force the device to go to idle mode(意思和我上面的步骤一样)。

1.Mastertriestoassertalogic 1 on the SDA line;

2.Master still see a logic 0 and then generate a clock pulse on SCL;

3.When device come to NAK phase, then master will generate SDA high which;is a NAK, but master does not know, until master send all the 9 clocks;

4.Master Generate a stop condition。

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

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

1.Mastertriestoassertalogic 1 on the SDA line;

2.Master still see a logic 0 and then generate 9 clock pulse on SCL;

3.Generate a stop condition。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 示波器
    +关注

    关注

    113

    文章

    6268

    浏览量

    185401
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10882

    浏览量

    212258
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1490

    浏览量

    124054

原文标题:I2C七宗罪之第一罪

文章出处:【微信号:eda365wx,微信公众号:EDA365电子论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    生成式AI的「七宗罪」!

    面对生成式AI日渐增长的「罪恶」,我们该如何解决问题?
    的头像 发表于 05-07 16:34 1784次阅读
    生成式AI的「<b class='flag-5'>七宗罪</b>」!

    i2c总线ppt(I2C总线器件应用)

    I2C总线器件应用第一I2C总线器件应用概述I2C总线工作原理I2C总线系统结构I2C总线系
    发表于 08-13 17:34 0次下载

    I2C Guid I2C指南

    I2C Guid  I2C指南 The I2C bus is used in a wide rangeof applications because it is simpleand
    发表于 04-23 13:55 36次下载

    选购低价笔记本:不得不说的五

    选购低价笔记本:不得不说的五些人对低价机的性能和质量将信将疑时,另有部分人对低价笔记本产生了种过度的狂热
    发表于 01-21 10:14 359次阅读

    Proteus程序AMP应用I2C

    Proteus程序AMP应用I2C,好东西,喜欢的朋友可以下载来学习。
    发表于 01-18 17:42 6次下载

    i2c

    单片机i2c总线操作;单片机i2c总线操作;单片机i2c总线操作;
    发表于 05-17 11:09 35次下载

    从滴滴的七宗罪细数到七十

    十一黄金周,豆瓣小组里冒出了个帖子:“有点怀念顺风车了”,点开是句“会被喷吗?” “水军洗地的滚吧。”这是点赞量最高的评论,意料之中,经过两次风波,很多人对“滴滴”两个字产生条件反射般的偏激
    发表于 03-11 13:39 1781次阅读

    分享编程的七宗罪,也许对你会有所启发

    我不知道为什么,身边总有些人,使用很短 / 随机的名称来给变量命名。当你的项目只有 10-20 行代码,或者只是代码片段时,你可以使用这种方式进行命名,但是在大项目中,不要这么做。不合适的命名,对可读性和效率有致命的影响。
    的头像 发表于 02-20 09:05 1654次阅读

    人工智能也有歧视和偏见

    在大多数科幻电影里,冷漠又残酷是 AI 的典型形象,它们从来不会考虑什么是人情世故,既没有人性光辉的闪耀,也没有人性堕落的七宗罪
    发表于 06-13 16:25 643次阅读

    STM32学习I2C协议(读写EEPROM)

    关于STM32学习分享第I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.i2c.c2.i2c.h3.main.c总结前言开始!开始!单片机的I2C协议
    发表于 11-30 15:21 32次下载
    STM32学习<b class='flag-5'>之</b><b class='flag-5'>I2C</b>协议(读写EEPROM)

    对不起!我还是坚持把I2C肝完了

    废话I2C其实肝的我挺难受的,通讯协议这种规范往往可以抠出很多的细节,看了波叔的文章《万变不离其I2C总线要点总结》,很详细。我打赌我还不会I2
    发表于 12-14 19:08 11次下载
    对不起!我还是坚持把<b class='flag-5'>I2C</b>肝完了

    硬件I2C与模拟I2C

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C
    发表于 12-28 19:14 81次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    ESP32 ESP-IDF 教学(六)——I2C数据总线(I²C

    ESP32 ESP-IDF 学习笔记(六)【I2C数据总线(I²C)】文章目录ESP32 ESP-IDF 学习笔记(六)【
    发表于 12-28 19:25 22次下载
    ESP32 <b class='flag-5'>之</b> ESP-IDF 教学(六)——<b class='flag-5'>I2C</b>数据总线(<b class='flag-5'>I</b>²<b class='flag-5'>C</b>)

    万变不离其I2C总线要点总结

    前文总结了单片机串口个人认为值得注意的些要点,本文来梳理I2C 总线的些要点。这个题目有点大,本文对于 I2C 其实很多地方也..
    发表于 01-26 17:47 1次下载
    万变不离其<b class='flag-5'>宗</b><b class='flag-5'>之</b><b class='flag-5'>I2C</b>总线要点总结

    I2C扫描仪如何在Arduino上查找I2C地址

    电子发烧友网站提供《I2C扫描仪如何在Arduino上查找I2C地址.zip》资料免费下载
    发表于 01-31 10:19 2次下载
    <b class='flag-5'>I2C</b>扫描仪<b class='flag-5'>之</b>如何在Arduino上查找<b class='flag-5'>I2C</b>地址