一丶简介
配置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
成功如下: