【瑞萨FPB_RA6E2】测评——温湿度传感器HS3003数据读取
[复制链接]
本帖最后由 EPTmachine 于 2023-10-29 16:53 编辑
温湿度传感器HS3003数据读取
HS3003是瑞萨推出的一款高精度、全标定的温湿度传感器,依靠其集成的标定模块和温度补偿逻辑,用户无需对输出的数据进行标定。传感器的接口为I2C。本文使用fpb-ra6e2的I2C接口驱动HS3003读取环境中温湿度数据。
RA6E2的I2C配置
产看数据手册可知,RA6E2的P410和P411引脚为I2C0的SCL和SDA引脚。
创建工程后,在FSP配置界面的Stack中添加I2C连接。
通过查看HS3003的数据手册可知,其地址为0x44。
I2C接口的具体配置如下图所示
驱动I2C的函数主要有以下几个:
R_SCI_I2C_Open:打开I2C设备;
/* Initialize the I2C module */
err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
R_SCI_I2C_Write:向I2C设备写入数据;
err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, false);
R_SCI_I2C_Read:从I2C设备读取数据;
err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);
sci_i2c_master_callback:中断回调函数,获取触发中断的事件,用于处理得到的数据。
/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
i2c_event = I2C_MASTER_EVENT_ABORTED;
if (NULL != p_args)
{
/* capture callback event for validating the i2c transfer event*/
i2c_event = p_args->event;
}
}
HS3003数据读写
查看数据手册可知,读取温湿度数据前,需要发出至少一次测量请求,测量请求的格式为发送从站地址和写标志。与该操作相关的代码如下:
//写入数据
void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len)
{
err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, 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_event) && timeout_ms1>0)
{
R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
timeout_ms1--;
}
if (I2C_MASTER_EVENT_ABORTED == i2c_event)
{
__BKPT(0);
}
/* Read data back from the I2C slave */
i2c_event = I2C_MASTER_EVENT_ABORTED;
timeout_ms1 = 100000;
}
//请求一次测量
void Humiture_HS3003_init(void)
{
Humiture_HS3003_writeRegister(HS300X_ADR,NULL,0);
}
产看数据手册中的数据抓取一节,可以知道在发出测量请求后,需要等待一段时间才能读取数据,读取数据的指令和返回数据的格式如下图所示。
相关的代码如下:
uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address) {
uint32_t value;
uint8_t data[4];
timeout_ms1 = 100000;
/* Read data from I2C slave */
err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);
assert(FSP_SUCCESS == err);
while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event) && timeout_ms1)
{
R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
timeout_ms1--;
}
if (I2C_MASTER_EVENT_ABORTED == i2c_event)
{
__BKPT(0);
}
i2c_event = I2C_MASTER_EVENT_ABORTED;
timeout_ms1 = 100000;
value=data[0];
value<<=8;
value|=data[1];
value<<=8;
value|=data[2];
value<<=8;
value|=data[3];
return value;
}
//读取原始的数据
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution )
{
uint8_t rx_buf[ 4 ];
uint32_t data=0;
Humiture_HS3003_init();//唤醒
//8bit->1.2ms
//10bit->2.72ms
//12bit->9.10ms
//14bit->33.90ms
if(resolution==8)
R_BSP_SoftwareDelay(1200U, BSP_DELAY_UNITS_MICROSECONDS);
else if(resolution==10)
R_BSP_SoftwareDelay(2720U, BSP_DELAY_UNITS_MICROSECONDS);
else if(resolution==12)
R_BSP_SoftwareDelay(9100U, BSP_DELAY_UNITS_MICROSECONDS);
else
R_BSP_SoftwareDelay(34U, BSP_DELAY_UNITS_MILLISECONDS);
data=Humiture_HS3003_readRegister32(HS300X_ADR);
return data;
}
得到传感器的数据后,需要将其转换为湿度和温度单位对应的值、
查看数据手册可知转换公式,在程序中添加相应的转换系数,用于单位的换算。相关代码如下:
#define HS300X_HUMD_MULTY 0.00006163516
#define HS300X_TEMP_MULTY 0.00006163516
在主函数中添加以下代码,实现HS3003读取温湿度的简单Demo
void hal_entry(void)
{
/* TODO: add your own code here */
/* 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);
Humiture_HS3003_init();
while(1)
{
Data=Humiture_HS3003_ReadData_Raw(14);
Temp = (float)( (Data & 0xFFFF) >> 2);//只要低十六位
Temp = Temp*HS300X_TEMP_MULTY*165-40;//HS300X_TEMP_MULTY->0.00006163516(1/(2^14-1) )
Humidity = (float)( (Data >> 16) &0x3FFF );//只要高十六位,且最高2位不要
Humidity = Humidity*HS300X_HUMD_MULTY*100;//HS300X_HUMD_MULTY->0.00006163516(1/(2^14-1) )
R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
实际效果
连接开发板和HS3003模块,运行程序后,在调试窗口中添加对Humidity湿度变量和Temp温度变量的监控。
可以看到当前采集到的适度和温度值,数值还是准确的。
总结
配合FSP配置工具,开发RA6E2的I2C应用程序是十分方便的,可以帮助开发者快速编写应用程序。
|