TCA9548a (мультиплексор I2C) C ++ интеграция - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 4 лазерных датчика расстояния VL680 для использования с Raspberry. Это датчик, совместимый с шиной I2C, но мы не можем изменить адрес. Итак, я использую мультиплексор I2C платы Adafruit TCA9548a. Я могу запустить только один VL680 непосредственно на моей шине I2C, но он не будет работать через мультиплексор. Лист данных не ясен, и я нахожу только код для Arduino или плохой пример Python.

Вот и я:

char filename[20];
const int adapter_nr = 1;
snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) 
{
    printf("Unable to connect reach I2C bus \n");
    exit(EXIT_FAILURE);
}

// multiplex address
const int addr = 0x70;

if(ioctl(file, I2C_SLAVE, addr) < 0) 
{
    printf("Fail to reach multiplex laser \n");
    exit(EXIT_FAILURE);
}

char buf[10];
buf[0] = 0x01; // to select channel 0
write(file, buf, 1);
I2C_init();

doTheSameAsOneOnlyVL680();
...

Я не знаю, как мне поступить, и ничто не поможет. Это способ выбрать канал? Как тогда писать и читать?

void I2C_init()
{   
    const int addr = 0x29;

    if(ioctl(file, I2C_SLAVE, addr) < 0) 
    {
        printf("Fail to reach laser \n");
        exit(EXIT_FAILURE);
    }

    if(read_byte(file, 0x000) != 0xB4)
    {
        printf("Problem with VL6180X\n");
        //exit(EXIT_FAILURE);
    }

    int setup = read_byte(file, 0x016);

    if(setup == 1)
    {
        printf("Init all registers \n");
        write_byte(file, 0x0207, 0x01);
                ...

    }
    else
    {
        printf("Fail \n");
    }

    set_scaling(file, 1);
}

1 Ответ

1 голос
/ 18 апреля 2019

Когда ioctl(file, I2C_SLAVE, addr) работает, вы говорите "На I2C говорите с мультиплексором."

Тогда с

buf[0] = 0x01; // to select channel 0 write(file, buf, 10);

Вы заставляете мультиплексор подключать VL680, который подключен к первому порту мультиплексора, к шине I2C.

После того, как вы поговорили с мультиплексором с

write(file, buf, 10);

и прежде чем говорить с датчиком расстояния с помощью

doTheSameAsOneOnlyVL680();

вам нужно запустить какой-нибудь код, чтобы сказать «На I2C поговорите с датчиком расстояния».

Что-то вроде:

if(ioctl(file, I2C_SLAVE, vl680Addr) < 0) 
{
    printf("Fail to reach distance sensor \n");
    exit(EXIT_FAILURE);
}

, где vl680Addr - это адрес (вам необходимо его определить) для лазерного датчика расстояния VL680,

...