【瑞萨RA6M4评测】-IIC读取HS3003数据测试
# 瑞萨RA6M4 IIC读取HS3003数据测试本次测评使用瑞萨 e2 studio + FSP 工程,通过 `r_sci_i2c` 读取 HS3003 温湿度传感器的温度与湿度,并把读取结果保存到全局变量中,方便调试器查看,也方便后续接串口、OLED 或无线模块继续开发。
HS3003 是瑞萨电子(Renesas)推出的一款高精度、全校准的数字式**相对湿度和温度传感器**,湿度精度典型值为 **±2.8% RH**,温度精度典型值为 **±0.25°C**
## 1. 功能说明
代码流程如下:
* 初始化 SCI I2C 主机 `g_i2c0`
* 使用 HS3003 默认 7 位地址 `0x44`
* 发送 Measurement Request(MR)启动一次温湿度测量
* 等待 14-bit 分辨率测量完成
* 读取 4 字节 Data Fetch(DF)数据
* 解析状态位、14-bit 湿度原始值、14-bit 温度原始值
* 换算为浮点温度和湿度
* 将结果写入全局变量
## 3. 引脚
| HS3003 引脚 | 开发板引脚 | 说明 |
| ------------- | ------------ | ------------------- |
| VDD | 3.3V | 电源 |
| VSS | GND | 地 |
| SCL | P100 | SCI0 I2C 时钟 |
| SDA | P101 | SCI0 I2C 数据 |
| VC | GND | 经 0.1uF 电容接地 |
* 芯片:`R7FA6M4AF3CFB`
* I2C 实例:`g_i2c0`,`r_sci_i2c`
* I2C 引脚:`P100/SCL`,`P101/SDA`
* I2C 速率:100 kHz Standard Mode
* I2C 回调:`sci_i2c_master_callback`
!(https://www.eefocus.com/forum/data/attachment/forum/202608/02/224558ezkhkdnkskdw3zhw.png)
!(https://www.eefocus.com/forum/data/attachment/forum/202608/02/224630tmqr0hq1mdq02ewq.png)
## 5. FSP 配置步骤
### 5.1 添加 I2C 模块
1. 打开工程的 `configuration.xml`
2. 进入 `Stacks`
3. 点击 `New Stack`
4. 选择 `Connectivity` -> `I2C Master (r_sci_i2c)`
5. 实例名改为 `g_i2c0`
6. Callback 填写 `sci_i2c_master_callback`
7. Rate 选择 `Standard`
8. 点击 `Generate Project Content`
### 5.2 配置引脚
在 `Pins` 页面中配置:
| 信号 | 引脚 |
| ---------- | ------ |
| SCI0 SCL | P100 |
| SCI0 SDA | P101 |
两个引脚的模式选择:
* Peripheral mode
* n-ch open drain
* Initial output:Low
## 6. HS3003 通信原理
### 6.1 Measurement Request
HS3003 平时处于 Sleep Mode。要开始一次测量,主机只需发送:
```text
START + 0x44 + WRITE + ACK + STOP
```
注意:MR 不需要发送数据字节。这会让传感器从睡眠中唤醒,并开始一次温湿度测量。
### 6.2 等待测量完成
14-bit 分辨率下,HS3003 的测量时间如下:
| 项目 | 时间 |
| ---------------------- | --------- |
| Wake-up | 0.10ms|
| 单路转换,含数字补偿 | 16.90ms |
| RH + T 总测量时间 | 33.90ms |
驱动中等待 `34ms`,保证数据已经就绪。
### 6.3 Data Fetch
测量完成后,主机读取 4 个字节:
```text
Byte 0:
Byte 1:
Byte 2:
Byte 3:
```
解析方式:
```c
status = (data >> 6) & 0x03;
raw_humidity = ((data & 0x3F) << 8) | data;
raw_temperature = (data << 8 | data) >> 2;
```
### 6.4 换算公式
相对湿度:
```text
RH = raw_humidity / 16383 * 100 %
```
温度:
```text
T = raw_temperature / 16383 * 165 - 40 °C
```
### 6.5 状态位
| Status Bits | 含义 |
| ------------- | ---------------------------------------- |
| 00 | 有效数据 |
| 01 | 旧数据,本次测量后还没读取,或读取过早 |
| 10 | 未定义 |
| 11 | 未定义 |
驱动只有在状态位为 `00` 时才更新温湿度浮点结果。
## 7. 驱动文件说明
### 7.1 `src/hs3003.h`
驱动接口与全局变量声明:
```c
extern volatile float g_hs3003_temperature_c;
extern volatile float g_hs3003_humidity_rh;
extern volatile uint16_t g_hs3003_raw_temperature;
extern volatile uint16_t g_hs3003_raw_humidity;
extern volatile uint8_tg_hs3003_status;
extern volatile bool g_hs3003_data_valid;
fsp_err_t hs3003_open(void);
fsp_err_t hs3003_read(void);
```
### 7.2 `src/hs3003.c`
核心读取流程:
```c
fsp_err_t hs3003_read(void)
{
uint8_tdata;
uint16_t raw_temperature;
uint16_t raw_humidity;
uint8_tstatus;
fsp_err_t err;
/* Measurement Request: slave address + write, no data bytes. */
err = hs3003_i2c_transfer(&g_hs3003_mr_data, 0U, false, I2C_MASTER_EVENT_TX_COMPLETE);
if (FSP_SUCCESS != err)
{
return err;
}
R_BSP_SoftwareDelay(34, BSP_DELAY_UNITS_MILLISECONDS);
/* Data Fetch: read 4 bytes. */
err = hs3003_i2c_transfer(data, sizeof(data), true, I2C_MASTER_EVENT_RX_COMPLETE);
if (FSP_SUCCESS != err)
{
return err;
}
status = (uint8_t) ((data >> 6U) & 0x03U);
raw_humidity = (uint16_t) ((((uint16_t) data & 0x3FU) << 8U) | data);
raw_temperature = (uint16_t) (((uint16_t) data << 8U) | data);
raw_temperature = (uint16_t) (raw_temperature >> 2U);
g_hs3003_status = status;
g_hs3003_raw_humidity = raw_humidity;
g_hs3003_raw_temperature = raw_temperature;
if (HS3003_STATUS_VALID == status)
{
g_hs3003_humidity_rh = ((float) raw_humidity * 100.0F) / 16383.0F;
g_hs3003_temperature_c = (((float) raw_temperature * 165.0F) / 16383.0F) - 40.0F;
g_hs3003_data_valid = true;
}
else
{
g_hs3003_data_valid = false;
}
return FSP_SUCCESS;
}
```
### 7.3 `src/hal_entry.c`
主函数调用:
```c
void hal_entry(void)
{
fsp_err_t err = hs3003_open();
if (FSP_SUCCESS != err)
{
while (1)
{
;
}
}
while (1)
{
(void) hs3003_read();
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
}
}
```
!(https://www.eefocus.com/forum/data/attachment/forum/202608/02/224735xib6bbketksgbsub.png)
完成以上驱动烧录 就可以正常读取到室内温湿度和环境了
末尾压缩包是本次测评的工程
页:
[1]