色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RA4M2開發(3)----讀取ISL29035數據,并在OLED上顯示,串口打印

嵌入式單片機MCU開發 ? 來源:嵌入式單片機MCU開發 ? 作者:嵌入式單片機MCU開 ? 2023-07-27 10:11 ? 次閱讀

概述

  1. 首先導入必要的庫文件,包括I2C驅動和OLED驅動。
  2. 在代碼中配置I2C接口,并初始化I2C驅動。
  3. 配置ISL29035傳感器,包括配置傳感器的工作模式和量程。
  4. 使用I2C讀取ISL29035傳感器的數據,并將其存儲在變量中。
  5. 初始化OLED驅動,并在OLED屏幕上顯示讀取的數據。 請注意,這僅是一個大致的步驟,具體實現可能因硬件和軟件環境而異。 對于OLED的配置,可以查看往期的博客。

視頻教學

[https://www.bilibili.com/video/BV1wc411g7xU/]

csdn課程

csdn課程更加詳細。

[https://edu.csdn.net/course/detail/36131]

樣品申請

[https://www.wjx.top/vm/wBbmSFp.aspx#]

硬件準備

首先需要準備一個開發板,這里我準備的是芯片型號R7FAM2AD3CFP的開發板:

在這里插入圖片描述

樣品申請

[https://www.wjx.top/vm/wBbmSFp.aspx#]

IIC配置

配置RA4M2的I2C接口,使其作為I2C master進行通信。 對于OLED的IIC配置,可以查看往期的博客。 查看ISL29035說明書,最小電路圖如下所示。

在這里插入圖片描述

由于需要讀取ISL29035數據,需要使用IIC接口,這里使用PMOD2上的接口(P410和P411)。

在這里插入圖片描述

點擊Stacks->New Stack->Connectivity -> I2C Master(r_sci_i2c)。

在這里插入圖片描述

查看說明書可以得知,ISL29035的地址為0x44(1000100)。

在這里插入圖片描述

設置IIC的配置。

在這里插入圖片描述

R_SCI_I2C_Open()函數原型

在這里插入圖片描述

R_SCI_I2C_Open()函數為執行IIC初始化,開啟配置如下所示。

/* Initialize the I2C module */
        err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
        /* Handle any errors. This function should be defined by the user. */
        assert(FSP_SUCCESS == err);

R_SCI_I2C_Write()函數原型

在這里插入圖片描述

R_SCI_I2C_Write()函數是向IIC設備中寫入數據,寫入格式如下所示。

err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);
    assert(FSP_SUCCESS == err);

R_SCI_I2C_Read()函數原型

在這里插入圖片描述

R_SCI_I2C_Read()函數是向IIC設備中讀取數據,讀取格式如下所示。

err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);
    assert(FSP_SUCCESS == err);

sci_i2c_master_callback()回調函數

對于數據是否發送完畢,可以查看是否獲取到I2C_MASTER_EVENT_TX_COMPLETE字段。

在這里插入圖片描述

/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event1 = p_args- >event;
    }
}

ISL29035寫數據

對于ISL29035寫數據,手冊上的操作方式如下所示。 設備地址+操作地址+數據

在這里插入圖片描述

初始化程序如下所示。

void DigitalLightISL29035_writeRegister( int reg_address, uint8_t val) {

    uint8_t ii[2]={0x00,0x00};
    ii[0] = reg_address;
    ii[1] = val;


    err = R_SCI_I2C_Write(&g_i2c0_ctrl, ii, 0x02, false);
           assert(FSP_SUCCESS == err);
           /* Since there is nothing else to do, block until Callback triggers*/
           //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
           while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1 >0)
           {
               R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
               timeout_ms1--;
           }
           if (I2C_MASTER_EVENT_ABORTED == i2c_event1)
           {
               __BKPT(0);
           }
           /* Read data back from the I2C slave */
           i2c_event1 = I2C_MASTER_EVENT_ABORTED;
           timeout_ms1           = 100000;


}

ISL29035讀數據

