我有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);
}
答案 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激光距离传感器的地址(您需要定义),