linux i2c驱动实例之ISL29035

目录

概述

1 认识ISL29035

1.1 ISL29035特征

1.2  ISL29035工作电路

1.3 ISL29035工作时序分析

1.4 ISL29035相关的寄存器

1.4.1 COMMAND-1( 0x00 )

1.4.2 COMMAND-11(0x01)

1.4.3 DATA寄存器(0x02和0x03)

1.4.4 中断报警寄存器(0x04和0x05)

1.4. 5 中断报警寄存器(0x06和0x07)

1.4. 6 ID寄存器(0x0f)

1.5 采样值到实际Lux值转换

2 编写ISL29035驱动程序

3 编写ISL29035应用程序

4 运行应用程序App

4.1 编译测试程序

4.2 运行测试程序

5 逻辑分析仪查看波形


概述

        本文介绍ISL29035的使用方法,详细介绍了其各个寄存器的用法和配置参数,并用具体的案例介绍如何将采样数据转化为实际lux。应用linux平台架构实现其驱动程序,并编写应用App,验证驱动程序的性能。

1 认识ISL29035

1.1 ISL29035特征

ISL29035 - Integrated Digital Light Sensor with Interrupt | Renesas

      ISL29035是一款数字型光感传感器,采用通用I2C接口,可实时采集环境的光照强度。其主要特点如下:  

关注几个核心参数:

1) 其采用16-bit ADC采样数据,所以,该传感器有这个极高的分辨率

2)数据采样区间: 1: 420 0000

3)采用标准的I2C协议,便于使用MCU驱动该芯片

1.2  ISL29035工作电路

下图是官方给的标准工作电路,采用标准的i2c通信电路,还额外增加一个INT中断IO,用于对外提供一个报警信号,其在低电平时有效。 

sensor IO接口定义如下:

1.3 ISL29035工作时序分析

1) 写数据时序

2) 读数据时序

3) 连续读多个数据时序

1.4 ISL29035相关的寄存器

其主要寄存器如下表:

1.4.1 COMMAND-1( 0x00 )

其中:B7,B6,B5用于配置 采样方式,例如:配置为101则为连续采样模式 

1.4.2 COMMAND-11(0x01)

在该寄存器中,B0和B1用于配置lux的范围

B3和B2用于配置ADC的采样精度:

1.4.3 DATA寄存器(0x02和0x03)

data寄存器的地址分别为0x02(数据低 8个 bit)和0x03(数据高8个bit)

1.4.4 中断报警寄存器(0x04和0x05)

该寄存器的值用于设置报警数据的下限值

1.4. 5 中断报警寄存器(0x06和0x07)

该寄存器的值用于设置报警数据的上限值

1.4. 6 ID寄存器(0x0f)

该寄存器用于存在sensor的ID值

1.5 采样值到实际Lux值转换

根据datasheet的资料可得:

Range 可取的值(Lux): 1000, 4000, 16000, 64000

Count( Max) 可取的值:    16,      256,  4096,  65536

举个例子:

配置 address = 0x01寄存器, B3B2 = 10, adc 采样为8bit, Count(max) = 256

                                                 B1B0 = 01, Lux的range = 4000

当前从DATA寄存器读取的值为: 120, 其对应的lux值为 val  =  (4000/256)* 120 

2 编写ISL29035驱动程序

驱动程序 .c 文件

