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

 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

