imx6ul i2c调试(代码)

本文详细介绍了在Linux系统中进行I2C通信时,如何通过修改设备树文件来配置管脚功能,并在/dev目录下查看i2c设备。同时,提供了C语言实现的I2C读写函数,强调了e2prom设备的地址和长度注意事项。通过示例代码展示了如何进行I2C写入和读取操作。
摘要由CSDN通过智能技术生成

 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);
	}
	

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值