Renesas R7FA8D1BH (Cortex®-M85)控制ISLS29035

news2024/9/19 9:34:47

目录

概述

 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 I2C驱动实现

2.1  硬件接口

2.2 FSP配置I2C

 2.3 I2C驱动程序实现

3 ISL29035驱动程序实现

3.1 驱动程序功能介绍

3.2 代码实现

4 测试功能

4.1 编写测试代码

4.2 测试


概述

本文主要介绍ISLS29035芯片驱动的相关内容,包括ISLS29035芯片的特性,其内部各个寄存器的功能,以及和MCU相连后其时序操作的注意点。还介绍了R7FA8D1BH上I2C模块的使用方法,包括FSP配置参数,I2C驱动代码,以及使用I2C接口驱动ISLS29035的功能实现方法等内容。

 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 I2C驱动实现

2.1  硬件接口

本系统采用野火瑞萨R7FA8D1BHECBD-BTB开发板,其与Sensor之间的接口关系如下:

2.2 FSP配置I2C

1) 在Pins面板上配置I2C IO port

2) 创建Stack对象

 

3)配置Stack的参数

 2.3 I2C驱动程序实现

使用FSP完成参数配置后,生成硬件相关的配置代码,接下来需要实现I2C相关的驱动接口

1)创建bsp_i2c.c文件,编写如下代码

 /*
 FILE NAME  :  bsp_i2c.c
 Description:  user i2c interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "bsp_i2c.h" 
#include "hal_data.h"

#define TIME_OUT    10000
 
i2c_master_event_t g_i2c_callback_event;

void sci_b_i2c_master_callback (i2c_master_callback_args_t * p_args)
{
    if (NULL != p_args)
    {
        g_i2c_callback_event = p_args->event;
    }
}  

void i2c2_init_para( uint32_t const slaveAddress )
{
    fsp_err_t err;

    err = R_SCI_B_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
    assert(FSP_SUCCESS == err);

    err = R_SCI_B_I2C_SlaveAddressSet(&g_i2c0_ctrl, slaveAddress, I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
}

void i2c2_write_bytes(uint8_t *pbuff, uint16_t length )
{
    unsigned int timeout_ms = TIME_OUT;
    fsp_err_t err;
    
    err = R_SCI_B_I2C_Write(&g_i2c0_ctrl, pbuff, length, false);
    assert(FSP_SUCCESS == err);
    
    g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_TX_COMPLETE != g_i2c_callback_event) && timeout_ms)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms--;;
    }
}

void i2c2_read_bytes(uint8_t *pbuff, uint16_t length )
{
    unsigned int timeout_ms = TIME_OUT;
    fsp_err_t err;
    
    g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;
    err = R_SCI_B_I2C_Read(&g_i2c0_ctrl, pbuff, length, false);
    assert(FSP_SUCCESS == err);
    
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_RX_COMPLETE != g_i2c_callback_event) && timeout_ms)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms--;;
    }
}
 
/* End of this file */

 

2)创建bsp_i2c.h文件,编写如下代码:

 /*
 FILE NAME  :  bsp_i2c.h
 Description:  user i2c interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
 #ifndef BSP_I2C_H
 #define BSP_I2C_H
 #include "hal_data.h"

void i2c2_init_para( uint32_t const slaveAddress );
void i2c2_write_bytes(uint8_t *pbuff, uint16_t length );
void i2c2_read_bytes(uint8_t *pbuff, uint16_t length );


#endif   /* BSP_I2C_H */

3 ISL29035驱动程序实现

3.1 驱动程序功能介绍

驱动程序分成两个层次,底层使用I2C接口,实现读写寄存器功能,在应用层中调用者两个函数接口实现ISL29035芯片的初始化功能,还实现一个接口:实时读取lux值功能。

3.2 代码实现

创建ISL29035_drv.c,编写如下代码:

 /*
 FILE NAME  :  ISL29035_drv.c
 Description:  user ISL29035 interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
/* isl29035 i2c address */
#include "bsp_i2c.h" 
#include "hal_data.h"
#include "IsL29035_drv.h"
#include <string.h>

#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)


static unsigned int convert_lux(unsigned int data)
{
   return (unsigned int)((double)ISL29035_LUX_SCALE_4K / (double)ISL29035_RES_8BIT * data);
}

static uint8_t write_reg( uint8_t reg, uint8_t data)
{
    fsp_err_t err;
    unsigned char buff[2];
    
    err = R_SCI_B_I2C_SlaveAddressSet( &g_i2c0_ctrl, 
                                       ISL29035_ADDR, 
                                       I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);

    buff[0] = reg;
    buff[1] = data;
    i2c2_write_bytes(buff, 2);
    
    return 0;
}

