罗姆公司的产品接触的比较少,近期在项目上用到了罗姆的RPR-0521RS。RPR-0521RS是将光学式接近传感器和红外LED(IrLED)、数字照度传感器整合在1chip中的模块。
接近传感器 (PS)通过对IrLED发射光线的接近物产生的反射光,检测出人及物体的接近。另外,照度传感器(ALS)可测量从昏暗光线到直射日光的广泛照度。根据照度数据调整LCD显示器及按键的亮度,从而提高组件的节电性能和画面的可视性。

作为I2C总线的从设备,其地址是0x38h,I2C总线时序如下:


从STM32发送指令到传感器的格式如下:

从STM32发送读取传感器数据的格式如下:

STM32配置,从CubeMX中的I2C配置开始:

自动生成初始化代码:
I2cHandle.Instance = I2C1;
I2cHandle.Init.ClockSpeed = 100000;
I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2;
I2cHandle.Init.OwnAddress1 = 0;
I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
I2cHandle.Init.OwnAddress2 = 0;
I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&I2cHandle) != HAL_OK) {
/* Initialization Error */
Error_Handler();
}初始化RPR-0521RS
void rohm_rpr_0521rs_Init(void)
{
uint8_t val;
if(HAL_I2C_IsDeviceReady(&I2cHandle,0x70, 2, 100)==HAL_OK)
{
printf("RPR-0521RS Device OK\r\n");
}
HAL_Delay(10);
val=0x02;
HAL_I2C_Mem_Write(&I2cHandle,0x70,0x42, 1, &val, 1, 10); //ALS_PS_CONTROL
HAL_Delay(10);
val=0x01;
HAL_I2C_Mem_Write(&I2cHandle,0x70,0x43, 1, &val, 1, 10); //PS_CONTROL
HAL_Delay(10);
val=0xc6;
HAL_I2C_Mem_Write(&I2cHandle,0x70,0x41, 1, &val, 1, 10); //MODE_CONTROL
HAL_Delay(10);
}读取RPR-0521RS数据:
void rohm_rpr_0521rs_GetPSALSVal_V0(void)
{
uint8_t RegVal[6];
uint16_t PS,ALS[2];
float lx;
float d0, d1, d1_d0;
HAL_I2C_Mem_Read(&I2cHandle,0x70,0x44, 1, RegVal, 6, 10); //读取寄存器数据
PS =((uint16_t)RegVal[1]<<8)+RegVal[0];
ALS[0]=((uint16_t)RegVal[3]<<8)+RegVal[2];
ALS[1]=((uint16_t)RegVal[5]<<8)+RegVal[4];
//mgcsh test
printf("ALS[0]=%d ,ALS[1]=%d\r\n",ALS[0],ALS[1]);
//转化为光强数据
d0 = (float)ALS[0] * (100 / 100) / 1;
d1 = (float)ALS[1] * (100 / 100) / 1;
if (d0 == 0) {
lx = 0;
return;
}
d1_d0 = d1 / d0;
if (d1_d0 < (float)0.595) {
lx = ((float)1.682 * d0 - (float)1.877 * d1);
} else if (d1_d0 < (float)1.015) {
lx = ((float)0.644 * d0 - (float)0.132 * d1);
} else if (d1_d0 < (float)1.352) {
lx = ((float)0.756 * d0 - (float)0.243 * d1);
} else if (d1_d0 < (float)3.053) {
lx = ((float)0.766 * d0 - (float)0.25 * d1);
} else {
lx = 0;
}
printf("MagDat:PS=%d ,ALS=%f\r\n",PS,lx);
LUX = lx;
}烧录,通过串口查看传感器数据:

此外,如果采用Arduino环境开发,可以参考罗姆公司的官方Github:
https://github.com/RohmSemiconductor/Arduino/tree/master/RPR-0521RS
我要赚赏金
