[讨论] 被坑记—使用I2C需注意时钟方向

qiushenghua   2015-3-11 18:02 楼主
先说背景,公司某产品需要对I2C接口进行隔离,板子空间有限,不方便自己搭建光耦电路,于是到处查找既有的成品方案。

最终,在TI网站上看到了ISO1540/ISO1541系列电容式隔离芯片。

1-1.png
从Datasheet中看出,ISO1541的时钟线是单向传输,数据线是双向传输的,ISO1540则数据与时钟线都是双向传输的。

并且,Datasheet建议,ISO1541 在具有一个单主器件的应用中非常实用,而 ISO1540 非常适合于多主器件应用。(sllseb6b)

而应用系统只有一个主机,从这个角度看来,ISO1541足以应付需求了。但是,PCB制板焊接之后主机怎么都收不到正确数据。去掉IC将SDA和SCL分别短接,数据正常。

检查电源供电、上拉电阻(不清楚主机从机内部是否已经有上拉电阻),排查了好久一直没有结果。

直到今天,用逻辑分析仪分别读取了主从端的时钟、数据信号,大吃一惊,才发现我完全被TI的资料所误导了,完全就不应该使用ISO1541这颗料,或者说,TI完全就不应该设计生产这一颗物料。

先上图片

1-2.png

纳尼?经过逻辑分析仪分析,为什么主机端和从机端的数据是不一样的?(看自动分析数据,0x3F之后一个是NACK,一个是ACK)

仔细分析,主从两侧SDA信号基本一致,有略微的延时,属于正常现象。但是SCL信号就相差比较大了。

什么?图片太小看不清楚?那么我们把局部放大来看:

1-3.png

时钟信号这里出现了异常,作为一颗隔离芯片,应该忠实将主从两侧的波形搬运到对侧才是,这里出现了分歧,那一定是哪里出问题了。

仔细看,在红框中上半部分是主机侧的时钟,下半部分是从机侧的时钟。这里从机侧一直是低电平,但是主机侧时钟还在继续走。

我们知道I2C协议中,两条线都是OD门,这样无论主设备还是从设备都能通过拉低时钟信号暂时阻断数据的传输。图中从机将SCL拉低了,明显是没有准备好数据传输。但是由于ISO1541的SCL是单向传输的,这个信号没能传到主机侧去,主机侧的SCL还在继续跑。等待从机侧准备好数据传输时,主机已经在发送其他数据了。

也正因为如此,从机侧发送的数据不能正确到达主机侧,从而导致了通信的失败。

解决办法:将隔离芯片更换为ISO1540或者降低主机时钟频率。

经验教训:这个问题本不应该出现的,主要是在选型的时候太想当然了,也太相信TI的描述了。严格意义上说,ISO1541这颗物料就不应该存在,它违反了I2C协议的规范。同时TI在资料的编写上也做得也不够,对于ISO1541的准确描述应该是ISO1541 在具有一个单主器件的低速主机高速从机应用中非常实用”

大伙在使用这一颗物料的时候一定要慎重,如果经费宽裕的话还是尽量选择ISO1540吧!

回复评论 (36)

2推荐 仙猫 

引用: qiushenghua 发表于 2015-3-18 18:05 …… 总结一下,双向的SCL线能保障I2C通信是以主从双方能够接受的最大速率进行数据传输。你举例的I2C型存储器由于从机速率比主机快,所以他们能接受的最大通信速率就是主机的时钟频率,而本例中从机响应速率不及主机,所以从机拉低时钟线暂停数据传输是必要的。
细看了下几种器件手册对I2C接口的描述,规程上确实允许从机利用SCL拖住主机的做法。这是个以前一直没深究过的地方,讨论后清晰了不少,Thx! 查的器件有MCU、存储器、传感器、I/O扩张芯片等,发现只有MCU有能力这么做,它可主可从,作为从时也能用软件保持住SCL线的低电平。其他器件则不行,SCL干脆就是个纯输入。 也许没有软件的Device没这必要吧,因为I2C标准的100k或400k速率对硬件来说根本不算回事,不可能发生来不及处理的问题,只要把本器件所能处理的最高速率标明于手册,编主机程序的人别犯规就行了。 把SCL的Stretch功能用好用活了,可望将I2C的通信能力充分发挥,不用它呢,自己在上层协议里加点零碎也行,好比TCP和UDP,看你取舍哪一头了。 本帖最后由 仙猫 于 2015-3-18 19:40 编辑
点赞  2015-3-18 19:37
只看见“ 在具有一个单主器件的应用中非常实用”这句,却没有仔细看延迟时间这个参数。
自己用得不对,还要怪TI公司误导?
点赞  2015-3-11 19:01
没用过这个器件。