static uint8_t read_regs(uint8_t reg, uint8_t len, uint8_t *buf)
{
    fsp_err_t err;
    uint8_t msgs[2];

    err = R_SCI_B_I2C_SlaveAddressSet( &g_i2c0_ctrl, 
                                     ISL29035_ADDR, 
                                     I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
    
    msgs[0] = reg;
    i2c2_write_bytes(msgs, 1);
    
    R_BSP_SoftwareDelay( 1, BSP_DELAY_UNITS_MILLISECONDS);
    i2c2_read_bytes( buf, len);
    
    return 0;
}


int IsL29035_read_lux(unsigned int *lux )
{
    int ret;
    unsigned char   buff[1];
    unsigned int tempval;

    ret = read_regs(ISL29035_DATA_L_ADDR, 1, buff);
    if( ret < 0 )
    {
        printf("get the lux value failure.\n");
        return -1;
    }

    tempval = buff[0];
    ret = read_regs(ISL29035_DATA_H_ADDR, 1, buff);
    if( ret < 0 )
    {
        printf("get the lux value failure.\n");
        return -1;
    }
    tempval |= (unsigned int)(buff[0]<<8);

    *lux = convert_lux( tempval );

    return 0;
}


void IsL29035_Init( void )
{  
    fsp_err_t err;
    
    err = R_SCI_B_I2C_SlaveAddressSet( &g_i2c0_ctrl, 
                                       ISL29035_ADDR, 
                                       I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
    
    write_reg(ISL29035_COMMAND_1_ADDR, ISL29035_COMMAND_1_INIT);
    write_reg(ISL29035_COMMAND_2_ADDR, ISL29035_COMMAND_2_INIT);
}



创建ISL29035_drv.h,编写源代码的头文件:

 /*
 FILE NAME  :  ISL29035_drv.h
 Description:  user ISL29035 interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#ifndef USER_ISL29035_DRV_H_
#define USER_ISL29035_DRV_H_


void IsL29035_Init( void );
int IsL29035_read_lux(unsigned int *lux );


#endif /* USER_ISL29035_DRV_H_ */

4 测试功能

4.1 编写测试代码

编写测试代码,其主要实时的从ISL29035中读取lux值,然后将该值显示在OLED屏幕上,其详细代码如下:

代码11行: 在主函数中调用IsL29035_Init,实现ISL29035的初始化功能

代码153行:调用IsL29035_read_lux接口,实时获取lux值

代码170~171行:  在OLED上显示数据

 源代码如下:

void ui_disISL29035( void )
{
    static int temp=0;
    uint8_t dataBuff[32];
    
    IsL29035_read_lux( &luxValue );
    if( temp != timer0_get_tick( ))
    {
        if( (tick_cnt % 100) == 0 )
        {
            // ui DS18B20
            // printf(" DS18B20 Temperature(C):  %.02f \n", st_dsval.temperatureVal );
            {
                memset((char*)dataBuff, 0, sizeof(dataBuff));
                sprintf((char*)dataBuff, "ISL29035(Lux): ");
                oled_SetCharSize( FONT_16 );
                oled_PrintfString(1,3, dataBuff);
            }

            // display ds18b20 value 
            {   
                memset((char*)dataBuff, 0, sizeof(dataBuff));
                sprintf((char*)dataBuff, "%d ", luxValue);
                oled_PrintfString(60,6, dataBuff);
                
            }
            
            LED2_TOGGLE;
        }
        temp = timer0_get_tick( );
        tick_cnt++;
    }
}

4.2 测试

编译代码,下载代码到板卡中

下载代码到板卡中,其运行结果如下:

OLED上显示数据

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

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

相关文章

2分钟解决联想电脑wifi功能消失 网络适配器错误代码56

分钟解决联想电脑wifi功能消失 网络适配器错误代码56 现象 原因 电脑装了虚拟机&#xff0c;导致网络适配器冲突。我的电脑是装了vm虚拟机&#xff0c;上次更新系统后wifi图标就消失了。 解决方案 1、先卸载虚拟机 2、键盘按winr&#xff0c;弹出运行窗口&#xff0c;输入“…

系统架构设计师 需求分析篇一

&#x1f4d8; 结构化分析SA 思想 自顶向下&#xff1a;像剥洋葱一样&#xff0c;层层深入&#xff0c;大问题拆成小问题&#xff0c;再拆成更小的问题。 核心模型 数据字典 &#x1f4d4;&#xff1a;记录数据元素的点点滴滴&#xff0c;从属性到使用方式&#xff0c;无所…

QUIC的丢包处理

QUIC的重试数据包&#xff08;Retry Packet&#xff09;为什么会触发重启另一个连接 安全性考量 防止重放攻击 重试数据包&#xff08;Retry Packet&#xff09;是在初始握手过程中由服务端发送给客户端&#xff0c;用于验证客户端的IP地址&#xff0c;以防止重放攻击。 在一…

STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)

在研究声音、电力或任何形式的波形时&#xff0c;我们常常需要穿过表面看本质。FFT&#xff08;快速傅里叶变换&#xff09;就是这样一种强大的工具&#xff0c;它能够揭示隐藏在复杂信号背后的频率成分。本文将带你走进FFT的世界&#xff0c;了解它是如何将时域信号转化为频域…

【Android】【Compose】实现列表数据添加

序言 在使用列表的时候&#xff0c;以前是使用 Layout 布局里面添加Recyclerview进行列表的显示&#xff0c;但是在Compose里面&#xff0c;是没有这个Recyclerview使用的&#xff0c;那Compose怎么实现列表数据呢&#xff1f; 使用 【LazyColumn】 首先创建一个Compose项目…

java,深拷贝和浅拷贝

在 Java 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是对象拷贝的两种方式&#xff0c;主要区别在于它们如何处理对象的内部引用。 目录 一、浅拷贝&#xff08;Shallow Copy&#xff09; 实现方式 二、深拷贝&…

国际商城系统怎么弄 跨境电商商城怎样上线

国际商城系统一般涉及多个关键步骤。首先&#xff0c;需要选择合适的平台或开发工具&#xff0c;如商淘云国际电商系统或自定义开发。其次&#xff0c;系统应支持多语言、多币种以及国际支付网关&#xff0c;以满足全球客户的需求。第三&#xff0c;确保系统具有强大的物流和配…

推荐5款AI论文大纲生成器,一键极速生成!

在当今学术研究和写作领域&#xff0c;AI论文大纲生成器的出现极大地提高了写作效率和质量。以下是五款功能强大且全面的AI论文大纲生成器推荐&#xff1a; 一、千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和自然语言处理技术的AI写作助手&#xff0c;旨在帮助用户…

新160个crackme - 058-CZG-crackme1

运行分析 按下OK键后&#xff0c;程序退出 PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida函数栏发现winMain(x,x,x,x)&#xff0c;即打开窗口&#xff0c;双击函数跟进 继续跟进 双击DialogFunc函数&#xff0c;这个是窗口逻辑 继续跟进sub_401090函…

数据结构----栈和队列

&#xff08;一&#xff09;栈 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First …

GFS 分布式文件系统 GlusterFS

一、GlusterFS概述 1.1、GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 包括其去中心化&#xff08;无元数据服务器&#xff09;的特性&#xff0c;这有…

【苍穹外卖】总结

1 pom 依赖 1.1 MyBatis Spring 用于简化 MyBatis 与 Spring Boot 的集成&#xff0c;提供了对 MyBatis 框架的自动配置支持&#xff0c;简化了数据访问层的开发 1.2 Lombok Lombok 是一个 Java 库&#xff0c;能够通过注解自动生成常见的代码&#xff08;如 getter、setter、…

双亲委派机制知识点

类加载器 双亲委派模型 为什么采用双亲委派模型 打破双亲委派机制的场景 Tomcat 打破双亲委派机制:目的是可以加载不同版本的jar包 实现类隔离&#xff1a;在Tomcat中&#xff0c;每个Web应用使用独立的类加载器加载类文件&#xff0c;这样做的好处在于&#xff0c;当在同一T…

C++二叉搜索树(二叉树进阶)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C二叉搜索树(二叉树进阶) 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 二叉搜索树…

Java重修笔记 第五十七天 坦克大战(七)多线程基础 - 编程练习

1. 线程之间的协调控制&#xff08;通知方式&#xff09; public class Homework04 {public static void main(String[] args) {// 在 main 方法中启动两个线程// 第一个线程内循环打印 1 到 100 以内的整数// 直到第二个线程从键盘读取到 "Q" 指令后结束第一个线程…

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…

LC并联电路在正弦稳态下的传递函数推导(LC并联谐振选频电路)

LC并联电路在正弦稳态下的传递函数推导&#xff08;LC并联谐振选频电路&#xff09; 本文通过 1.解微分方程、2.阻抗模型两种方法推导 LC 并联选频电路在正弦稳态条件下的传递函数&#xff0c;并通过仿真验证不同频率时 vo(t) 与 vi(t) 的幅值相角的关系。 电路介绍 已知条件…

Axure RP实战:打造高效图形旋转验证码

Axure RP实战&#xff1a;打造高效图形旋转验证码 在数字产品设计的海洋中&#xff0c;验证码环节往往是用户交互体验的细微之处&#xff0c;却承载着验证用户身份的重要任务。 传统的文本验证码虽然简单直接&#xff0c;但随着用户需求的提高和设计趋势的发展&#xff0c;它…

vue2的diff算法

Vue2 的虚拟 DOM diff 算法是一种高效的算法&#xff0c;用于比较新旧两个虚拟 DOM 树&#xff0c;找出差异并更新到真实 DOM 上。这个算法的核心在于尽量减少不必要的 DOM 操作&#xff0c;提高性能。 虚拟dom&#xff1a;把DOM数据化&#xff0c;先通过不断地操作数据&#…

如何在手机端跑大模型?

最近新入手了一台 arm 开发板&#xff0c;内置安装了 Android 13 系统。 昨天把网络问题给解决了&#xff1a;安卓连接 WIFI 但无法上网&#xff1f;盘点踩过的那些坑 今日分享&#xff0c;继续带大家实操&#xff1a;如何把大模型&#xff08;LLM&#xff09;部署到移动端&a…