TCA9548a(I2C多路复用器)C ++集成

时间:2019-04-17 20:48:57

标签: c++ arduino raspberry-pi i2c sensors

我有4个VL680激光距离传感器与àRaspberry一起使用。它是I2C总线兼容的传感器,但我们不能更改地址。因此,我使用了TCA9548a Adafruit板I2C多路复用器。我只能在我的I2C总线上直接运行一个VL680,但它不能通过多路复用器工作。数据表不清楚,我只能找到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 个答案:

答案 0 :(得分:1)

运行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激光距离传感器的地址(您需要定义),