前提:有/dev/i2c-0这个设备节点
#include "i2c_dev.h"
#define I2C_CMD_WRITE (0x0)
#define I2C_CMD_READ (0x1)
int i2c_init(char * i2c_dev)
{
int fd;
fd = open(i2c_dev, O_RDWR);
if(fd == -1)
printf("open %s error!\n", i2c_dev);
return fd;
}
int i2c_write_byte(int fd, uint8_t device_addr, uint8_t reg_addr, uint8_t value)
{
int ret;
struct i2c_rdwr_ioctl_data data;
struct i2c_msg msgs[1];
uint8_t buff[2];
buff[0] = reg_addr;
buff[1] = value;
data.msgs = msgs;
data.nmsgs = 1;
data.msgs[0].len = 2;
data.msgs[0].addr = device_addr;
data.msgs[0].flags = I2C_CMD_WRITE;
data.msgs[0].buf = buff;
ret = ioctl(fd, I2C_RDWR, &data);
if (ret < 0)
{
printf("write data %x error\r\n", device_addr);
return 1;
}
return 0;
}
int i2c_read_byte(int fd, uint8_t device_addr, uint8_t reg_addr, uint8_t * value)
{
int ret;
struct i2c_rdwr_ioctl_data i2c_data;
struct i2c_msg msgs[2];
uint8_t outbuf[1], inbuf[1];
outbuf[0] = reg_addr;
inbuf[0] = 0;
msgs[0].addr = device_addr;
msgs[0].flags = 0; //表示写
msgs[0].len = 1;
msgs[0].buf = outbuf;
msgs[1].addr = device_addr;
msgs[1].flags = I2C_M_RD | I2C_M_NOSTART;//读
msgs[1].len = 1;
msgs[1].buf = inbuf;
i2c_data.nmsgs = 2;
i2c_data.msgs = msgs;
ret = ioctl(fd, I2C_RDWR, &i2c_data);
if (ret < 0)
{
printf("read data %x error\r\n", device_addr);
return 1;
}
*value = inbuf[0];
return 0;
}
int i2c_close(int fd)
{
close(fd);
return 0;
}