對于ISL29035讀數據,手冊上的操作方式如下所示。 設備地址+操作地址+設備地址+數據讀取

在這里插入圖片描述

讀取操作函數如下所示,先發送操作地址,在進行讀取。

uint8_t DigitalLightISL29035_readRegister(uint8_t reg_address) {

    uint8_t value;
    err = R_SCI_I2C_Write(&g_i2c0_ctrl, ®_address, 0x01, false);
    assert(FSP_SUCCESS == err);
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1 >0)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
        timeout_ms1--;
        }
    if (I2C_MASTER_EVENT_ABORTED == i2c_event1)
    {
        __BKPT(0);
        }
    /* Read data back from the I2C slave */
    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    timeout_ms1           = 100000;

    /* Read data from I2C slave */
    err = R_SCI_I2C_Read(&g_i2c0_ctrl, &value, 0x01, false);
    assert(FSP_SUCCESS == err);
    while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event1) && timeout_ms1)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms1--;
    }
    if (I2C_MASTER_EVENT_ABORTED == i2c_event1)
    {
        __BKPT(0);
    }

    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    timeout_ms1           = 100000;
    return value;
}

ISL29035初始化

  1. 讀取設備ID,查看是否鏈接上
  2. 清除標志位
  3. 確保芯片處于停止模式
  4. 設置分辨率
  5. 設置模式,如單次模式 讀取設備ID使用0x0F指令,可以判斷DEVICE ID BITS (B3-B5),之后需要對BROWNOUT STATUS BIT - BOUT (B7)清0。

在這里插入圖片描述

初始化的時候需要確保芯片處于停止模式,需要對0x00指令的OPERATION MODE BITS (B5-B7)寫入000。

在這里插入圖片描述

設置分辨率可以通過0x01指令,光照強度有4種模式,1k, 4k, 16k和64k,通過FULL SCALE LUX RANGE (B0-B1)進行設置;ADC分辨率也有4種模式,通過ADC RESOLUTION (B3-B2)進行設置。

在這里插入圖片描述

設置采樣模式,可以通過0x00指令,對OPERATION MODE BITS (B5-B7)寫入010。

在這里插入圖片描述

int DigitalLightISL29035_init(void) {
    uint8_t reg = 0;
    reg=   DigitalLightISL29035_readRegister( CHIP_ID);//CHIP_ID- >0x0f
    //Serial.println(reg, HEX);
    uint8_t chip_id = (reg > > 3) & 0x7;
    if (chip_id != 0x5) {
        return -1;
    }

    //清除BOUT位
    DigitalLightISL29035_writeRegister(CHIP_ID, reg & 0x7f);//CHIP_ID- >0x0f

    //確保芯片處于停止模式
    DigitalLightISL29035_writeRegister( COMMAND_I, 0);//COMMAND_I- >0x00
    //設置分辨率
    DigitalLightISL29035_writeRegister(COMMAND_II, full_scale_lux_range | (integration_time < < 2) );//COMMAND_2- >0x01
    //設置為單次模式
    DigitalLightISL29035_writeRegister( COMMAND_I, OPMODE_ALS_ONCE);//COMMAND_I- >0x00
    return 0;
}

ISL29035讀取光照強度

設置采樣模式,可以通過0x00指令,對OPERATION MODE BITS (B5-B7)寫入010。

在這里插入圖片描述

不同的ADC精度需要等待的時間不同,16位的等待時間最久,需要105ms。

在這里插入圖片描述

對于讀取數據,可以使用Data Registers (Addresses: 0x02 and 0x03),高位字節通過0x03讀取,低位字節通過0x02讀取,之后進行組合,就是完整的數據。

在這里插入圖片描述

讀取到原始數據之后,可以通過下面公式計算光照強度。

在這里插入圖片描述