多数公司对定型的产品,都不会轻易地使用新器件来替换的。

在使用新的器件时,肯定会出现好多问题需要解决。

TI的器件资料相对还算可以。有时候出点问题也是可能的。有些公司出的东西比它更差的多得很。不管怎样,自己要小心。
点赞  2015-3-11 19:02
不过TI 的资料,中文资料确实做到不好,,,
ST的stm32,包括ADI公司做的就好


点赞  2015-3-11 19:18
注意看手册上的参数啊
点赞  2015-3-11 19:32
“害人不浅”…… 有这么严重吗?
多数情况下是单一主机,用单向SCL就够了,这时即使从机未准备好主机也是不知道的,主机应给从机留出足够的上电时间。而且每次访问从SDA线上可确认从机是否正常反应,如果需要的话。
点赞  2015-3-11 19:46
学习一楼主的经验,下次有用到的话也注意看一下各项参数
点赞  2015-3-11 20:42
完全不是延迟时间的问题好不!延迟时间体现在从机侧的时钟上升沿落后于主机侧的时钟上升沿。
并且,延迟时间只对高速设备有较大影响,我这是低速设备,延迟时间对于本案例没有任何影响。

刚刚我又把英文版的datasheet翻了一遍,没有看到任何低速从机设备使用ISO1541的警告。

这个问题根源出在芯片违反了I2C协议,资料固然写了这点,单向传输时钟就是了。是我没有留意到,没有想到单一的主从设备间通信时钟线也不是单向传输的,当然有责任。

但是,作为一个针对I2C协议设计的隔离芯片,有义务对这样违反协议的做法可能带来的风险作出警示性的说明。从这个角度看,说资料误导一点也不为过,单一主机和单一外设,让你从1541和1540两个里面选择,相信你也会选择成本较低的那个,也就是1541。

问题根源在于,从机在不能跟上通信速率的时候会主动拉低时钟线,而芯片是单向传输时钟信号的,阻断了主机对从机状态的判断,从而导致通信失败。
资料里在关于两个型号如何选择的问题上只提到主机数目,而这是远远不够的。对于一个想用TI芯片作为快速解决方案的用户来说,他是没有足够时间去分析原因的,结果就是方案莫名其妙不可用。
点赞  2015-3-11 20:51
引用: 仙猫 发表于 2015-3-11 19:46
“害人不浅”…… 有这么严重吗?
多数情况下是单一主机,用单向SCL就够了,这时即使从机未准备好主机也是不知道的,主机应给从机留出足够的上电时间。而且每次访问从SDA线上可确认从机是否正常反应,如果需要的话。

“害人不浅”确实有点夸张,现在的情况是,主从设备都不是我做的,我只做系统集成,目前从机的接口是外露的触点,所以我需要想办法把主机和从机隔离开来,保护主机设备。

并且这不是上电时间不够的问题,而是从机响应ACK/NACK信号的时候主机给它留的时间不足,这是我没有预料到的情况。从机拉低时钟判断是否自己该响应,而主机在自顾自的继续发送数据。对于这样的情况,不管主机重试多少次,都无法解决这个问题。作为一个你不能控制的设备,在使用了隔离芯片之后不管怎么都收不到正常的数据,直接连却正常,那么你就只能暂时不用隔离咯~~

其实发这个帖子的目的在于提醒一下各位,不论有多少个主机和多少个从机设备,I2C的时钟和数据都不是单向传输的,这点一定要注意,不然可能会遇到各种意想不到的问题。大家在写软件模拟I2C的时候也要注意一下这个问题。

