如何解决 I2C 地址冲突?

电器工程 串行 i2c
2022-01-03 05:45:30

我想将多个 I2C 从设备连接到同一组引脚上的微控制器,但 I2C 设备都共享相同的地址。地址在硬件中是固定的。

有没有办法连接多个具有相同地址的设备?

可能是某种 I2C 地址转换模块,每个设备都有一个可配置的地址,所以我可以为每个设备分配我自己的地址。

4个回答

I2C 中没有内置任何东西可以做到这一点,通常从设备会有一些外部引脚可以设置为 0 或 1 来切换几个地址位以避免这个问题。或者,我与一些制造商打交道,它们的零件有 4 或 5 个零件编号,唯一的区别是它的 I2C 地址。

大多数设备都有处理 I2C 通信的特定硬件,即从 ACK 在硬件中,所以你真的无法绕过它。

至于翻译模块,你可以买一些 0.50 美元的带有 2 个 I2C 总线的 PIC,并编写一些快速代码,让它们充​​当我猜的地址翻译器。

我刚刚遇到了多个具有固定地址的 I2C 设备的问题。我们的解决方案是使用微控制器上的 I/O 线将我们不想寻址的设备上的 SDA 线强制为高电平,而我们目标设备的 I/O 线设置为输入(高阻抗)。这意味着只有目标设备与其 I2C 地址匹配,而其他设备忽略任何后续数据。

多个具有相同地址的 I2C 设备

非活动设备的 SDA 线上的电阻器最终充当总线的上拉电阻,因此确切的值将取决于您拥有的设备数量以及总线所需的上拉电阻。因此,如果您选择 10K 电阻,则 3 个非活动设备会产生 3K3 上拉。

肖特基二极管确保设备在将数据传输回主机时仍能将 SDA 线拉到足够低的水平。

现在有了答案——凌力尔特拥有 LTC4316/17/18 系列地址转换器。它们相对较新,可用性不确定。

如果没有 I2C 设备使用时钟拉伸(握手),并且如果您正在对 I2C 主设备进行位敲击,那么一个简单的技巧就是让一些设备交换时钟和数据引脚。在一个字节的传输过程中,时钟和数据引脚交换的设备将把每个“0”位视为非事件(数据上升和下降没有时钟),并将每个“1”位视为 I2C 停止并开始(时钟上升,而数据低,数据上升和下降,然后是时钟下降)。一个设备的有意停止和启动条件可能会被另一个设备视为数据位,但除非一个设备在“1”位之间具有过多的启动和停止条件,否则任何设备都不太可能“意外”