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.hqwc.cn/news/459926.html

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

相关文章

阿里云学生服务器完成验证领取300元无门槛代金券和优惠权益

阿里云高校计划「云工开物」学生和教师均可参与&#xff0c;完成学生认证和教师验证后学生可以免费领取300元无门槛代金券和3折优惠折扣&#xff0c;适用于云服务器等全量公共云产品&#xff0c;订单原价金额封顶5000元/年&#xff0c;阿里云百科aliyunbaike.com分享阿里云高校…

Redis——缓存设计与优化

讲解Redis的缓存设计与优化&#xff0c;以及在生产环境中遇到的Redis常见问题&#xff0c;例如缓存雪崩和缓存穿透&#xff0c;还讲解了相关问题的解决方案。 1、Redis缓存的优点和缺点 1.1、缓存优点&#xff1a; 高速读写&#xff1a;Redis可以帮助解决由于数据库压力造成…

STM32——LCD(1)认识

目录 一、初识LCD 1. LCD介绍 2. 显示器的分类 3. 像素 4. LED和OLED显示器 5. 显示器的基本参数 &#xff08;1&#xff09;像素 &#xff08;2&#xff09;分辨率 &#xff08;3&#xff09;色彩深度 &#xff08;4&#xff09;显示器尺寸 &#xff08;5&#xff…

免费领取阿里云学生专享服务器和300元无门槛代金券

阿里云学生服务器优惠活动&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习成长历程&#xff0c;拥有一台云服务器是很…

Unity3d Shader篇(五)— Phong片元高光反射着色器

文章目录 前言一、Phong片元高光反射着色器是什么&#xff1f;1. Phong片元高光反射着色器的工作原理2. Phong片元高光反射着色器的优缺点优点缺点 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总…

邮箱营销软件推荐?企业邮箱群发会限制吗?

邮箱营销平台怎么选择&#xff1f;哪种邮箱适合做外贸邮件群发&#xff1f; 邮箱营销凭借其精准触达、低成本和高回报的特点&#xff0c;依然是许多企业不可或缺的营销手段。该如何选择一款适合自己的工具呢&#xff1f;蜂邮EDM将为您推荐几款优秀的邮箱营销软件&#xff0c;并…

【Git】08 多人单分支协作场景

文章目录 一、场景1&#xff1a;不同人修改不同文件1.1 场景描述1.2 场景复现1.2.1 克隆到本地1.2.2 新建分支1.2.3 B修改、提交与推送1.2.4 A修改与提交1.2.5 B再次修改并推送1.2.6 A推送报错 1.3 解决 二、场景2&#xff1a;不同人修改同文件的不同区域2.1 场景描述2.2 场景复…

代码随想录算法训练营第30天| 51. N皇后、总结

51. N皇后 完成 思路&#xff1a; 如何用回溯法搜索二维棋盘是这道题目和之前不一样的地方&#xff0c;也是题目的难点。 在树形结构中&#xff0c;同层取同一行棋盘的不同列遍历。每递归一次就往下遍历一行。 代码 class Solution {List<List<String>> res n…

Pytorch+NCCL源码编译

目录 环境1. 安装cudnn2. 使用pytorch自带NCCL库进行编译3. 修改NCCL源代码并重新编译后测试&#xff0c;体现出源码更改 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8python 3.10torch V2.0.1 nccl 2.14.3NVIDIA GeForce RTX 4090 *2 1.…

疑似针对安全研究人员的窃密与勒索

前言 笔者在某国外开源样本沙箱平台闲逛的时候&#xff0c;发现了一个有趣的样本&#xff0c;该样本伪装成安全研究人员经常使用的某个渗透测试工具的破解版压缩包&#xff0c;对安全研究人员进行窃密与勒索双重攻击&#xff0c;这种双重攻击的方式也是勒索病毒黑客组织常用的…

python入门篇11-面向对象的基础使用

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. python基础使用2.1 面向对象的基础使用2.1.1 创建类2.1.2 使用对象(定义成员变量)2.1.3 成员方法的定义与使用2.1.4 构造方法的使用2.1.5 常用魔术方法 2.2 面向对象思想核心2.2.1 面向对象_私…

【知识整理】管理即服务,识人、识己

1. 背景 一个人的力量是有限的&#xff0c;如何规模化生产&#xff0c;人员的规模化组织&#xff0c;如何提升合作的规模和效率。 管理的本质&#xff1a; 1、服务他人&#xff1f; 2、激发主动性&#xff1f; 3、氛围宽松&#xff1f; 上面是理念&#xff0c; 1、那如何…