吐槽TI的资料只是顺便,大家无视就好了。
点赞  2015-3-11 21:16
多谢楼主
点赞  2015-3-11 23:21
吐槽一下,讨厌反人类的iic
点赞  2015-3-11 23:22
ADI的隔离貌似不错。
尽力而为!
点赞  2015-3-12 00:45
选型的问题吧,跑协议的磁性隔离会不会好些
点赞  2015-3-12 09:10
没用过TI的这款,以前使用过ADUM1250,2个双向通道的,总线上挂了2个ADC 1个DAC 1个IO,总共4个I2C器件,用起来妥妥的
如果天空是黑暗的,那就摸黑生存;如果发出声音是危险的,那就保持沉默...但不要习惯了黑暗就为黑暗辩护;不要为自己的苟且而得意;不要嘲讽那些比自己更勇敢热情的人们。人可以卑微如尘土,不可扭曲如蛆虫。
点赞  2015-3-12 10:02
TI的隔离器件做的是不怎么好;
不过资料问题,就不能怪TI了;
点赞  2015-3-15 16:50
引用: qiushenghua 发表于 2015-3-11 21:16
“害人不浅”确实有点夸张,现在的情况是……
不只是“有点夸张”,而是夸张大了去了。
有两种芯片,用单向不用双向是你自己选的;主从机虽不是你做,但集成选型责任所在,人家TI招你惹你什么了,在专业论坛上天天要背个“被坑记——TI隔离芯片害人不浅”的黑锅?
俺对广告不感冒,甚至抵触,但拿这么句话做主题,显然对人家不公平。

为什么说起“黑锅”,是因为想起俺曾在某坛帮人出了个小电路的主意,被路过的捡了去用——这也就罢了,但尴尬的是,那位自己接错了电路却来怪俺,开一新帖标题大呼:“仙猫,进来下。你画的5V过压保护电路,无法正常工作。”
而且这帖从开帖到最后回复,前后被翻炒了5年之久(2010.11~2014.12),尽管早就发现电路接错改好了,俺却背了5年的标题黑锅,仿佛在给人出馊主意……


点赞  2015-3-17 23:48
楼主经验分析,虽标题有些夸张,但事确实是个事,而且楼主分享了查找解决问题的方法,非常不错!
点赞  2015-3-18 00:04
引用: 仙猫 发表于 2015-3-17 23:48
不只是“有点夸张”,而是夸张大了去了。
有两种芯片,用单向不用双向是你自己选的;主从机虽不是你做,但集成选型责任所在,人家TI招你惹你什么了,在专业论坛上天天要背个“被坑记——TI隔离芯片害人不浅”的黑锅?
俺对广告不感冒,甚至抵触,但拿这么句话做主题,显然对人家不公平。

为什么说起“黑锅”,是因为想起俺曾在某坛帮人出了个小电路的主意,被路过的捡了去用——这也就罢了,但尴尬的是,那位自己接错了电路却来怪俺,开一新帖标题大呼:“仙猫,进来下。你画的5V过压保护电路,无法正常工作。”
而且这帖从开帖到最后回复,前后被翻炒了5年之久(2010.11~2014.12),尽管早就发现电路接错改好了,俺却背了5年的标题黑锅,仿佛在给人出馊主意……



好吧,为了不让TI继续背黑锅,刚刚PM管理员申请修改帖子标题了,新标题是“被坑记—使用I2C需注意时钟方向”,估计白天就能看到了。


但是不可否认,TI在资料方面确实做得不够,有误导人的嫌疑。原标题的目的有很大程度上是想敦促TI尽快修改资料,尽到提醒的义务,I2C的时钟不仅仅是由主机在控制,从机也有时钟线的控制权,故单主机系统也应该选择使用双向时钟的芯片,而这一点正是大家容易忽略的。



另外一个目的就是想和大家讨论一下单向时钟的I2C隔离芯片到底有没有存在的必要。