uint32_t DigitalLightISL29035_readIRLux(void) {
    uint16_t data = 0;
    uint8_t l, h;
    //設置為單次模式
    DigitalLightISL29035_writeRegister( COMMAND_I, OPMODE_ALS_ONCE);
    //等待時間
    if(integration_time==0)
    {
        R_BSP_SoftwareDelay(105, BSP_DELAY_UNITS_MILLISECONDS);
    }
    else if(integration_time==1 || integration_time==2)
    {
        R_BSP_SoftwareDelay(7, BSP_DELAY_UNITS_MILLISECONDS);
    }
    else if(integration_time==3)
    {
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
    }

    l=DigitalLightISL29035_readRegister(DATA_L);//DATA_L- >0x02
    h=DigitalLightISL29035_readRegister(DATA_H);//DATA_H- >0x03

    data=(h < < 8) | l;

    uint32_t ranges=0;
    if(full_scale_lux_range==0)
        ranges=1000;
    else if(full_scale_lux_range==1)
        ranges=4000;
    else if(full_scale_lux_range==2)
        ranges=16000;
    else if(full_scale_lux_range==3)
        ranges=64000;

    uint32_t adc_count_max=0;
    if(integration_time==0)
        adc_count_max=65536;
    else if(integration_time==1)
        adc_count_max=4096;
    else if(integration_time==2)
        adc_count_max=256;
    else if(integration_time==3)
        adc_count_max=16;
    return ranges * (uint32_t)data /adc_count_max;


}

實現效果

正常顯示數據。

在這里插入圖片描述

同時可以通過串口打印數據。

在這里插入圖片描述

由于設置光照采樣為1K,故只能讀取到999。

在這里插入圖片描述

重新設置光照采樣范圍為4k,就可以讀取0-4K的范圍了,具體設置需要考慮使用環境。

在這里插入圖片描述

主程序

#include "hal_data.h"
#include < stdio.h >
#include "Digital_Light_ISL29035.h"
#include "oled.h"
#include "bmp.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    if(p_args- >event == UART_EVENT_TX_COMPLETE)
     {
         uart_send_complete_flag = true;
     }
}


#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;i< size;i++)
    {
        __io_putchar(*pBuffer++);
    }
    return size;
}

/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    i2c_event = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event = p_args- >event;
    }
}


/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event1 = p_args- >event;
    }
}


uint32_t  timeout_ms = 100000;
uint32_t  timeout_ms1 = 100000;
uint32_t lux =0;

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */

 
    /* Initialize the I2C module */
    err = R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);


    /* Open the transfer instance with initial configuration. */
        fsp_err_t err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
        assert(FSP_SUCCESS == err);

        printf("hello world!n");
        /* Initialize the I2C module */
        err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
        /* Handle any errors. This function should be defined by the user. */
        assert(FSP_SUCCESS == err);


        DigitalLightISL29035_init();
        R_BSP_SoftwareDelay(500U, BSP_DELAY_UNITS_MILLISECONDS);
        lux = DigitalLightISL29035_readIRLux();
        printf("lux=%dn",lux);

        OLED_Init();            //初始化OLED
        OLED_Clear()    ;
        OLED_ShowCHinese(0,0,0);//記
        OLED_ShowCHinese(16,0,1);//帖
        OLED_ShowString(0,2,"Lux:",16);
        OLED_ShowNum(32,2,lux,3,16);


        /* Wait for minimum time required between transfers. */
        R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_SECONDS);

        while(1)
        {

            OLED_Clear()    ;
            OLED_ShowCHinese(0,0,0);//記
            OLED_ShowCHinese(16,0,1);//帖
            OLED_ShowString(0,2,"Lux:",16);
            lux = DigitalLightISL29035_readIRLux();
            if(lux< 10)
                OLED_ShowNum(32,2,lux,1,16);
            else if(lux >=10&&lux< 100)
                OLED_ShowNum(32,2,lux,2,16);
            else if(lux >=100&&lux< 1000)
                OLED_ShowNum(32,2,lux,3,16);
            else if(lux >=1000&&lux< 10000)
                OLED_ShowNum(32,2,lux,4,16);
            printf("lux=%dn",lux);
            R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);

        }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

Digital_Light_ISL29035.h

