1、主要特性 l IIC接口,支持全速模式 l 非常广的光照度检测范围 l 距离检测范围1-100mm l 内置电流可配置IrLED驱动器 l 主要用于LCD显示等 l 供电电压2.5-3.6V l 运行温度-25~85℃(非工业级)
2、引脚描述 INT引脚一般是中断输出引脚,对mcu来说是外部中断输入引脚。
3、寄存器描述
4、软件驱动 4.1、寄存器定义以及参数设置定义
4.2、读取设备ID 设备ID一般都是一个固定值,芯片出厂的时候已经固化在芯片里面了,只读,可用于检测I2C通信是否正常、检测芯片是否存在。 - bool RPR0521RSCheck(void)
- {
- uint8 chip_id=0;
-
- chip_id=RPR0521RS_ReadRegU8(MANUFACT_ID);
-
- if(chip_id==0xE0)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
复制代码
4.3、芯片初始化以及参数设定 - void RPR0521RSInit(void)
- {
- RPR0521RS_WriteRegU8(SYSTEM_CONTROL,RESET_START); //复位初始化
- RPR0521RS_WriteRegU8(ALS_PS_CONTROL,ALS_DATA0_GAIN_1|ALS_DATA1_GAIN_1|
- CURRENT_100MA); //ALS DATA0和DATA1的增益均配置为1、LED电流配置为100ma
-
- RPR0521RS_WriteRegU8(PS_CONTROL,PS_GAIN_1); //PS增益设置为1
- RPR0521RS_WriteRegU8(MODE_CONTROL,ALS_ENABLE|PS_ENABLE|_100MS_100MS);
- //模式设置:ALS和PS都使能、测量时间ALS和PS均为100ms。
- }
复制代码
4.4、读取数据 可以看出,PS的值是12位的,ALS DATA0和DATA1是16位的。距离值直接从寄存器里面读出来,是数字量;照度值从寄存器里面读出来后,需要做转换,与设置的增益和转换时间有关系。
- uint8 als_gain_table[] = {1, 2, 64, 128};//根据手册中的增益
- uint16 als_meas_time_table[] = {0,0,0,0,0,100,100,100,100,100,400,400,50,0,0,0};//als的测量时间定义
- float RPR0521RSConvertLx(uint16 *als_count) //als数字量,转化为实际值
- {
- uint8 als_data0_gain,als_data1_gain;
- uint16 als_measure_time;
- uint8 mode_control_value,als_ps_control_value;
-
- mode_control_value=RPR0521RS_ReadRegU8(MODE_CONTROL);
- als_ps_control_value=RPR0521RS_ReadRegU8(ALS_PS_CONTROL);
-
- als_measure_time=als_meas_time_table[mode_control_value&0x0F]; //取低四位的值
-
- als_data0_gain=als_gain_table[(als_ps_control_value>>4)&0x03]; //取第五第六位的值
- als_data1_gain=als_gain_table[(als_ps_control_value>>2)&0x03];
-
- if(als_data0_gain==0)
- {
- return -1;
- }
- if(als_data1_gain==0)
- {
- return -1;
- }
- if(als_measure_time==0)
- {
- return -1;
- }
- else
- {
- if(als_measure_time==50)
- {
- if((als_count[0]&0x8000)==0x8000)
- {
- als_count[0] = 0x7FFF;
- }
-
- if((als_count[1]&0x8000)==0x8000)
- {
- als_count[1] = 0x7FFF;
- }
- }
- }
-
- float lx;
- float d0, d1, d1_d0;
-
- d0 = (float)als_count[0] * (100 / als_measure_time) / als_data0_gain;
- d1 = (float)als_count[1] * (100 / als_measure_time) / als_data0_gain;
-
- if (d0 == 0)
- {
- lx = 0;
- return (lx);
- }
- d1_d0 = d1 / d0;
-
- if (d1_d0 < 0.595)
- {
- lx = (1.682 * d0 - 1.877 * d1);
- }
- else
- {
- if (d1_d0 < 1.015)
- {
- lx = (0.644 * d0 - 0.132 * d1);
- }
- else
- {
- if (d1_d0 < 1.352)
- {
- lx = (0.756 * d0 - 0.243 * d1);
- }
- else
- {
- if (d1_d0 < 3.053)
- {
- lx = (0.766 * d0 - 0.25 * d1);
- }
- else
- {
- lx = 0;
- }
- }
- }
- }
- return (lx);
- }
- void RPR0521RSRead(void)
- {
- uint16 ps_count;
- uint16 als_count[2];
-
- float ps ,lx;
-
- ps_count=RPR0521RS_ReadRegU16(PS_DATA_LSB);
- als_count[0]=RPR0521RS_ReadRegU16(ALS_DATA0_LSB);
- als_count[1]=RPR0521RS_ReadRegU16(ALS_DATA1_LSB);
-
- ps=ps_count;
- lx=RPR0521RSConvertLx(als_count);
-
- printf(“ps_count:%d\r\n”,ps_count);
- printf(“als_count0:%d\r\n”,als_count[0]);
- printf(“als_count1:%d\r\n”,als_count[1]);
- printf(“proximity sensor:%f\r\n”,ps);
- printf(“ambient light:%0.3f\r\n”,lx);
- }
复制代码
1-5依次是手靠近传感器的变化,可以看出,proximity sensor的值逐渐增大,Ambient light的值逐渐减小。
简单绘一个图: 上面转化的过程是参考的官方的Arduino的demo程序,至于为什么要那样转化,手册里面也没有说明。
|