概述首先导入必要的库文件,包括i2c驱动和oled驱动。在代码中配置i2c接口,并初始化i2c驱动。配置isl29035传感器,包括配置传感器的工作模式和量程。使用i2c读取isl29035传感器的数据,并将其存储在变量中。初始化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初始化读取设备id,查看是否链接上清除标志位确保芯片处于停止模式设置分辨率设置模式,如单次模式 读取设备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 < 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读取,之后进行组合,就是完整的数据。
读取到原始数据之后,可以通过下面公式计算光照强度。
三星Galaxy S20+拍照功能披露,支持录制8K/30帧视频
IIC-China 2010参展商展前专访:卓胜微电子
stm32烧录的程序为什么会丢失呢
开关电源环路稳定性分析(九)
OPPO上榜2021年《麻省理工科技评论》“50家聪明公司”榜单
RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印
国轩高科二期项目主体建设已完成 年底电池产能有望达到16GWh
骁龙820和天玑8200哪个好
智能手机步入“双核”时代
最高亮度10000nit!熙泰科技展出5款Micro OLED
天马亮相2021 Micro-LED生态联盟大会
盘点区块链发展的4大硬伤
中电互联与高新兴合作携手共同推动车联网产业做大做强
示波器接电流探头时的设置方法及注意事项
物联网不断发展带来哪些挑战
体验畅快上网速度,推荐几款实用高性价比的Type-C网卡
小米欲用小米MIX打开海外市场,网友这耍猴到国外了
近几年小家电市场的发展渐入佳境
选择晶振元器件的关键因素
技术无罪?AI脱衣App上线几个小时就被下线了!