I2C仅在探查或加载1Mohm时工作


9

我正在尝试对Msp430fr5847(主机)和具有未知I2C芯片的从属传感器(工业传感器的一部分)之间的通信进行故障排除

我遇到了一批新传感器,其中我的数据全为零返回,但是当尝试使用我的Saleae逻辑专业版(2Mohm,10pf)或示波器(10Mohm,50pf)进行故障排除时,该系统在探测时可以正常工作SDA引脚。

如果在SDA与地面之间添加一个1Mohm的电阻,则该电路可以正常工作,但如果仅添加一个10pf或100pf的电容器,则该电路无法正常工作。

我正在使用4.7k上拉电阻连接到3.3v电源轨。

是什么可能导致此问题,以及在不无意间解决问题的情况下可以进行故障排除。


编辑:19/07/2017这是我的信号的快速范围跟踪。

我忘记提及的其他事情是,仅探测SDA会使电路板工作,探测SCL或我的中断线不能使其正常工作。

SDA和SCL的范围跟踪


编辑:21/07/2017

该图变厚了,看来连接不同的示波器无法使电路正常工作,并且可以看出,唯一的区别是未发送ACK。

新范围图片

在上图中,电路未正确运行时,蓝色和绿色迹线是SCL和SDA。黄色和粉红色迹线来自于我也将我的Saleae逻辑连接到SDA引脚并接地但没有插入USB的情况(试图避免接地回路)。

为了给传感器增加更多背景信息,这是我们从制造商那里购买的工业压力传感器。我们之前已经使用第一批传感器设计和测试了这些PCB。我们最近收到了一批新货,现在遇到了这些问题。我已经做了一些调查,我强烈怀疑内部的传感器采用ZSC31014或类似,PDF数据表(从数据表中使用Google独特的寻找后的句子)HERE


编辑:26/07/2017

因此,希望按照SamGibson的详细回答解决问题的最后一部分,我已经实现了将地址的高位设置为掩盖起始位末尾毛刺的解决方案。

这在大多数情况下都可以按预期方式处理数据,但是现在看来,在写入后的第一个读取命令中(如果这是一组i2c位的正确术语),从机将尝试提前ACK(在写位的位置)。我可以说是从机通过添加一个与SDA线串联的小电阻(47欧姆)将线拉低。

我通常会以一个新问题开始,但是当我附加在上面的疑难解答中没有作用的相同作用域时,这个问题似乎消失了,即使我附加了作用域探针,这似乎也确实是一个边界问题,没有将其连接到示波器的问题得到解决,所以我假设这是一个电容问题。

没有附加范围的问题图

没有范围的情节

示波器探头已连接但未连接到示波器的问题图,注意从机下拉写位而不是ACK位时电压略高。

附带范围


1
您是否有任何范围的痕迹
凯文·怀特

1
您是否无意中倒置了时钟信号?
安迪(aka Andy)

6
确认I2C总线具有并正在使用一条公共接地线(MSP至I2C传感器)。需要3条线:SDA,SCL和GND,SDA和SCL通过上拉电阻上拉至Vcc(可能是第4条线)。
克里斯·克努森

1
@Hugoagogo-kes!SDA和SCL都异常,以不同的方式。我认为痕迹是新的故障的传感器?如果是这样,您能否提供旧的工作传感器的轨迹?也许差异可能不会太大,例如您之前遇到过问题,但这只是起作用。更多背景信息可能会揭示有用的数据,例如,考虑到芯片是“未知”的,您如何得知它们是“新” I2C芯片?我猜想已经进行了一些逆向工程,以使MSP430(由您控制​​?)可以与传感器(不受控制?)一起使用。与“原始”配置有何不同?
SamGibson

1
好吧,我同意萨姆·吉布森。我不会很快说尖峰是测量误差。我认为,如果它们来自您的测量设置,或者您找到存在它们的原因,则应该尝试进一步研究并消除它们。毕竟,它们似乎与SCL的下降沿对齐。我还将尝试将传感器直接连接到PCB上。这可以帮助您排除问题是由电缆或传感器与主板的距离引起的。
nickagian

Answers:


11

我找到了答案。事实证明,这是一个已知问题,但是我在确定问题所在并进行搜索后才发现!

这是我经历的过程,因此您可以遵循它(并且,如果发现与我的假设不同的结果,则可以在必要时进行调整)。最重要的是,(至少某些)MSP430I²C行为与您怀疑是I²C从站的设备IDT ZSC31014所要求的I²C行为似乎不兼容。拥有该设备的数据表对于理解这一点至关重要,因此感谢您找到它。

好消息是,此问题至少有2种解决方法,我将在最后解释。

该图变厚了,看来连接不同的示波器无法使电路正常工作,并且可以看出,唯一的区别是未发送ACK。

新的痕迹很有帮助,谢谢,尽管我对它们的解释有些不同。