/*
 * Digital_Light_ISL29035.h
 *
 *  Created on: 2023年2月1日
 *      Author: a8456
 */

#ifndef DIGITAL_LIGHT_ISL29035_H_
#define DIGITAL_LIGHT_ISL29035_H_
#include "stdint.h"


#define ISL29035_I2C_ADDRESS    0x44   //the 7bits i2c address

#define COMMAND_I               0x00
#define COMMAND_II              0x01
#define DATA_L                  0x02
#define DATA_H                  0x03
#define INT_LT_L                0x04
#define INT_LT_H                0x05
#define INT_HT_L                0x06
#define INT_HT_H                0x07
#define CHIP_ID                 0x0f

#define OPMODE_ALS_ONCE         ((0x1)< < 5)
#define OPMODE_IR_ONCE          ((0x2)< < 5)
#define OPMODE_ALS_CONTI        ((0x5)< < 5)
#define OPMODE_IR_CONTI         ((0x6)< < 5)

#define FULL_SCALE_LUX_RANGE0   1000
#define FULL_SCALE_LUX_RANGE1   4000
#define FULL_SCALE_LUX_RANGE2   16000
#define FULL_SCALE_LUX_RANGE3   64000
#define DEFAULT_LUX_RANGE_INDEX 1       //should be [0,3]

#define INTEGRATION_TIME3       0.0256  //ms, this also configure the ADC to 4bits
#define INTEGRATION_TIME2       0.41  //ms, this also configure the ADC to 8bits
#define INTEGRATION_TIME1       6.5  //ms, this also configure the ADC to 12bits
#define INTEGRATION_TIME0       105  //ms, this also configure the ADC to 16bits
#define DEFAULT_INTEGRATION_TIME_INDEX 1  //should be [0,3]

uint8_t DigitalLightISL29035_readRegister(uint8_t reg_address);
void DigitalLightISL29035_writeRegister( int reg_address, uint8_t val) ;
int DigitalLightISL29035_init(void) ;
uint32_t DigitalLightISL29035_readIRLux(void);

#endif /* DIGITAL_LIGHT_ISL29035_H_ */

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2552

    文章

    51356

    瀏覽量

    755636
  • led
    led
    +關注

    關注

    242

    文章

    23337

    瀏覽量

    662236
  • OLED
    +關注

    關注

    119

    文章

    6215

    瀏覽量

    224574
  • 串口
    +關注

    關注

    14

    文章

    1557

    瀏覽量

    76822
  • RA4M2
    +關注

    關注

    2

    文章

    19

    瀏覽量

    886