/***************************************************************
Copyright  2024-2029. All rights reserved.
文件名     : drv_isl29035.c
作者       : tangmingfei2013@126.com
版本       : V1.0
描述       : isl29035驱动程序
其他       : 无
日志       : 初版V1.0 2024/02/01***************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <linux/fs.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <time.h>/* isl29035 i2c address */
#define ISL29035_ADDR                          (0x44U)/* isl29035 register */
#define ISL29035_COMMAND_1_ADDR                (0x00U)
#define ISL29035_COMMAND_2_ADDR                (0x01U)
#define ISL29035_DATA_L_ADDR                   (0x02U)
#define ISL29035_DATA_H_ADDR                   (0x03U)
#define ISL29035_INT_LT_LSB_ADDR               (0x04U)
#define ISL29035_INT_LT_MSB_ADDR               (0x05U)
#define ISL29035_INT_HT_LSB_ADDR               (0x06U)
#define ISL29035_INT_HT_MSB_ADDR               (0x07U)
#define ISL29035_ID_ADDR                       (0x0FU)/* 10100000: enable ALS consinuously  */
#define ISL29035_COMMAND_1_INIT                (0xA0U)/* 00000110: Lux full scale range is 4000 and ADC  */
#define ISL29035_COMMAND_2_INIT                (0x06U)/* ISL29035 ADC resolution */
#define ISL29035_RES_16BIT                     (65536U)
#define ISL29035_RES_12BIT                     (4096U)
#define ISL29035_RES_8BIT                      (256U)
#define ISL29035_RES_4BIT                      (16U)/* ISL29035 full scale lux range */
#define ISL29035_LUX_SCALE_1K                  (1000U)
#define ISL29035_LUX_SCALE_4K                  (4000U)
#define ISL29035_LUX_SCALE_16K                 (16000U)
#define ISL29035_LUX_SCALE_64K                 (64000U)#define DEV_FILE                                "/dev/i2c-1"static int fd = -1;static unsigned int convert_lux(unsigned int data)
{return (unsigned int)((double)ISL29035_LUX_SCALE_4K / (double)ISL29035_RES_8BIT * data);
}static int isl29035_drv_init(void)
{fd = open(DEV_FILE, O_RDWR);if( fd < 0 ){close( fd );printf("%s %s i2c device open failure: %s\n", __FILE__, __FUNCTION__, strerror(errno));return -1;}ioctl(fd, I2C_TENBIT, 0);ioctl(fd, I2C_SLAVE, ISL29035_ADDR);return fd;
}int isl29035_init(void)
{int ret;unsigned char   buff[2];isl29035_drv_init();buff[0] = ISL29035_COMMAND_1_ADDR;buff[1] = ISL29035_COMMAND_1_INIT;ret = write(fd, buff, 2);if( ret < 0 ){printf("write temper cmd to isl29035 register failure.\n");return -1;}buff[0] = ISL29035_COMMAND_2_ADDR;buff[1] = ISL29035_COMMAND_2_INIT;ret = write(fd, buff, 2);if( ret < 0 ){printf("write temper cmd to isl29035 register failure.\n");return -1;}return 0;
}int isl29035_read_lux(unsigned int *lux )
{int ret;unsigned char   buff[1];unsigned int tempval;buff[0] = ISL29035_DATA_L_ADDR;ret = write(fd, buff, 1);if( ret < 0 ){printf("write  cmd to isl29035 register failure.\n");return -1;}ret = read(fd, buff, 1);if( ret < 0 ){printf("get the lux value failure.\n");return -1;}tempval = buff[0];buff[0] = ISL29035_DATA_H_ADDR;ret = write(fd, buff, 1);if( ret < 0 ){printf("write  cmd to isl29035 register failure.\n");return -1;}ret = read(fd, buff, 1);if( ret < 0 ){printf("get the lux value failure.\n");return -1;}tempval |= buff[0]<<8;printf("tempval = %d \r\n", tempval);*lux = convert_lux( tempval );return 0;
}

驱动文件 .h 

#ifndef __DRV_ISL29035_H
#define __DRV_ISL29035_H#ifdef __cplusplus
extern "C" {
#endifint isl29035_init(void);
int isl29035_read_lux(unsigned int *lux );#ifdef __cplusplus
}
#endif#endif /* __DRV_ISL29035_H */

3 编写ISL29035应用程序

该程序主要实现,从sensor中读取lcount值,并将其转换成环境实际的lux值,其代码如下:

