我想我找到了答案。事实证明这是一个已知问题,但我只是在确定问题所在并进行搜索之后才发现!
这是我经历的过程,因此您可以遵循它(如果有必要,如果您看到与我的假设不同的结果,您可以调整您的调查)。最重要的是,(至少某些)MSP430 I²C 行为与您怀疑是 I²C 从设备IDT ZSC31014所需的 I²C 行为之间似乎不兼容。拥有该设备的数据表对于理解这一点至关重要,因此感谢您找到它。
好消息是这个问题有(至少)两种解决方法,我将在最后解释。
情节变粗了,似乎连接不同的示波器并不能使电路正常工作,可以看出唯一的区别是没有发送 ACK。
新的痕迹很有帮助,谢谢,虽然我对它们的解释有点不同。
(在最初的轨迹上让我担心的 SCL 信号下冲,在最新的轨迹上仍然存在。有趣的是,SCL 上的下冲似乎大于 SDA 上的下冲,特别是考虑到 SCL 和 SDA 信号之间的不同垂直尺度最新跟踪。我仍然建议最终调查 SCL 下冲,但我认为这与主要问题无关。)
SDA 上有两个“故障”:
ACK 脉冲之前或之后的毛刺并不少见,当 I²C 主机释放对 SDA 的控制以允许从机执行 ACK 时,主机可能会再次重新驱动 SDA。因此我忽略了那个。
这是在第一个 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 故障的幅度差异会导致您的问题出现或消失,如下所述。C1
M3
更具体地解决故障会有所帮助(这是试图“远程”解决问题的问题之一——我自己无法操作“范围”!)。我假设当您放大时,它看起来像是正常 I²C 逻辑“1”的开始(即上升沿上的 RC 曲线,特别是如果您暂时使上拉变弱,例如 10k),但它没有t 在再次被驱动为逻辑“0”之前达到完整的正电压。这就是稍后链接的另一个网页上显示的内容。如果你看到你的故障有不同的形状,那么我后面的分析可能不适用。
I²C 主机在该故障点控制总线,在 I²C 启动和第一个 SCL 时钟脉冲之间(尽管它是 MSbit,但您已将其标记为“0”)。这让我对 MSP430 的行为产生了怀疑,尽管此时 SCL 为低电平,但 SDA 故障不应影响符合 I²C 标准的设备,因为它们将等待 SCL 变为高电平,然后再读取 SDA 的状态。
那么,I²C Slave真的符合 I²C 标准吗?事实证明,ZSC31014 比其他一些 I²C 设备“挑剔”且容错性更差,而正是在我相信 MSP430 产生该故障的时候!
ZSC31014 数据表列出了他们承认该器件的 I²C 行为“不同”的 3 个领域。在其他时间,您可能还会受到此列表中前两个的影响(这不是此分析的一部分),但这是我在下面用红色标记的第三点,这与早期的 SDA 故障有关:
早期 SDA 故障的幅度至关重要。如果该毛刺在再次下降之前没有上升到足以被 ZSC31014 识别为逻辑“1”,那么您就可以了 - 设备必须在 SDA 上看到一个下降沿才能打破该“规则”,它只能是如果它已被识别为逻辑“1”,则为下降沿。
任何影响 SDA 毛刺幅度的因素,例如 SDA 信号上的示波器或逻辑分析仪的额外负载,可能足以阻止 ZSC31014 将毛刺识别为达到逻辑“1”,因此不会出现“下降” SDA 边缘”,列表中的第三点,可能会出现(在天气好的时候,取决于电压、温度等)。但是,正如您所发现的,不同示波器之间的差异足以意味着其中一些会增加足够的负载来解决问题,而另一些则不会。这个设置一定很微不足道!
这证实了我的担忧,即您之前的“工作”批次传感器可能“只是”工作,因为这些“工作”设置上的 MSP430 MCU 也可能会产生 SDA 故障。接下来解释我关于传感器批次之间可能存在差异的理论,这可以解释您报告的不同行为(“工作”批次与“非工作”批次)。
有趣的是,ZSC31014 在制造商列表中未提及的另一个领域与标准 I²C 不同,这可以解释为什么您似乎看到不同批次的传感器之间存在差异。
标准 I²C 逻辑阈值(简化) - 低于 0.3 x Vdd 表示逻辑“0”,高于 0.7 x Vdd 表示逻辑“1”,如I²C 规范所示:
然而,ZSC31014 具有不同的阈值,0.2 x Vdd 和 0.8 x Vdd,这意味着它在这些阈值之间的“未定义区域”大于典型的 I²C 器件:
较大的“未定义区域”增加了毛刺进入未定义电压电平区域的机会,在那里它可能被识别为逻辑“1”(请记住,ZSC31014 可以将任何高于 0.2 x Vdd的值识别为逻辑“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,如果可以避免的话。
“Bit-bang” MSP430 上的 I²C 协议,而不是使用其内置的 I²C 硬件模块。这样,您就可以完全控制 I²C 信号,并且可以防止该故障的发生。但是,创建自己的 I²C 例程并对其进行调试显然需要一些工作,并且生成的代码可能比使用 MSP430 I²C 硬件模块时更大,如果闪存空间不足,这本身可能是个问题。
然后我去搜索 MSP430 I²C 问题,我发现这种 MSP430 + ZSC31014 的组合是一个已知问题,因为 MSP430 的早期 SDA 故障!请参阅 TI E2E MSP430 论坛上的此线程:
TI E2E 论坛:MSP430 I2C 毛刺脉冲导致 I2C 外围芯片故障
那里提到的解决方法是更改 ZSC31014 I²C 地址,以便在可能发生正毛刺时 SDA 为高电平,并且由于 SDA 为高电平,因此无论如何,SDA 上没有实际毛刺:
我们的解决方法是将 ZSC 芯片配置为具有第 6 位设置的地址(例如,我们现在使用 0x42) - 这会将毛刺脉冲转换为地址第 6 位持续时间的干净“高”位,从而摆脱有问题的下降沿。
相同的解决方法实际上与 ZSC31014 数据表中的建议相反,在我标记的红色框中。他们说,如果 ZSC31014 I²C 地址的第一位(即 MSbit)为 0,则必须防止 SDA 故障 - 所以不要将 I²C 地址的 MSbit 设为“0”,而是将其设为“1”,即在 7 位 I²C 地址中设置位 6!
由于 TI E2E 论坛主题和 ZSC31014 数据表都专注于 I²C 地址,因此在总线上发送其他数据期间,可能不会发生 SDA 故障,或者如果发生故障则不是问题。您将需要对此进行调查。
因此,忽略使用不同 MCU 的第一个解决方法,两种(更实际的)解决方法是:
- 通过编写您自己的代码对 MSP430 I²C 总线进行 Bit-bang,这样您就不会在 SDA 上产生该故障,或者
- 更改 ZSC31014 I²C 地址,使其 7 位地址的第 6 位被设置,这意味着当毛刺发生时 SDA 已经为高电平,因此当 ZSC31014 被寻址时,SDA 上不会发生实际毛刺(假设 SDA 毛刺要么在数据传输期间其他 I²C 启动事件之后不会发生,或者如果确实发生了,ZSC31014 不会“不安”)。
希望有帮助!