У меня есть 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);
}