(SCL信号下冲在最初的轨迹上仍然与我有关,最新的轨迹上仍然存在。有趣的是,SCL的下冲似乎大于SDA的下冲,尤其是考虑到SCL和SDA信号之间的垂直刻度不同时,我仍然建议调查SCL最终是否低于标准,但我不认为这与主要问题有关。)

SDA上有这两个“故障”:

  • 当I²C主机释放对SDA的控制以允许从机执行ACK,然后主机可能再次驱动SDA时,在ACK脉冲之前或之后的故障并不罕见。因此,我忽略了那个。

  • 这是第一个SCL脉冲之前的早期 SDA故障,这很不常见。从早期SDA毛刺的振幅(请参阅后面)及其事实,它仅在第一个SCL脉冲(标记为0)之前发生,而在以后的SCL脉冲之前不会发生,因此我们可以在SDA上看到毛刺(例如SCL)标记为4、5、6或7的脉冲),我们知道这不是测量伪像,也不是来自SCL的耦合(例如)。

(供以后参考,在最新曲线中,早期SDA干扰看起来至少为 2V,因此,根据早期评论,Vdd为3.6V,这使得SDA干扰幅度至少为(2 / 3.6)= 0.55 x Vdd。稍后讨论的相关I2C逻辑电平阈值。)

忽略ACK差异,我相信我在第二张屏幕截图中看到了两组迹线之间的另一个差异。比较标记为顶部的SDA迹线(黄色?)和标记为第二个SDA迹线(蓝色)的那段早期 SDA故障的幅度似乎略有不同。我现在相信,如前所述,SDA早期故障幅度的差异会导致您的问题出现或消失。C1M3

专门针对故障进行更高分辨率的处理将有所帮助(这是尝试“远程”解决问题的问题之一-我无法亲自操作“范围!”。我假设放大时,它看起来像正常I²C逻辑“ 1”的起点(即,上升沿上的RC曲线,特别是如果您暂时使上拉电路变弱,例如10k),但它不会。在再次被驱动为逻辑“ 0”之前,t达到全正电压。那就是稍后链接的另一个网页上显示的内容。如果看到的毛刺形状不同,那么以后的分析可能不适用。

I²C主设备在I2C启动和第一个SCL时钟脉冲(尽管它是MSbit,您将其标记为“ 0”)之间的故障点上控制总线。这使我对MSP430的性能感到怀疑,尽管此时SCL较低,但SDA干扰不应影响I²C兼容设备,因为它们将在下一次读取SDA状态之前等待SCL变为高电平。

那么,I²C从站是否真的符合I²C?事实证明,正是在我相信MSP430产生这种故障的时候,ZSC31014才是“ 挑剔 ”的,并且不如其他I²C器件那么宽容!

ZSC31014数据表列出了3个区,他们承认,该器件的I²C行为是“不同”。您有时可能还会受到此列表中前两个参数的影响(这不是此分析的一部分),但这是我在下面用红色标记的第三点,与早期的SDA故障有关:


ZSC31014数据表的摘录


早期SDA故障的幅度至关重要。如果该故障没有上升到足以被ZSC31014识别为逻辑“ 1”,然后又再次下降,那么您就可以了-该设备必须看到SDA 的下降沿才能打破该“规则”,并且只能一个下降,如果它已经被确认为逻辑“1”的边缘。

任何影响该SDA毛刺幅度的因素,例如SDA信号上的示波器或逻辑分析仪的额外负载,都足以阻止ZSC31014将毛刺识别为达到逻辑“ 1”,因此不会“下降” SDA边缘”,即列表中的第三点,可能会发生(在美好的一天,具体取决于电压,温度等)。但是,正如您所发现的,不同示波器之间的差异足以表明其中一些示波器增加了足够的负载来阻止问题,而其他示波器则没有。此设置必须非常有限!

这证实了我的担心,因为较早的“工作”传感器批次可能“仅”工作,因为那些“工作”设置上的MSP430 MCU可能还会产生SDA故障。接下来将解释我的关于传感器批次之间可能存在差异的理论,该理论可以解释您报告的不同行为(“工作”批次与“非工作”批次)。

有趣的是,ZSC31014在另一个方面与标准I²C有所不同,制造商未在该列表中提及这一点,这可以解释为什么您似乎看到了成批传感器之间的差异。

标准I²C逻辑阈值(简化)-逻辑“ 0”低于0.3 x Vdd,逻辑“ 1”高于0.7 x Vdd,如I²C规范所示:


I2C规范中的逻辑电平阈值


然而ZSC31014具有不同的阈值,0.2×Vdd和0.8×Vdd时,这意味着这些阈值之间的“未定义区域”是较大的比典型I²C装置:


ZSC31014数据表中的逻辑电平阈值


较大的“不确定区域”会增加毛刺进入不确定电压电平区域的机会,在该区域可能被识别为逻辑“ 1”(请注意,高于0.2 x Vdd的任何内容都可能被ZSC31014识别为逻辑“ 1”) ,因为在未定义区域中,任何内容都是允许的-当必须将其识别为逻辑“ 1” 时,该值仅高于0.8 x Vdd )。而且,如前所述,如果 ZSC31014识别为故障已达到逻辑“ 1”,则当故障再次降至逻辑“ 0”时,您已经破坏了用红色标记的“规则”,以表示所需的I²C行为由ZSC31014提供。

由于未指定在“未定义”电压区域中识别逻辑电平,因此传感器制造商只要制造一批仅在达到0.7 x Vdd时才识别逻辑“ 1”的传感器,而又制造另一批能够识别逻辑“ 1”的传感器,就不会违反规格例如,逻辑“ 1”低至0.4 x Vdd。假设的第二批产品更有可能将SDA故障视为SDA的下降边缘,这违反了其清单中的第三点,但并未违反其规格。

(多年来,我一直在研究的许多问题都是这样的:有两种设备,这两种设备都无法单独打破存在漏洞的规范,但是其中一种却过于挑剔且容忍度较低,另一个由于晦涩的行为而需要连接的设备具有更大的容忍能力;这两个设备中的每一个都可以与大多数其他设备很好地接口,但是当彼此连接时是不可靠的(或完全失败)。)

所以,你可以做什么?我想到了两个选择:

  • 不要使用MSP430-请使用不会产生早期SDA故障的另一个MCU。但是,我希望您在该软件上投入了大量时间,并且如果可以避免的话,也不想将代码移植到另一个MCU。

  • MSP430上的I²C协议“按位排列”,而不是使用其内置的I²C硬件模块。这样,您就可以完全控制I²C信号,并可以防止这种故障的发生。但是,创建自己的I²C例程,对其进行调试显然会需要一些工作,并且所生成的代码可能比使用MSP430I²C硬件模块时要大,如果您的Flash空间不足,这本身就是一个问题。

然后,我去寻找MSP430I²C问题,发现MSP430 + ZSC31014的这种组合是一个已知问题,原因是MSP430的早期SDA故障!在TI E2E MSP430论坛上查看此线程:

TI E2E论坛:MSP430 I2C毛刺脉冲给I2C外围芯片带来麻烦

此处提到的解决方法是更改​​ZSC31014I²C地址,以便在可能出现正向毛刺时SDA为高,并且由于将SDA 设为高,无论如何,SDA上没有实际毛刺:

我们的解决方法是将ZSC芯片配置为将其第6位设置为一个地址(例如,我们现在使用0x42)-这将在地址位6持续时间内将故障脉冲变为干净的“高”位,这可以消除有问题的下降边缘。

相同的解决方法实际上与ZSC31014数据表中我标记的红色框中的建议相反。他们说,如果ZSC31014I²C地址的第一位(即MSbit)为0,则必须防止SDA干扰-因此,请勿将I²C地址的MSbit设为“ 0”,而应将其设为“ 1”,即在7位I²C地址中设置位6!

由于该TI E2E论坛线程和ZSC31014数据手册都集中在I²C地址上,因此在总线上发送其他数据的过程中,可能没有发生SDA故障,或者确实发生了SDA故障。您将需要对此进行调查。

因此,忽略了使用其他MCU的第一种解决方法,这两种(更实际的)解决方法是:

  • 通过编写自己的代码对MSP430I²C总线进行位冲击处理,以免在SDA上造成故障,或者
  • 更改ZSC31014I²C地址,以设置其7位地址的第6位,这意味着当发生毛刺时SDA已经为高,因此,当解决ZSC31014时SDA上不会发生实际毛刺(假设SDA毛刺或不会在数据传输过程中发生其他I²C启动事件之后发生,或者如果确实发生,则ZSC31014不会发生“故障”)。

希望有帮助!


2
这是一个很棒且非常有用的答案,在我标记为接受之前,我可以通过任何方法为您提供更多代表,以帮助您通过故障排除坚持下去。进行时,我还将使用解决方法来更新我的问题。
Hugoagogo '17

1
@Hugo-这是一个非常善良的想法:-)我相信可以通过提供赏金来实现,赏金的原因将是“ 奖励现有答案 ”。我不是这个过程的专家,所以我不能说太多。当然,我很乐意得到更多代表(花了几个小时来进行分析和撰写;-)),但是如果您不想使用赏金,或者无法弄清楚这一过程, ,那么不用担心,无论如何,这都是积极的业力:-)希望我的回答有效!
SamGibson

@Hugo-我不知道您是否收到有关答案更新的通知,但仅供参考,我添加了一个有关SCL及其下冲的段落(仍然是一个难题,但我怀疑它与主要问题有关),我ve在最新的示波器迹线中推测“早期SDA毛刺”的幅度至少为0.55 x Vdd,该幅度恰好处于“未定义”电压区域,在此电压区域中,不同的传感器(或不同批次的传感器;-)可以处理在不违反其规格的情况下,是否为逻辑“ 1”。我将离线一段时间,再次祝您好运!
SamGibson

1
再次感谢您的帮助,我将在星期一在星期一得到赏金。(记录下来,我没有得到答案更新的通知)
Hugoagogo

我能否让您权衡一下问题的最后更新。
Hugoagogo '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.