完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
首先在JNI中添加iic源文件。如下图:
这里我们添加了编译so库要使用的源文件,就需要设置一下Android.mk 然后就是bsp_iic.cpp源码的实现。(注这里是我们用来读取T613作为Slave address) bsp_iic.cpp源码: #include #include #include #include #include #include #include #include #include #include #define SINGLE_RW_2B_ADDR 0x30 #define MODIFY_BNAK_ADDR 0x31 /** * * @param u8BusIndex * @return */ int I2C_open(unsigned char u8BusIndex) { char szDev[16] = {0}; sprintf(szDev, "/dev/i2c-%d", u8BusIndex); return open(szDev, O_RDWR); } /** * * @param dev_fh * @return */ int I2C_close(int dev_fh) { return close(dev_fh); } /** * * @param u8BusIndex * @param u16BankIndex * @return */ int I2C_modify_bank_index(unsigned char u8BusIndex, int u16BankIndex) { struct i2c_rdwr_ioctl_data i2c_data; unsigned char reg_buf[3] = {0}; int dev_fh = I2C_open(u8BusIndex); if (dev_fh < 0) return dev_fh; ioctl(dev_fh, I2C_TIMEOUT, 1); ioctl(dev_fh, I2C_RETRIES, 2); i2c_data.nmsgs = 1; i2c_data.msgs=(struct i2c_msg*)malloc(i2c_data.nmsgs*sizeof(struct i2c_msg)); if (!i2c_data.msgs) { close(dev_fh); return -2; } reg_buf[0] = (u16BankIndex >> 8) & 0xFF; reg_buf[1] = (u16BankIndex ) & 0xFF; (i2c_data.msgs[0]).len = 3; (i2c_data.msgs[0]).addr = MODIFY_BNAK_ADDR; (i2c_data.msgs[0]).flags = 0; //write (i2c_data.msgs[0]).buf = reg_buf; int ret = ioctl(dev_fh, I2C_RDWR, (unsigned long)&i2c_data); if (ret < 0) { close(dev_fh); free(i2c_data.msgs); return -3; } else { close(dev_fh); free(i2c_data.msgs); return 0; } } /** * * @param u8BusIndex * @param u32Register * @param pData * @return */ int I2C_read_single(unsigned char u8BusIndex, int u32Register, unsigned char* pData) { int nRet; //BanKIndex int u16BankIndex = (u32Register >> 16) & 0xFFFF; nRet = I2C_modify_bank_index(u8BusIndex, u16BankIndex); if(nRet < 0) return nRet; // struct i2c_rdwr_ioctl_data i2c_data; unsigned char reg_buf[2] = {0}, read_buf[2]={0}; int dev_fh = I2C_open(u8BusIndex); if (dev_fh < 0) { return dev_fh; } ioctl(dev_fh, I2C_TIMEOUT, 1); ioctl(dev_fh, I2C_RETRIES, 2); i2c_data.nmsgs = 2; i2c_data.msgs = (struct i2c_msg*)malloc(i2c_data.nmsgs * sizeof(struct i2c_msg)); if (!i2c_data.msgs) { close(dev_fh); return -2; } reg_buf[0] = (u32Register >> 8) & 0xFF; reg_buf[1] = (u32Register ) & 0xFF; (i2c_data.msgs[0]).len = 2; (i2c_data.msgs[0]).addr = SINGLE_RW_2B_ADDR ; (i2c_data.msgs[0]).flags = 0; //write (i2c_data.msgs[0]).buf = reg_buf; (i2c_data.msgs[1]).len = 1; (i2c_data.msgs[1]).addr = SINGLE_RW_2B_ADDR; (i2c_data.msgs[1]).flags = 1; //read (i2c_data.msgs[1]).buf = read_buf; nRet = ioctl(dev_fh, I2C_RDWR, (unsigned long)&i2c_data); if (nRet < 0) { close(dev_fh); free(i2c_data.msgs); return -3; } else { close(dev_fh); free(i2c_data.msgs); pData[0] = read_buf[0]; return 0; } } /** * * @param u8BusIndex * @param u32Register * @param u8wrData * @return */ int I2C_write_single(unsigned char u8BusIndex, int u32Register, unsigned char u8wrData) { int nRet; //BanKIndex int u16BankIndex = (u32Register >> 16) & 0xFFFF; nRet = I2C_modify_bank_index(u8BusIndex, u16BankIndex); if(nRet < 0) return nRet; // struct i2c_rdwr_ioctl_data i2c_data; char reg_buf[3] = {0}; int dev_fh = I2C_open(u8BusIndex); if (dev_fh < 0) return dev_fh; ioctl(dev_fh, I2C_TIMEOUT, 1); ioctl(dev_fh, I2C_RETRIES, 2); i2c_data.nmsgs = 1; //I2C restart once i2c_data.msgs=(struct i2c_msg*)malloc(i2c_data.nmsgs*sizeof(struct i2c_msg)); if (!i2c_data.msgs) { close(dev_fh); return -2; } reg_buf[0] = (u32Register >> 8) & 0xFF; reg_buf[1] = (u32Register ) & 0xFF; reg_buf[2] = u8wrData; (i2c_data.msgs[0]).len = 3; (i2c_data.msgs[0]).addr = SINGLE_RW_2B_ADDR; (i2c_data.msgs[0]).flags = 0; //write (i2c_data.msgs[0]).buf = (unsigned char*)reg_buf; nRet = ioctl(dev_fh, I2C_RDWR, (unsigned long)&i2c_data); if (nRet < 0) { close(dev_fh); free(i2c_data.msgs); return -3; } else { close(dev_fh); free(i2c_data.msgs); return 0; } } bsp_iic.h源码: #ifndef __BSP_IIC_H #define __BSP_IIC_H int I2C_read_single(unsigned char u8BusIndex, int u32Register, unsigned char* pData); int I2C_write_single(unsigned char u8BusIndex, int u32Register, unsigned char u8wrData); #endif /* __BSP_IIC_H */ 注:我原先使用的是android-ndk-r12b,但是这里面会一直报错。找不到 #include 到这里我们的材料都备齐了,接下来就是如何把这些原材料用起来了。 在我们新建的类中,创建这两个IIC常用函数。如下图: 然后还是生成头文件,如下图: 然后再次用ndk编译。如下图: 编译完成后。 我们去MainActivity中新建一个IIC读取的线程。 如下图 这里讲解一下我们的code: 这里的 u8BusIndex 是我们要使用的i2c设备端口号是多少。这里我们用的是i2c-1。设备图如下 然后 u32Register 就是我们要写入的寄存器地址,我们这里用的是0x10000001。 有的同学会疑惑,slave address去哪里了。集成在我们底层cpp的code里面了。 然后最后的参数就是 read/write 数据了。 跑到这里,工作还没做完。 接下来我们要设置设备端口的执行权限。 我们来到Android stdio的terminal中。前提要保证RK3288和我们的PC在同一个网关下。 找到RK3288的IPv4 IP:192.168.2.168(这个是我的IP,每个人的都不一样) 输入指令: adb connect 192.168.2.168:5555 回车 然后输入 adb shell进入RK3288, 再su 进入root 模式, 修改一下i2c-1的权限为777,即可。如下图: 修改成功后,连接一下硬件。 从示波器就可以看到我们读写的数据了。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
808 浏览 0 评论
1024 浏览 1 评论
887 浏览 1 评论
2113 浏览 1 评论
3373 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 17:01 , Processed in 0.893683 second(s), Total 72, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号