写入I2C I / O设备

时间:2015-03-19 16:34:26

标签: linux i2c ioctl

我正在尝试与Bosch Sensortec BNO055传感器对话。我正在使用穿梭板。 VDD和VDDIO连接到3.3V,引脚17和18是SDA和SCL。这些连接到嵌入式linux板。另一个传感器在同一条总线上,我可以看到它在示波器上的值。 我有以下代码:

BNO055_RETURN_FUNCTION_TYPE Bno055I2cBusWrite(u8 dev_addr, u8 reg_addr, u8* reg_data, u8 wr_len){
//According to https://www.kernel.org/doc/Documentation/i2c/dev-interface

    int file = 0;
    char filename[20];
    snprintf(filename, 19, "/dev/i2c-%d", ADAPTER_NR);

    if(open(filename, O_RDWR) < 0){ /*error*/   }
    if(ioctl(file, I2C_SLAVE, dev_addr) < 0){ /*error*/ }

    char buf[1 + wr_len];
    buf[0] = reg_addr;
    memcpy(&buf[1], reg_data, wr_len);

    int written_bytes = 0;
    if(write(file, buf, wr_len) != wr_len){
        printf("Error BusWrite-write: %s.\n", strerror(errno));
        exit(-1);
    }
}

前两个if语句通过正常。 写操作失败。在示波器上,我看到了正确的设备地址(然后没有确认)。 我做了什么:

我的传感器只是在设备地址出现在线路上时才会确认。

  • ioctl(文件,I2C_SLAVE,dev_addr)究竟做了什么?那会在I2C总线上发送设备地址吗?
  • linuxkernel是否自行发送设备地址?我希望如此。

恢复:

  • 有人能指出我正确的方向让传感器做出反应吗?

1 个答案:

答案 0 :(得分:1)

嗯......看起来这个范围的电线干扰得太多了。设备地址由驱动程序在写入或读取时发送,以回答我自己的问题。