This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PCA9544A:多主器件重复启动

Guru**** 2513185 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/837293/pca9544a-multi-master-repeated-start

器件型号:PCA9544A

我已经了解了 I2C 和多主器件的注意事项以及有关 I2C 开关多主器件兼容性的问题。
PCA9544数据表第13页指出:
当选择一个通道时、在 I2C 总线上施加一个停止条件后、该通道变为有效状态。
这可确保当通道被激活时所有 SCn/SDN 线路处于高电平状态、以便在连接时不会产生错误条件。

这是有道理的,但它还指出:

"一个停止条件必须在确认周期之后立即发生。"

预期的顺序似乎是
(开始)(从器件地址)(写入)(ACK)(新通道配置)(ACK)(停止)

我尝试更改开关的活动通道、但随后是重复启动、例如
(START)(从器件地址)(写)(ACK)(新通道配置)(ACK)(重复启动)(更多到其他器件的事务)(停止)

似乎交换机忽略了新的通道配置并保留了先前的设置。 因此、重复起始之后的事务通过错误的总线发送。
在单个主器件配置中、使用单独的停止传输似乎没有问题。
然而、对于多个主器件、重复起始是确保传输按预期执行的唯一方法。

一个小示例

  • 主器件1希望读取开关通道1上的器件 X
  • 主器件2希望读取开关通道2上的器件 Y

这可能是不必要的结果

  1. 主器件1重新配置开关以连接通道1、传输结束时停止
  2. 主器件2接管总线并重新配置开关以连接通道2并断开通道1
  3. 主器件1读取器件 X。如果通道2上也占用了地址、主器件1甚至不会意识到它是错误的器件。
  4. 主器件2无错误地读取正确的器件 Y。

根据我的理解、重复启动是避免(罕见)此类情况的唯一方法。
没有它、开关在具有多个主控的总线上使用并不是100%安全。
交换机地址最多包含1个、因此对其他设备的访问应在大多数时间内赢得仲裁进程。
我怀疑同一地址范围0x70-0x77中没有器件。
除了其他器件之外、将多个开关级联到接口4 x 4分支而不是4分支的情况如何?

我的问题:
如何在多主控总线上使用(级联) I2C 开关?
是否可以以某种方式使用具有重复启动的开关、或者是否缺少某些东西、而这并不是必需的?
为什么必须立即停止并且重复启动不可用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Johann、

    我们将对此进行研究、并将在今天晚些时候再次与您进行讨论。

    此致、
    最大

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Johann、

    "是否可以以某种方式使用具有重复启动的开关、或者是否缺少某些东西、而这并不是必需的?"

    对于我们的器件、如果您将器件配置为启用/禁用通道、则不应使用重复启动条件。 (如果您想与另一个不是我们的 I2C 开关之一的从器件通信、则可以使用它)。

    "为什么必须立即停止并且重复启动不可用?"

    器件的状态机旨在在发现停止条件后启用开关的通道。 这就是从硅器件的角度设计开关的方式。

    《如何在多主控总线上使用(级联) I2C 开关?》

    您只需记住、I2C 开关通常使用导通 FET 架构、因此您可以在启用通道时将其视为"短"。 这意味着、如果您有一组串联/并联的开关并且通道被启用、如果我们说通道被启用时导通 FET 是一个短接、那么每个通道上也有一组并联的上拉电阻器。 只需确保由于并联上拉电阻器而看到的 IOL 不会大于 I2C 从器件/主器件可以处理的电流(我们的器件也有导通 FET 电流)。

    我相信我们有一个在线发布的工具可以构建这样的东西。

    ^它将从根本上帮助您选择上拉电阻器、并检查您是否违反了任何 I2C 缓冲器规则并提供修复/替代方案。

    针对您的情况、我可以认为一种解决方案是在其中一个辅助通道上放置一个主通道、这意味着辅助通道上的主通道只能通过辅助通道与该通道之外的其他器件进行通信 (可由您的其他主器件启用和禁用)。

    防止第二个主器件在您有停止条件时控制总线的第二个想法是强制更改 I2C 开关的 I2C 地址(动态寻址) 在停止条件之前、这将导致另一个主器件看到 NACK 接下来将发生什么情况、这取决于主器件在看到 NACK 时应执行的软件/代码。

    I2C ^的动态寻址

    -Bobby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的详细回答。

    如果我理解正确的话、开关需要 STOP 来改变状态、并且由于这个原因、必须为多主器件操作设计其它方法。
    有关动态寻址的应用报告非常有趣、但我们必须连接已经构建且无法修改的模块。
    我们的系统需要3层交换机来访问所有分支、我们将解决基于硬件的解决方案(i2c 总线仲裁器)、以允许多个主器件在该解决方案上运行。



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Johann、

    [引用用户="Johann Johann "]

    非常感谢您的详细回答。

    如果我理解正确的话、开关需要 STOP 来改变状态、并且由于这个原因、必须为多主器件操作设计其它方法。

    没错。

    我们的系统需要3层交换机来访问所有分支、我们将解决基于硬件的解决方案(i2c 总线仲裁器)、以允许多个主器件在该解决方案上运行。

    从您之前所描述的内容来看、这听起来像是一个合适的解决方案。 (遗憾的是、我们的 I2C 产品系列没有 I2C 总线仲裁器)。 我唯一能想到的另一种方法是在软件中添加更多冗余(在写入辅助通道之前检查 I2C 开关是否读取了正确的值)。

    [/报价]

    谢谢、

    -Bobby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢。
    您通过分享这些详细信息并向我推荐可能的解决方案、为我提供了很多帮助。