Answers:
I2C没有内置功能可以执行此操作,通常从设备具有一些外部引脚,可以将其设置为0或1来切换几个地址位,以避免此问题。另外,我已经与一些制造商打交道,这些制造商的零件具有4或5个零件号,唯一的区别是其I2C地址。
大多数设备都具有处理I2C通信的特定硬件,即从设备ACK位于硬件中,因此您实在无法破解它。
至于翻译模块,您可以购买带有2条I2C总线的PIC约0.50美元,并编写一些快速代码以使它们充当地址转换器。
我刚刚遇到了多个具有固定地址的I2C设备的问题。我们的解决方案是使用I / O线的微控制器,以迫使SDA线高的设备上,我们不想要的地址,而该设备的I / O线我们的定位是设置为输入(高阻抗)。这意味着只有目标设备匹配其I2C地址,而其他设备则忽略任何后续数据。
无效设备的SDA线上的电阻最终将充当总线的上拉电阻,因此确切的值将取决于您拥有多少个设备以及总线需要什么样的上拉电阻。因此,如果您选择10K电阻,那么3个无效的设备将提供3K3上拉。
肖特基二极管可确保设备在将数据传输回主机时仍能将SDA线拉至足够低的水平。
如果没有一个I2C设备使用时钟延长(握手),并且如果要对I2C主设备进行位冲击,那么一个简单的办法就是让某些设备交换时钟和数据引脚。在传输字节期间,时钟和数据引脚互换的设备会将每个“ 0”位视为非事件(数据无时钟上升和下降),并且将每个“ 1”位视为I2C停止然后开始(数据低时时钟上升,数据上升和下降使时钟下降,然后时钟下降)。一个设备的故意停止和启动条件可能被另一设备视为数据位,但是除非一个设备在“ 1”位之间的启动和停止条件数量过多,否则任何设备都不太可能“偶然”
我会考虑使用总线开关在地址冲突的设备之间多路复用I2C总线。总线开关的电容和电阻非常低,与缓冲器/驱动器不同,它们是连接或断开两个电路节点的真正开关。
总线开关通常具有一个奇特的特性,这对I2C来说无关紧要,因为它使用漏极开路设备:将电压接近0(Vss)的总线开关连接时,其导通电阻较低,但随着电压的接近,电阻会急剧上升电源Vdd。(这是因为它们基本上是MOSFET,它们在导通时在电源上具有栅极电压,因此当开关电压接近Vdd时,可用的Vgs会低得多)
我有两个要比较的TCS3414彩色光传感器(FN和CS封装,它们具有不同的滤光片)。I2C地址是硬连线的。在根据SCL(时钟)和SDA(数据)线查看了I2C的工作原理之后,关闭SDA线似乎会阻止芯片获得启动位或停止位,从而使其处于休眠状态。因此,使用CMOS模拟开关(4066B)来打开或关闭每个设备的SDA线。这对于在两个设备之间进行切换来说效果很好。我知道这是黑客,而PCA9548会更好,但我没有一个方便的工具。
现在有一个答案-凌力尔特(Linear Tech)具有LTC4316 / 17/18系列地址转换器。它们相对较新,并且可用性不确定。
使用简单的多路复用器芯片(例如74HC139 afaik)并将I2C CLK引脚连接至输入(因为I2C CLK引脚仅输出)。使用GPIO引脚控制所需的输出。然后,I2C数据引脚可以在所有从机之间共享。