这是我的程序:
#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错误
答案 0 :(得分:4)
ioctl
将设备地址而不是寄存器作为第三个参数:
rc = ioctl(file, I2C_SLAVE, i2c_device_address);
然后,您需要写-读组合,首先写要读取的寄存器,然后执行read
。
并且您必须检查read
的返回值。必须为1
或read
失败。