imx6ull的i2c应用开发(ap3216c)

imx6ull的i2c应用开发

1、无需配置设备树

2、开启内核i2c控制器

make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
Device Drivers —>
<> I2C support —>
<
> I2C device interface

3、开发板上运行 i2cdetect -a 0 查看I2C-0下的设备

在这里插入图片描述
ap3216c 器件地址 0x1e (/dev/I2c-0)

4、代码:ap3216c.c

#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <unistd.h>
#include <fcntl.h>

#define AP3216C_ADDR 0x1e
static int fd;

int ap3216c_init(void)
{
	char buf[100];
	//int err;
	struct i2c_rdwr_ioctl_data rdwr;
	struct i2c_msg msgs[1];
	int nmsgs_sent;
	fd=open("/dev/i2c-0",O_RDWR);//打开设备,读写
	if(fd<0)
	{
		printf("can not open i2c bus\n");
		return 0;
	} 
    msgs[0].addr  = AP3216C_ADDR;  //ap3216c的地址
	msgs[0].flags = 0;      // 写数据:0,读数据:1 
	msgs[0].len   = 2;      //buf长度这里为2
	msgs[0].buf   = buf;
	buf[0] = 0;  //第一字节为寄存器地址
	buf[1] = 4;  //第二字节是数据
	rdwr.msgs = msgs;
	rdwr.nmsgs = 1;//msgs的数量
	nmsgs_sent = ioctl(fd, I2C_RDWR, &rdwr);
	if (nmsgs_sent < 0 )
	{
		printf("can not reset ap3216c\n");
		printf("nmsgs_sent :%d\n",nmsgs_sent);
		return -1;  /* err */
	}
	/* enable ap3216c */
	msgs[0].addr  = AP3216C_ADDR;
	msgs[0].flags = 0;      /* 写数据:0,读数据:1 */
	msgs[0].len   = 2;
	msgs[0].buf   = buf;
	buf[0] = 0;  //第一字节为寄存器地址
	buf[1] = 3;  //第二字节是数据
	rdwr.msgs = msgs;
	rdwr.nmsgs = 1;
	nmsgs_sent = ioctl(fd, I2C_RDWR, &rdwr);//调用驱动层代码,将数据传递
	if (nmsgs_sent < 0 )
	{
		printf("can not enable ap3216c\n");
		return -1;  /* err */
	}
	
	return 0;
	
}

/*读取光照数据*/
int  ap3216c_read_light(void)
{
	struct i2c_rdwr_ioctl_data rdwr;
	struct i2c_msg msgs[2];
	int  nmsgs_sent;
	char buf_tx[1];
    char buf_rx[2];
	int light;
	msgs[0].addr=AP3216C_ADDR;
	msgs[0].flags=0;//写数据
    msgs[0].len=1;
	msgs[0].buf=buf_tx;
	buf_tx[0]=0xc; //寄存器地址
	msgs[1].addr  = AP3216C_ADDR;
	msgs[1].flags = I2C_M_RD;	   /* 读数据:1, I2C_M_RD */
	msgs[1].len   = 2; //读取长度2字节
	msgs[1].buf   = buf_rx;
	rdwr.msgs = msgs;
	rdwr.nmsgs = 2;
	nmsgs_sent = ioctl(fd, I2C_RDWR, &rdwr);//调用驱动层代码
	if (nmsgs_sent < 0)
	{
		printf("can not read ap3216c light\n");
		return -1;	/* err */
	}
   light = (buf_rx[1]<<8) | buf_rx[0];
	
	return light;
}

/*读取距离值*/
int ap3216c_read_distance(void)
{
	struct i2c_rdwr_ioctl_data rdwr;
	struct i2c_msg msgs[2];
	int nmsgs_sent;
	char buf_tx[1];
	char buf_rx[2];
	int distance;
	/* 发送寄存器地址 */
	msgs[0].addr  = AP3216C_ADDR;
	msgs[0].flags = 0;		/* 写:0*/
	msgs[0].len   = 1;
	msgs[0].buf   = buf_tx;
	buf_tx[0] = 0xe; //寄存器地址
	msgs[1].addr  = AP3216C_ADDR;
	msgs[1].flags = I2C_M_RD;	   /* read:1, 读:I2C_M_RD */
	msgs[1].len   = 2;
	msgs[1].buf   = buf_rx;
	rdwr.msgs = msgs;
	rdwr.nmsgs = 2;
	nmsgs_sent = ioctl(fd, I2C_RDWR, &rdwr);
	if (nmsgs_sent < 0 )
	{
		printf("can not read ap3216c light\n");
		return -1;	/* err */
	}
	distance = ((buf_rx[1] & 0x3F)<<4) | (buf_rx[0] & 0xf);
	
	return distance;
}


int main(int argc, char **argv)
{
	int err; 
	int light, distance;
	int cnt = 0;
	
	err = ap3216c_init();
	if (err)
	{
		printf("ap3216c_init err : %d\n", err);
	}
	while (1)
	{
		light = ap3216c_read_light();	
		distance = ap3216c_read_distance();
		printf("%03d: light = %d, distance = %d\n", cnt, light, distance);
		cnt++;
		sleep(2);
	}
	return 0;
}

5、编译

arm-linux-gnueabihf-gcc -o ap3216c ap3216c.c
./ap3216c

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
imx6ull是一款基于Arm架构的处理器,它支持I2C总线。I2C驱动分为两部分:I2C控制器驱动和I2C设备驱动。I2C总线在寻址时使用从位,并且如果启用了中断,Arm平台会中断并检查从读/写位的状态。在复位后,默认情况下,I2C处于从接收操作状态,除非作为主设备操作或响应从设备发送地址。需要注意的是,imx6ullI2C设计与PhilipsTM I2C总线协议兼容,并且仅支持标准和快速模式。有关更多配置、协议和限制的信息,可以参考飞利浦半导体公司的I2C总线规范2.1版。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [i.MX 6ULL 驱动开发 二十一:I2C(I2C子系统+MISC子系统)](https://blog.csdn.net/OnlyLove_/article/details/127739570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [IMX6ULL平台的I2C](https://blog.csdn.net/weixin_52849254/article/details/130844599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值