收藏 人收藏

    評論

    相關推薦

    基于RT-Thread+RA6M4的光照監控設備相關資料介紹

    ISL29035采集光照數據;LCD1206顯示數據及用戶設置顯示;按鍵開關機及光照刷新時間設置;LED
    發表于 08-15 15:02

    RA4M2設計挑戰賽】3. 硬件IIC讀取ISL29035采集光照強度

    開發板體驗】9. 用兩路DAC在示波器顯示一個愛心RA4M2挑戰賽分享:【RA4M2設計挑戰賽】1. RASC配置FreeRTOS【
    發表于 02-11 21:02

    RA4M2設計挑戰賽】讀取ISL29035數據,并在OLED顯示串口打印

    準備一個開發板,這里我準備的是芯片型號R7FAM2AD3CFP的開發板:IIC配置配置RA4M2的I2C接口,使其作為I
    發表于 02-14 10:44

    RA4M2設計挑戰賽】讀取HS3003數據并在OLED顯示串口打印

    一個開發板,這里我準備的是芯片型號R7FAM2AD3CFP的開發板:IIC配置配置RA4M2的I2C接口,使其作為I
    發表于 02-22 15:11

    RA4M2設計挑戰賽】模擬IIC isl29035驅動

    參照上次文檔添加模擬iichttps://bbs.elecfans.com/jishu_2336359_1_1.html編寫光照模塊 isl29035 模塊驅動#define DBG_TAG
    發表于 02-23 22:46

    RA4M2設計挑戰賽】讀取isl29035模塊數據

    這篇來測試讀取isl29035模塊數據,通過串口輸出照度值。一、i2c接口配置二、ISL29035
    發表于 02-26 21:26

    RA4M2設計挑戰賽】作品提交 - 環境檢測網關設備

    3. 硬件IIC讀取ISL29035采集光照強度【RA4M2設計挑戰賽】4. DA14531藍牙模塊使用【
    發表于 02-26 21:50

    RA4M2設計挑戰賽】串口打印

    |開發環境:IDE:MKD 5.30開發板:RA-Eco-RA4M2MCU:R7FA4M2AD3CFP官方資料分享一下串口了解。
    發表于 03-04 22:35

    【精品合集】瑞薩RA4M2物聯網網關設計挑戰賽作品合集

    】使用串口進行打印RA4M2設計挑戰賽】基于IIC驅動OLEDRA4M2設計挑戰賽】讀取
    發表于 03-07 14:33

    RA4M2數據手冊(英)

    RA4M2數據手冊(英)
    發表于 11-07 19:49 ?1次下載
    <b class='flag-5'>RA4M2</b><b class='flag-5'>數據</b>手冊(英)

    RA4M2數據手冊(中英)

    RA4M2數據手冊(中英)
    發表于 11-07 19:49 ?4次下載
    <b class='flag-5'>RA4M2</b><b class='flag-5'>數據</b>手冊(中英)

    RA4M2數據

    RA4M2數據
    發表于 02-03 19:05 ?0次下載
    <b class='flag-5'>RA4M2</b> 組<b class='flag-5'>數據</b>表

    ISL29035 數據

    ISL29035 數據
    發表于 04-19 20:01 ?0次下載
    <b class='flag-5'>ISL29035</b> <b class='flag-5'>數據</b>表

    RA4M2數據

    RA4M2數據
    發表于 07-04 19:38 ?0次下載
    <b class='flag-5'>RA4M2</b>組<b class='flag-5'>數據</b>表

    RA4M2開發(1)----使用串口進行打印

    本篇文章主要介紹如何使用e2studio對瑞薩RA4M2開發板進行串口打印配置。
    的頭像 發表于 07-27 10:00 ?1428次閱讀
    <b class='flag-5'>RA4M2</b><b class='flag-5'>開發</b>(1)----使用<b class='flag-5'>串口</b>進行<b class='flag-5'>打印</b>
    主站蜘蛛池模板: a级精品九九九大片免费看| 欧美色妞AV重囗味视频| 好大太快了快插穿子宫了| 久久精品九九亚洲精品天堂| 欧美内射AAAAAAXXXXX| 亚洲AV噜噜狠狠网址蜜桃尤物| 最近免费中文字幕MV在线视频3| 吃奶摸下的激烈免费视频| 久久九九亚洲精品| 无码欧美XXXXX在线观看裸| 97色伦图片7778久久| 黑色丝袜美腿美女被躁翻了| 日日干夜夜艹| S货SAO死你BL大点声叫BL| 国产人妻久久久精品麻豆| 欧美性情video sexo视频| 一本色道久久综合亚洲精品蜜桃冫 | 99re久久热在这里精品| 国产精品人妻无码久久久奥特曼| 久久精品成人免费看| 午夜免费体验30分| 变态露出野外调教| 免费A级毛片无码无遮挡| 亚洲免费视频在线观看| 国产精品午夜小视频观看| 人人模人人干| JLZZJLZZJLZ老师好多的水| 美美哒高清在线播放8| 怡红院美国分院一区二区| 精品国产高清自在线看| 亚洲黄色在线观看| 国产午夜视频在永久在线观看| 天堂精品国产自在自线| 国产AV综合手机在线观看| 深夜释放自己在线观看| 大学生第一次破苞疼哭了| 成人精品在线视频| 欧美 日韩 无码 有码 在线| 91涩涩视频| 男人天堂2018亚洲男人天堂| 91麻豆精品国产一级|