还有,这帖子I2C是数字电路,但是隔离芯片属于模拟芯片?到底应该放在那个板块合适?
点赞  2015-3-18 02:35
引用: qiushenghua 发表于 2015-3-18 02:35
好吧,为了不让TI继续背黑锅,刚刚PM管理员申请修改帖子标题了,新标题是“被坑记—使用I2C需注意时钟方向”,估计白天就能看到了。
但是不可否认,TI在资料方面确实做得不够,有误导人的嫌疑。原标题的目的有很大程度上是想敦促TI尽快修改资料,尽到提醒的义务,I2C的时钟不仅仅是由主机在控制,从机也有时钟线的控制权,故单主机系统也应该选择使用双向时钟的芯片,而这一点正是大家容易忽略的。
另外一个目的就是想和大家讨论一下单向时钟的I2C隔离芯片到底有没有存在的必要。
还有,这帖子I2C是数字电路,但是隔离芯片属于模拟芯片?到底应该放在那个板块合适?
关于单向SCL芯片的必要性说两点:
① 单向SCL芯片存在的必要性是明确的,事实上在一般应用中单主机构成占绝对多数,很多只能作从机用的Device(比如I²C型存储器,I/O扩展器等)芯片,SCL引脚本来就是单向的,为此有一颗廉价芯片,其量产效果会是显著的。
② 这点俺没搞清(如通过这次搞清了则是参与讨论的最大收获),一直认为规程上从机不会也没必要主动拉死SCL,因为从机可在SDA线上利用回复主机的ACK/NAL之际表明自己的状态。若确实如此,则该怀疑集成系统里的从机程序有没问题了——这里又可想象两种情况:
②-1 因从机编程的疏忽,使得SCL有瞬间输出给主机造成了干扰。(比如MCU初始化I/O时先设为输出,再给初始值的毛糙做法并不鲜见。)
②-2 该从机是智能型的,上电后若发现没其他主机,自己就华丽转身变为主机。——如是这样,SCL就必须双向了,双向SCL本来就是为多主机而存在的。

点赞  2015-3-18 09:28
引用: 仙猫 发表于 2015-3-18 09:28 关于单向SCL芯片的必要性说两点: ① 单向SCL芯片存在的必要性是明确的,事实上在一般应用中单主机构成占绝对多数,很多只能作从机用的Device(比如I2C型存储器,I/O扩展器等)芯片,SCL引脚本来就是单向的,为此有一颗廉价芯片,其量产效果会是显著的。 ② 这点俺没搞清(如通过这次搞清了则是参与讨论的最大收获),一直认为规程上从机不会也没必要主动拉死SCL,因为从机可在SDA线上利用回复主机的ACK/NAL之际表明自己的状态。若确实如此,则该怀疑集成系统里的从机程序有没问题了——这里又可想象两种情况: ②-1 因从机编程的疏忽,使得SCL有瞬间输出给主机造成了干扰。(比如MCU初始化I/O时先设为输出,再给初始值的毛糙做法并不鲜见。) ②-2 该从机是智能型的,上电后若发现没其他主机,自己就华丽转身变为主机。——如是这样,SCL就必须双向了,双向SCL本来就是为多主机而存在的。
从机可在SDA线上利用回复主机的ACK/NAL之际表明自己的状态。 ——若从机主频很低,在主机拉高时钟之前来不及响应ACK/NACK,那么通信就会被中断。 举例来说,先假设SCL是单向的,我们知道在I2C通信时从机要先响应地址,一般会在接受完整个地址后判断是否与本机一致,是否响应通信请求。 假如主机刚发送完从机地址,此时主机需要释放SCL,采样ACK、NACK信号。如果此时时钟线为高电平,那么同时数据线的内容就作为ACK/NACK信号。 如果我们使用的是一个低速的从机设备,那么在主机拉高SCL线的时候从机实际上很有可能并未完成对Slave地址的判断。如果是双向时钟,那么从机可以通过拉低时钟线阻止主机的采样ACK/NACK。如果是单向时钟,那么即使Slave地址与本机一致,主机采样到的也会是NACK信号(从机来不及拉低SDA线),那么从机会响应后面的时钟序列发送数据(它以为自己发的是ACK),主机却不知道收到什么样的数据(开始发送下一次通信的slave地址)。 总结一下,双向的SCL线能保障I2C通信是以主从双方能够接受的最大速率进行数据传输。你举例的I2C型存储器由于从机速率比主机快,所以他们能接受的最大通信速率就是主机的时钟频率,而本例中从机响应速率不及主机,所以从机拉低时钟线暂停数据传输是必要的。 很多人在写I2C程序的时候模仿UART的程序,严格按照固定时钟间隙来采样或者翻转SCL线。这实际上并不符合I2C通信的设计原理。I2C通信主机不能自顾自的发送信号或者读取信号,还需要实时关注总线上的电平是不是达到了自己的设定值。等会我分享一段之前用状态机写的I2C通信函数,供大家参考。 本帖最后由 qiushenghua 于 2015-3-18 18:15 编辑
点赞  2015-3-18 18:05
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复