如何在同一条i2c总线上挂相同地址的i2c设备
linux i2c子系统限制了在同一条i2c总线上不能出现相同地址的设备。这点让我比较郁闷,现在要让具有相同i2c地址的两个设备挂上去,没辙了。其实这两个设备是相互独立,同一时刻只有一个设备工作。
完全可以挂载同一条总线上。我想这种情况是常见的,大家是怎么解决的,
i2c-dev层有I2C_SLAVE_FORCE这样一个flag,貌似可以用,但i2c-dev层是针对用户层驱动设计的,不适合我的内核驱动设计。
高手帮忙出点招。 分时供电怎末样? 几乎不可能,IIC器件一般会留几个硬件位给用户自己配置,其余的都是硬件上定死的,不仅用于地址识别还用于类型识别,不同类型的设备有不同的硬件地址掩码。如果需要挂多个器件,一般都是在硬件上设置留给用户的这几个地址位。 不通信时切段不用设备的总线 本帖最后由 racemaker 于 2012-12-6 21:22 编辑
几乎不可能,IIC器件一般会留几个硬件位给用户自己配置,其余的都是硬件上定死的,不仅用于地址识别还用于类型识别,不同类型的设备有不同的硬件地址掩码。如果需要挂多个器件,一般都是在硬件上设置留给用户的这几个地址位。
-------------------------------------------------------------------------------------------------
其实是着样的,我是一个摄像头模组,上面有两个设备地址相同的摄像头,也没预留硬件位,只能通过软件去解决。这俩个摄像头是分时供电的,不同时使用。 IIC总线从主机端看下去,能够访问到的总线上,一个Slave ID对应唯一的一个硬件。这是协议规定的,你没办法修改。
如果硬件没做,那么,有IIC总线切换器可以用;要不然就是让不工作的芯片在休眠状态下,IIC总线引脚高阻并且不响应IIC总线请求;以及其它硬件的或者操作Slave Device的方法。
总之,指望修改主机端的东西是不能解决问题的,因为你的问题违反了IIC本身的协议。
本帖最后由 racemaker 于 2012-12-6 21:30 编辑
IIC总线从主机端看下去,能够访问到的总线上,一个Slave ID对应唯一的一个硬件。这是协议规定的,你没办法修改。
如果硬件没做,那么,有IIC总线切换器可以用;要不然就是让不工作的芯片在休眠状态下,IIC总线引脚高阻并且不响应IIC总线请求;以及其它硬件的或者操作Slave Device的方法。
总之,指望修改主机端的东西是不能解决问题的,因为你的问题违反了IIC本身的协议。
-----------------------------------------------------------------------------------------------------------------------------------
你说的也就是我头疼的,因为我是分时使用,完全可以挂在同一条总线上,如果不走linux i2c的标准架构,是完全可以做到的。i2c-core中要check_slave_address。这我是没辙了。
没辙的是硬件上两个slave设备是引出的是同一条总线,要不然我就挂载不同的总线上了。 对了,NXP似乎有总线仲裁用的硬件,用于扩展IIC总线用的,你去找找看。 有个器件,可以用来切换总线,,,你用一个IO控制器件,去切换2个IIC的clk,,器件名字忘记了。。 本帖最后由 racemaker 于 2012-12-7 15:34 编辑
问题解决了。在注册的时候注册不同的地址,确保能注册上,然后在device 的 probe时候修改为正确的地址。 racemaker 发表于 2012-12-6 21:21 static/image/common/back.gif
几乎不可能,IIC器件一般会留几个硬件位给用户自己配置,其余的都是硬件上定死的,不仅用于地址识别还用于 ...
额,我刚好有个项目也是这样,两个完全一样的摄像头,不过我是硬件上分时供电,还加了片2选1的数码开关做camera信号的切换,现在看起来似乎这个都没必要了。 racemaker 发表于 2012-12-7 15:29
问题解决了。在注册的时候注册不同的地址,确保能注册上,然后在device 的 probe时候修改为正确的地址。 ...
请问您最后怎么解决的? https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-47695952.5.7A7onf&id=525307268623
USB转SPI,I2C,CAN,GPIO,UART,PWM,ADC
支持安卓系统,最多有8路I2C信号 I2C 协议的设计原则 是不允许同一个总线出现地址相同设备
页:
[1]