I2C测试程序 + 安卓生成测试程序

一丶简介

配置SPI和I2C请参考:https://blog.csdn.net/qq_35141454/article/details/100774858

SPI测试数据不正确请参考:https://blog.csdn.net/qq_35141454/article/details/100891719

经过上述配置,在/dev/下产生了i2c节点,然后就可以通过open,write,read来操作I2C了。下面是测试代码,

参考:https://msd.misuland.com/pd/2884250103256716470

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

#define I2C_DEV "/dev/i2c-2"
#define CHIP_ADDR 0x6a

/**
*fd: i2c文件描述符 buff:要写入的数据 addr:寄存器偏移地址 count:数据大小
*/
int i2c_write(int fd, char buff[], int addr, int count)
{
	int res;
	int i,n;
	char sendbuffer[10] = {0};
	
	memcpy(sendbuffer+1, buff, count);
	sendbuffer[0] = addr;
	for(n=0; n<sizeof(sendbuffer); n++)
	{	
		printf("0x%x, ", sendbuffer[n]);
	}

	res = write(fd, sendbuffer, count+1);
	printf("write %d byte at 0x%x \n", res, addr);
	return res;
}

int main(int argc, char **argv)
{
	int i =0,fd =-1;
	int ret = -1;
	int bits = 0;
	int chipAddr = 0x6a;
	char reg[2] = {0};
	unsigned char buf = 0x0f;
	unsigned char recvBuf[8];

	if(argc <= 1)
		return -1;
	
	chipAddr = atoi(argv[1]);
	//printf("chipAddr: %d",chipAddr);
	printf("Device addr:0x%x \n", chipAddr);
	printf("Device name:%s \n", argv[2]);

	bits = atoi(argv[3]);
	if(bits ==0 || bits ==1)
		printf("Bit select :%s \n", bits == 0? "7 bit":"10 bit");
	else
	{
		printf("set bit err!\n");
		return -1;
	}

	fd = open(argv[2], O_RDWR);
	if(fd < 0)
	{	
		printf("open failed!\n");
		return -1;
	}
		
	ret = ioctl(fd, I2C_TENBIT, bits); // 设置设备地址位数
	//printf("bits: %d\n", ret);
	ret = ioctl(fd, I2C_SLAVE, chipAddr); // 设置I2C从设备地址
	//printf("chipAddr: %d\n", ret);
	char buff[] = {0xc6, 0x0d};

	i2c_write(fd,buff, 0x01, 2);

while(1){
	scanf("%s", reg);
	buf = (unsigned char)atoi(reg) & 0xff;
	printf("reg:0x%x \n", buf&0xff);
	write(fd, &buf, 1);
	//usleep(200*1000);
	ret = read(fd, recvBuf, 8);
	printf("receive: %d\n", ret);

	printf("\nReceive data:");
	for(i=0; i<8; i++)
	{
		printf("0x%0.2x ", recvBuf[i]);
	}
	printf("\nEnd \n");
}
	return 0;
}

在读的时候是先写寄存器的偏移地址,然后再读从偏移地址开始的指定个数的寄存器,上例是8个;在写过程中,buff的组成是寄存器偏移地址+数据(如果多个数据,那么就是从该寄存器开始向下一个寄存器方向一直写到完),上例就是从偏移地址为0x01的寄存器开始写0xc6 0x0d的数据,那么,0x01寄存器的值为0xc6,0x02寄存器的值为0x0d。(上例都是8为寄存器)。

说明:上例的addr都是偏移地址

二丶安卓上生成测试程序

① 进入kernel/Documentation/i2c, 创建i2c_test.c,代码如上

② 创建Makefile

hostprogs-y := i2c_test
always := $(hostprogs-y)
HOSTCFLAGS_i2c_test.o += -I$(objtree)/usr/include

③ 创建Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES += i2c_test.c
LOCAL_MODULE := i2c_test

LOCAL_LDFLAGS += -L$(LOCAL_PATH)
LOCAL_LDLIBS := -llog
include $(BUILD_EXECUTABLE)

④ 搭建环境,进入安卓根目录

source build/envsetup.sh
lunch msm8953_64-userdebug

⑤ 返回kernel/Documentation/i2c,执行mm命令。在system/bin目录下就生成i2c_test文件。

⑥ 烧写,打开cmd,进入adb命令目录,执行以下命令

adb root
adb remount
adb push i2c_test /system/bin

成功如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值