/***************************************************************
Copyright  2024-2029. All rights reserved.
文件名     : test_isl19035.c
作者       : tangmingfei2013@126.com
版本       : V1.0
描述       : 验证dev_isl19035.c 
其他       : 无
日志       : 初版V1.0 2024/02/01***************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <linux/fs.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <time.h>
#include "drv_isl29035.h"int main(void)
{unsigned int temper;int count_run = 10000;int set;set = isl29035_init();if( set < 0){printf("initial isl19035 failure.\n");return -1;}while( count_run > 0){set = isl29035_read_lux( &temper );if(set != -1){printf( "\r\n lux:  %d ", temper);}else{printf("read isl19035 failure.\n");}count_run--;sleep(1);}return 0;
}

4 运行应用程序App

4.1 编译测试程序

编写测试程序的Makefile 

CFLAGS= -Wall -O2
CC=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
STRIP=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-striptest_isl29035: test_isl29035.o drv_isl29035.o$(CC) $(CFLAGS) -o test_isl29035 test_isl29035.o drv_isl29035.o$(STRIP) -s test_isl29035clean:rm -f test_isl29035 test_isl29035.o drv_isl29035.o

使用Make命令,编译该程序。然后将生成的bin文件copy到NFS挂载的目录下,方便在板卡运行该App。

4.2 运行测试程序

进入到NFS挂载目录下,可以看到生成的App文件:

运行测试程序,可以得到实际环境中的lux值,使用障碍物遮挡sensor,可以看到光照强度的变化

5 逻辑分析仪查看波形

使用逻辑分析查看一个完整的读取实时lux值波形图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux时钟类型

背景&#xff1a;在线程中使用wait时&#xff0c;中间修改了系统时间&#xff0c;线程一直阻塞&#xff0c;并未向下执行。 原因分析&#xff1a;wait等待时间采用了系统时间去等待&#xff0c;系统时间向后修改后&#xff0c;无法等到相应的时间点&#xff0c;从而导致线程阻…

解决Django应用部署时激活链接缺少端口号的问题

引言 在当今技术迅速发展的时代&#xff0c;前后端分离已经成为现代Web开发的一项标准实践。然而&#xff0c;当我们将这些先进的架构部署到生产环境时&#xff0c;常常会遇到一些预料之外的挑战。 问题说明 在一个典型的例子中&#xff0c;我在Windows环境下开发了一个采用…

离线环境怎么下载python依赖包

公司内网环境无网络&#xff0c;运行自动化脚本需要安装python模块 1、脚本依赖包及其版本获取&#xff0c;记录在requirements.txt中 pipreqs ./script --encodingutf8 requirements.txt注意&#xff0c;这里是将./script 里的python模块自动扫描并写入到requirements.txt中…

假期刷题打卡--Day23

1、MT1190分数乘法 输入5组分数&#xff0c;对他们进行乘法运算&#xff0c;输出结果。不考虑分母为0等特殊情况。 格式 输入格式&#xff1a; 输入整型&#xff0c;每组一行&#xff0c;如样例所示。 输出格式&#xff1a; 输出计算结果实型&#xff0c;如样例所示。 样…

[Vue3]父子组件相互传值数据同步

简介 vue3中使用setup语法糖&#xff0c;父子组件之间相互传递数据及数据同步问题 文章目录 简介父传子props传递值 使用v-bind绑定props需要计算toRefcomputed emit传递方法 使用v-on绑定 子传父expose v-model总结 父传子 props传递值 使用v-bind绑定 父组件通过props给子…

Python基础知识:Python与序列相关的内置函数

与序列相关的内置函数如表所示。 与序列相关的内置函数 函数的作用 len(seq) 计算序列的长度&#xff08;包含多少个元素&#xff09; max(seq) 查找序列中的最大元素 min(seq) 查找序列中的最小元素 list(seq) 将序列转换为列表&#xff0c;注意不能转换字典 str(se…

openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围

文章目录 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围214.1 性能因素214.2 调优范围确定 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围 数据库性能调优通常发生在用户对业务的执行效率不满意&#xff0c;期望通过调优加快业务执行的情况下。正…

如何解决部分图片读取转化异常的问题

问题描述 接触到一个数据集&#xff0c;有个别图片在读取转化的时候出现了异常&#xff0c;由于图片之间有关联&#xff0c;导致后续图片无法时候。 解决方法 将异常的图片转为白色或者黑色的图片&#xff0c;保证其他的图片可以正常使用&#xff01;代码如下&#xff1a; …

两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能 默认高度下文本超出隐藏&#xff0c;点击展开可查看所有内容&#xff0c;点击收起可折叠 方法一&#xff1a;通过html和css实现 代码部分 html:<div className"expand-fold"><input id"check-box" type"checkbox&qu…

【Android】240204 android studio build.gradle.kts APK名字带日期

通过Android studio 生成 APK 名字的时候&#xff0c;带年月日时&#xff0c;可以在 build.gradle 里面定义&#xff1b; 在Gradle脚本的build任务中&#xff0c;每当我构建项目时&#xff0c;我都希望获得当前时间戳&#xff0c;并将其保存到项目资源目录中的文件中。如果我理…

04-尚硅谷Vue_Vue中的ajax

文章目录 1. 解决开发环境 Ajax 跨域问题 【前端】尚硅谷Vue2-Vue3全家桶笔记目录贴 1. 解决开发环境 Ajax 跨域问题

Camunda会签、或签、比例签

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;说在前面 …

EasyX图形库学习(二、文字输出)

目录 一、文字绘制函数 字体属性结构体:logfont 文字输出 outtextxy 在指定位置输出字符串。 ​编辑 但如果直接使用,可能有以下报错&#xff1a; 三种解决方案&#xff1a; 将一个int类型的分数,输出到图形界面上 如果直接使用&#xff1a; 会把score输入进去根据A…

【C/C++ 13】C++11高效特性

目录 一、初始化列表 二、auto 三、decltype 四、可变参数列表 五、lambda表达式 C11在C98的基础上增添了许多特性&#xff0c;但是同时也使得C程序的开发变得复杂繁琐&#xff0c;让众多开发者苦不堪言&#xff0c;于是我们需要从C11新增舔的特性中选择一些能够提高开发效…

ROS从入门到精通4-1:Docker安装与常用命令总结

目录 0 专栏介绍1 Docker与机器人应用2 Docker安装步骤3 Docker常用命令3.1 创建与启动容器3.2 暂停与删除容器3.3 容器文件拷贝3.4 构建镜像与上下文 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS进…

【文件增量备份系统】前端项目构建

文章目录 创建项目安装项目依赖引入element plus组件下载组件在main.js中使用组件测试 整合路由router下载组件创建路由管理器index.js使用路由App.vue上面使用 <router-view />测试 整合axios下载组件工具类axiosRequest.js工具类使用 创建项目 damwangrunqindeMBP dev…

车载测试中:如何处理 bug

一&#xff1a;Jira 提交 bug 包含那些内容 二&#xff1a;如何处理现上 bug 三&#xff1a;车载相关的 bug 如何定位 四&#xff1a;遇到 bug &#xff0c;复现不出来怎么办 五&#xff1a;bug 的处理流程 一&#xff1a;Jira 提交 bug 包含那些内容二&#xff1a;如何处理现上…

Java设计模式-模板方法模式(14)

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对…

uniapp android和微信小程序如何实现PDF在线预览

Hello大家好&#xff01;我是咕噜铁蛋&#xff0c;UniApp在开发移动应用时提供了跨平台的解决方案&#xff0c;能够同时支持Android和iOS系统&#xff0c;而微信小程序则是一种轻量级的应用形式&#xff0c;可以在微信内直接运行。本文将探讨如何利用UniApp和微信小程序实现PDF…

k8s学习-Kubernetes的网络

Kubernetes作为编排引擎管理着分布在不同节点上的容器和Pod。Pod、Service、外部组件之间需要⼀种可靠的方找到彼此并进行通信&#xff0c;Kubernetes网络则负责提供这个保障。 1.1 Kubernetes网络模型 Container-to-Container的网络 当Pod被调度到某个节点&#xff0c;Pod中…