I2C C编程无效

时间:2019-05-09 12:02:52

标签: raspberry-pi

这是我的程序:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <linux/types.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define I2C_SLAVE  0x0703

int main(int argc, char **argv)
{
    uint8_t data, i2c_device_address = 0x21,
    i2c_register_address = 0x01;

    int file, rc;

   //Open I2C
    file = open("/dev/i2c-1", O_RDWR);
    if (file < 0)
      err(errno, "Tried to open /dev/i2c-1"); 


    // I want to work with I2C Register at I2C Address 0x12
    rc = ioctl(file, I2C_SLAVE, i2c_register_address);
    if (rc < 0)
        err(errno, "Tried to set device address '0x%02x'",
             i2c_device_address);


     // Read Content of I2C Register at I2C Address 0x12
     rc = read(file, &data, 1);
     if (rc < 0)
         err(errno, "Tried to read device at address '0x%02x'",
             i2c_device_address);

     // Print the Result
     // Expected (Default) Value = 0x80
     // What i got = 0x00
     printf("/dev/i2c-1: device 0x%02x at address 0x%02x: 0x%02x\n",
             i2c_device_address, i2c_register_address, data);


     // Terminal Output:
     // /dev/i2c-1: device 0x21 at address 0x01: 0x00

     return 0;

}

我有ov7670相机,我正在尝试读取一些寄存器进行预热。

但是我总是得到相同的结果:0x00。 相机的数据表告诉我,该寄存器的默认值为0x80。

当我的相机甚至没有连接到我的Raspberry PI时,当我运行程序时,它仍会打印相同的输出。甚至没有错误。

我使用命令i2cdetect -r 1并获得正确的输出。

因此设备必须处于正常状态,并且已正确连接。

我想知道如何使用基本的Linux读写功能来读写i2c寄存器?

更新 现在,我检查读取函数的返回值,并显示远程I / O错误

1 个答案:

答案 0 :(得分:4)

ioctl将设备地址而不是寄存器作为第三个参数:

rc = ioctl(file, I2C_SLAVE, i2c_device_address);

然后,您需要写-读组合,首先写要读取的寄存器,然后执行read

并且您必须检查read的返回值。必须为1read失败。