i2cdetect 无法识别 TCA9548A I2C 多路复用器后面的 VL6180X 传感器

i2cdetect does not recognize VL6180X sensors behind TCA9548A I2C multiplexer

我有 2 个 VL6180X 距离传感器正确连接到 TCA9548A 多路复用器,但它只能识别多路复用器本身,而不是 0x70 中看到的 2 个传感器。有什么方法可以配置 i2c 地址吗?

i2cdetect -y 1

给我以下输出

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- -- 

Ofc,我已经在网上搜索了解决方案:

我安装了

sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools

我在内核中启用了 i2c (https://raspberrypi.stackexchange.com/questions/66145/raspberry-pi-3-not-detecting-i2c-device)

已将所有内容添加到 config.txt,如下所示:

Luca 的回答比这更好,尽管这应该仍然有效。

不是这样的。您无法通过多路复用器 "see" 连接的设备。

相反,您打开多路复用器并向其写入 "control byte",告诉它应将以下数据转发到哪个设备。

为了在 Linux 中的多路复用器后面正确实例化 VL6180X,您应该在设备树中描述它们。看看 I2C MUX documentation.

因此您应该像这样描述整个设置(I2C mux + 2x VL6180X):

&i2c1 { // the SoC bus controller
    mux@70 {
        compatible = "nxp,pca9548";
        reg = <0x70>;
        #address-cells = <1>;
        #size-cells = <0>;

        i2c@3 {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <3>;

            gpio1: gpio@29 {
                compatible = "st,vl6180";
                reg = <0x29>;
            };
        };

        i2c@4 {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <4>;

            gpio1: gpio@29 {
                compatible = "st,vl6180";
                reg = <0x29>;
            };
        };
    };
};

这将实例化两个新总线(用 i2cdetect -l 列出它们),每个总线下方将出现一个 vl6180 传感器,并被描述为常规 IIO 设备。

以上代码是 i2c-mux and for the VL6180X sensor 的设备树绑定文档的简单组合,可在内核源代码中找到。