i2cdetect не распознает датчики VL6180X за мультиплексором I2C TCA9548A

У меня есть 2 датчика расстояния VL6180X, правильно подключенных к мультиплексору TCA9548A, однако он распознает только сам мультиплексор, а не 2 датчика, как вы можете видеть с 0x70. Есть ли способ настроить адреса 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, как здесь: I2C не обнаруживает? проблемы с оборудованием или какие-либо другие?


person hux0    schedule 12.02.2020    source источник
comment
Вы должны включить мультиплексор I2C драйвер в ядре, а затем включить драйверы для ваших датчиков. Если драйвера нет, его нужно написать.   -  person 0andriy    schedule 12.02.2020


Ответы (2)


Чтобы экземпляр VL6180X был правильно создан за мультиплексором в Linux, вы должны описать его в дереве устройств. Ознакомьтесь с документацией по I2C MUX.

Таким образом, вы должны описать всю установку (мультиплексор I2C + 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 и для датчик VL6180X, доступный в исходниках ядра.

person Luca Ceresoli    schedule 13.02.2020

Ответ Луки лучше этого, хотя это все равно должно работать.

Это так не работает. Вы не можете "видеть" подключенные устройства через мультиплексор.

Вместо этого вы открываете мультиплексор и записываете в него "управляющий байт", чтобы сообщить ему, на какое устройство он должен пересылать следующие данные.

person Mark Setchell    schedule 12.02.2020
comment
ладно, приятно это знать. Спасибо за вашу помощь! как отправить управляющий байт? у вас есть пример фрагмента кода? - person hux0; 12.02.2020
comment
Более того, здесь есть небольшое руководство... learn.adafruit.com/ - person Mark Setchell; 12.02.2020