i2c这里的调试要注意的是管脚的功能配置,需要更改设备树文件;
更改设备树文件:https://blog.csdn.net/cao849861802/article/details/111604277
设备树文件修改好了,才能在/dev下看到i2c设备比如i2c-0,i2c-1;
我这边读写设备是个e2prom,然后注意地址和传入长度,代码中的设备地址是从第七位开始的,因为读写位已经整合到了其他地方,所以地址有效的只有七位,第一位设置一定为0
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <string.h>
#define I2C_WRITE_DATA 0
#define I2C_READ_DATA 1
struct i2cMsg
{
unsigned short addr;
unsigned short flags;
unsigned short len;
unsigned char *buf;
};
struct i2c_ioctl_data
{
struct i2cMsg *msgs;
int nmsgs;
};
int i2cfd[2];
void i2cWrite(int fd,unsigned short devaddr,unsigned char *buf,unsigned short buflen)
{
struct i2cMsg msg[2];
struct i2c_ioctl_data date;
int ret = 0;
if(buf == NULL)
return ;
msg[0].len = buflen;//buf len
msg[0].flags = I2C_WRITE_DATA;//0write 1read
msg[0].addr = devaddr;//dev addr
msg[0].buf = buf;
date.nmsgs = 1;
date.msgs = (struct i2cMsg *)&msg;
ret = ioctl(fd,I2C_RDWR,(unsigned long)&date);
if(ret < 0)
{
printf("i2c write date ioctrl set failed,ret = %d\r\n",ret);
}
}
void i2cRead(int fd,unsigned short devaddr,unsigned char *buf,unsigned short buflen,unsigned char *retbuf,unsigned short retbuflen)
{
struct i2cMsg msg[2];
struct i2c_ioctl_data date;
int ret = 0;
if(buf == NULL)
return ;
msg[0].len = buflen;//buf len
msg[0].flags = I2C_WRITE_DATA;//0write 1read
msg[0].addr = devaddr;//dev addr
msg[0].buf = buf;
msg[1].len = retbuflen;//buf len
msg[1].flags = I2C_READ_DATA;//0write 1read
msg[1].addr = devaddr;//dev addr
msg[1].buf = retbuf;
date.nmsgs = 2;
date.msgs = (struct i2cMsg *)&msg;
ret = ioctl(fd,I2C_RDWR,(unsigned long)&date);
if(ret < 0)
{
printf("i2c read date ioctrl set failed,ret = %d\r\n",ret);
}
}
void main()
{
int i = 0;
int ret = 0;
unsigned char buf[64];
unsigned char retbuf[64];
unsigned short devaddr = 0x50;
for(i = 0; i < 2; i++)
{
printf("i2c %d task start------\r\n",i);
memset(buf,0,sizeof(buf));
sprintf(buf,"/dev/i2c-%d",i);
i2cfd[i] = open(buf, O_RDWR);
if(i2cfd[i] < 0)
{
printf("i2c-%d fd open failed\r\n",i);
i2cfd[i] = -1;
return;
}
ioctl(i2cfd[i],I2C_TIMEOUT,1);/*超时时间*/
ioctl(i2cfd[i],I2C_RETRIES,2);/*重复次数*/
memset(buf,0,sizeof(buf));
buf[0] = 0x00;//reg addr 0;
buf[1] = 0x01;//reg addr 1
buf[2] = 0x11;//data
i2cWrite(i2cfd[i],devaddr,buf,3);
sleep(1);
memset(buf,0,sizeof(buf));
memset(retbuf,0,sizeof(retbuf));
buf[0] = 0x00;//reg addr;
buf[1] = 0x01;//reg addr;
i2cRead(i2cfd[i],devaddr,buf,2,retbuf,1);
printf("i2c %d buf = %x",i,retbuf[0]);
close(i2cfd[i]);
close(i2cfd[i]);
printf("i2c %d close\r\n",i);
}
}