先说背景,公司某产品需要对I2C接口进行隔离,板子空间有限,不方便自己搭建光耦电路,于是到处查找既有的成品方案。
最终,在TI网站上看到了ISO1540/ISO1541系列电容式隔离芯片。
从Datasheet中看出,ISO1541的时钟线是单向传输,数据线是双向传输的,ISO1540则数据与时钟线都是双向传输的。
并且,Datasheet建议,ISO1541 在具有一个单主器件的应用中非常实用,而 ISO1540 非常适合于多主器件应用。(sllseb6b)
而应用系统只有一个主机,从这个角度看来,ISO1541足以应付需求了。但是,PCB制板焊接之后主机怎么都收不到正确数据。去掉IC将SDA和SCL分别短接,数据正常。
检查电源供电、上拉电阻(不清楚主机从机内部是否已经有上拉电阻),排查了好久一直没有结果。
直到今天,用逻辑分析仪分别读取了主从端的时钟、数据信号,大吃一惊,才发现我完全被TI的资料所误导了,完全就不应该使用ISO1541这颗料,或者说,TI完全就不应该设计生产这一颗物料。
先上图片
纳尼?经过逻辑分析仪分析,为什么主机端和从机端的数据是不一样的?(看自动分析数据,0x3F之后一个是NACK,一个是ACK)
仔细分析,主从两侧SDA信号基本一致,有略微的延时,属于正常现象。但是SCL信号就相差比较大了。
什么?图片太小看不清楚?那么我们把局部放大来看:
时钟信号这里出现了异常,作为一颗隔离芯片,应该忠实将主从两侧的波形搬运到对侧才是,这里出现了分歧,那一定是哪里出问题了。
仔细看,在红框中上半部分是主机侧的时钟,下半部分是从机侧的时钟。这里从机侧一直是低电平,但是主机侧时钟还在继续走。
我们知道I2C协议中,两条线都是OD门,这样无论主设备还是从设备都能通过拉低时钟信号暂时阻断数据的传输。图中从机将SCL拉低了,明显是没有准备好数据传输。但是由于ISO1541的SCL是单向传输的,这个信号没能传到主机侧去,主机侧的SCL还在继续跑。等待从机侧准备好数据传输时,主机已经在发送其他数据了。
也正因为如此,从机侧发送的数据不能正确到达主机侧,从而导致了通信的失败。
解决办法:将隔离芯片更换为ISO1540或者降低主机时钟频率。
经验教训:这个问题本不应该出现的,主要是在选型的时候太想当然了,也太相信TI的描述了。严格意义上说,ISO1541这颗物料就不应该存在,它违反了I2C协议的规范。同时TI在资料的编写上也做得也不够,对于ISO1541的准确描述应该是
“ISO1541 在具有一个单主器件的低速主机高速从机应用中非常实用”。
大伙在使用这一颗物料的时候一定要慎重,如果经费宽裕的话还是尽量选择ISO1540吧!