如何解决I2C地址冲突?


39

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

有什么办法可以用相同的地址连接多个设备?

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

Answers:


24

I2C没有内置功能可以执行此操作,通常从设备具有一些外部引脚,可以将其设置为0或1来切换几个地址位,以避免此问题。另外,我已经与一些制造商打交道,这些制造商的零件具有4或5个零件号,唯一的区别是其I2C地址。

大多数设备都具有处理I2C通信的特定硬件,即从设备ACK位于硬件中,因此您实在无法破解它。

至于翻译模块,您可以购买带有2条I2C总线的PIC约0.50美元,并编写一些快速代码以使它们充当地址转换器。


谢谢。是的,这些设备确实有一个地址选择,但是只能在两个地址之间选择,而且我想连接5个以上的设备,因此我仍然会遇到冲突。我没想到要使用PIC。那应该工作。有什么东西可以做的吗?
西蒙·史蒂文斯

11
恩智浦为I2C生产了一堆多路复用器/开关,您也许可以从中提取一些东西:例如,ics.nxp.com / products / i2cmuxes可以在您的情况下创建3个子分支,每个分支上有2个设备。 ,并使用NXP的其中一种开关来实现您的目标。
标记

太好了,这正是我想要的东西。我只是不知道名字。谢谢。
西蒙·史蒂文斯

这个答案已有7年历史了,所以我相信它在提供时可能是最好的。但是,对于现在遇到的其他问题,一些较新的答案(目前在列表中排名较低)基于当前市场上较新的组件提供了可能更好的方法。

6

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

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

无效设备的SDA线上的电阻最终将充当总线的上拉电阻,因此确切的值将取决于您拥有多少个设备以及总线需要什么样的上拉电阻。因此,如果您选择10K电阻,那么3个无效的设备将提供3K3上拉。

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


非常感谢您跟踪并发布了此信息。这是一个非常巧妙的解决方案,我相信它将对其他人有所帮助。
西蒙·史蒂文斯

一个不错的细分市场,可以在某些应用程序上使用。我很喜欢。
哈里·斯文森

5

如果没有一个I2C设备使用时钟延长(握手),并且如果要对I2C主设备进行位冲击,那么一个简单的办法就是让某些设备交换时钟和数据引脚。在传输字节期间,时钟和数据引脚互换的设备会将每个“ 0”位视为非事件(数据无时钟上升和下降),并且将每个“ 1”位视为I2C停止然后开始(数据低时时钟上升,数据上升和下降使时钟下降,然后时钟下降)。一个设备的故意停止和启动条件可能被另一设备视为数据位,但是除非一个设备在“ 1”位之间的启动和停止条件数量过多,否则任何设备都不太可能“偶然”


6
我没有投票,但这对我来说有点冒险。我对I2C的经验是,仅使用常规连接就足够容易产生噪声。但是,您可以使用“ hack”一词,并提请注意“如果没有任何i2c设备使用时钟延展”,那么,如果它可以为某人工作,则可以为他们提供更多的功能。
詹森·S

5

我会考虑使用总线开关在地址冲突的设备之间多路复用I2C总线。总线开关的电容和电阻非常低,与缓冲器/驱动器不同,它们是连接或断开两个电路节点的真正开关。

总线开关通常具有一个奇特的特性,这对I2C来说无关紧要,因为它使用漏极开路设备:将电压接近0(Vss)的总线开关连接时,其导通电阻较低,但随着电压的接近,电阻会急剧上升电源Vdd。(这是因为它们基本上是MOSFET,它们在导通时在电源上具有栅极电压,因此当开关电压接近Vdd时,可用的Vgs会低得多)



4

我有两个要比较的TCS3414彩色光传感器(FN和CS封装,它们具有不同的滤光片)。I2C地址是硬连线的。在根据SCL(时钟)和SDA(数据)线查看了I2C的工作原理之后,关闭SDA线似乎会阻止芯片获得启动位或停止位,从而使其处于休眠状态。因此,使用CMOS模拟开关(4066B)来打开或关闭每个设备的SDA线。这对于在两个设备之间进行切换来说效果很好。我知道这是黑客,而PCA9548会更好,但我没有一个方便的工具。


实际上,这根本不是黑客,我认为这应该是公认的答案。我已经看到这种方法已在几种商业产品中使用,并且我想不出更好的解决方案(除非您没有可用的GPIO,因此需要纯I2C解决方案,例如I2C特定的复用器)。好的ol'模拟复用器具有足够的带宽,而且价格便宜。
杰·卡尔森

4

现在有一个答案-凌力尔特(Linear Tech)具有LTC4316 / 17/18系列地址转换器。它们相对较新,并且可用性不确定。


非常有趣的组件。大多数I2C器件具有2个固定地址,而LTC4316可以以合理的成本使该地址加倍。
Mehrad '16

4

一些制造商提供I2C总线多路复用和开关IC。

一个多路复用器一次可以激活一个通道。一台交换机可以并行启用多个交换机。

例如查看NXPTIMaxim的产品

为了进行实验,Adafruit有一个TCA9548a板

如果您有8个目标地址相同的目标芯片,请选择8对1 MUX。在访问任何目标芯片之前,请配置MUX以激活正确的I2C总线。

好处

  • 无需编程(与基于微控制器的方法相比)
  • 可以支持所需的I2C功能和速度(与常规的模拟/数字总线多路复用器相比)。例如,常规(非I2C)MUX不会将常规呼叫地址传递到其所有通道。

-1

使用简单的多路复用器芯片(例如74HC139 afaik)并将I2C CLK引脚连接至输入(因为I2C CLK引脚仅输出)。使用GPIO引脚控制所需的输出。然后,I2C数据引脚可以在所有从机之间共享。


6
SCL 不仅输出。从属设备可能需要延长时钟的速度。
stevenvh 2012年

您可以使用模拟多路复用器(双向),但由于stevenh所述的原因,解码器可能无法工作。如果使用多路复用器,则从站侧将需要使用弱浆以确保其保持不活动状态。也仅在总线空闲时更改多路复用器选择。
凯文·怀特
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.