短笛君 发表于 2026-8-2 22:51:54

【瑞萨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)

完成以上驱动烧录 就可以正常读取到室内温湿度和环境了


短笛君 发表于 2026-8-2 22:52:22

末尾压缩包是本次测评的工程
页: [1]
查看完整版本: 【瑞萨RA6M4评测】-IIC读取HS3003数据测试