罗姆公司的产品接触的比较少,近期在项目上用到了罗姆的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