这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STEVAL-STWINKT1B】:结合STMcubeMX读取LPS22HH气

共1条 1/1 1 跳转至

【STEVAL-STWINKT1B】:结合STMcubeMX读取LPS22HH气压、温度

高工
2026-03-30 13:49:56     打赏

一:LPS22HH基本知识:

    LPS22HH是一款超小型压阻式绝对压力传感器,它兼具数字输出气压计的功能。该设备包含一个传感元件以及一个集成电路接口,该接口可通过I2C、MIPI13CSM或SPI方式从传感元件与应用程序进行通信。

    该传感元件用于检测绝对压力,由ST公司开发的专用工艺制造的悬吊膜构成

    LPS22HH现已提供全模、带孔LGA封装(HLGA)版本。该产品保证可在从-40°C至+85°C的温度范围内稳定运行。该封装带有孔洞设计,以便外部压力能够触及传感元件。

二:原理图如下所示:

05-1 LPS22HH原理图.png

    可见,模块通过IIC的方式与cpu相连,同样挂载在IIC2上面,只是模块地址不同,这样就可以和其他IIC设备共用一个IIC接口了。

三:软件代码:

检测模块设备是否正常:

    这一步是确认与传感器的通信已经建立。

      操作:读取 WHO_AM_I 寄存器 (地址 0x0F)。

      预期值:应该读到 0xB3。

传感器配置

        通过配置 CTRL_REG1 寄存器来让传感器开始工作。

        操作:向 CTRL_REG1 寄存器 (地址 0x10) 写入配置值。

关键配置位:

      ODR[2:0]: 设置输出数据速率,从 1Hz 到 200Hz。例如,设为 011 (二进制) 选择 10Hz。

      MODE: 设置功耗模式,通常设为连续转换。

      BDU: 建议开启(设为1),防止在读取数据时寄存器被更新,从而避免读到新老数据混合的问题

读取数据

      配置完成后,传感器就会按设定的频率开始转换。我们需要在数据准备好后读取。

      检查数据就绪:有两种方式。

      轮询状态寄存器:不断读取 STATUS 寄存器 (地址 0x27),检查其最低位 (DRDY_P) 是否为1。

      中断引脚:配置 CTRL_REG4 将 INT_DRDY 引脚设为数据就绪输出,然后检测该引脚的上升沿或高电平。这种方式效率更高。

  读取数据寄存器:

      压力数据:依次读取 PRESSURE_OUT_XL (0x28), PRESSURE_OUT_L (0x29), PRESSURE_OUT_H (0x2A) 三个寄存器。

      温度数据:依次读取 TEMP_OUT_L (0x2B), TEMP_OUT_H (0x2C) 两个寄存器。

  数据转换:

      压力:将读取的3个字节组合成一个24位有符号整数(二进制补码),然后除以 4096,得到单位为 hPa 的压力值。

      温度:将读取的2个字节组合成一个16位有符号整数,然后除以 100,得到单位为 摄氏度 的温度值。

初始化模块函数:

// 定义寄存器地址和I2C地址 (以SA0接GND为例)
#define LPS22HH_CTRL_REG1  0x10
#define LPS22HH_IF_CTRL    0x0E
#define LPS22HH_WHO_AM_I   0x0F
#define LPS22HH_ADDR_W     0xB8  // I2C写地址 (0x5C << 1)

void LPS22HH_Init(void) 
{
    uint8_t tmp = 0;

    // 1. 验证设备 (可选但推荐)
    HAL_I2C_Mem_Read(&hi2c1, LPS22HH_ADDR_W, LPS22HH_WHO_AM_I, 
                     I2C_MEMADD_SIZE_8BIT, &tmp, 1, 0xFF);
    if (tmp != 0xB3) {
        // 通信失败或设备错误,应返回错误状态
        return;
    }

    // 2. 配置接口: 选择I2C/I3C模式, 禁用内部上拉
    tmp = 0x00;
    HAL_I2C_Mem_Write(&hi2c1, LPS22HH_ADDR_W, LPS22HH_IF_CTRL, 
                      I2C_MEMADD_SIZE_8BIT, &tmp, 1, 0xFF);

    // 3. 配置工作模式: 10Hz连续转换, 开启BDU
    tmp = 0x20; // 二进制: 0010 0000
    HAL_I2C_Mem_Write(&hi2c1, LPS22HH_ADDR_W, LPS22HH_CTRL_REG1, 
                      I2C_MEMADD_SIZE_8BIT, &tmp, 1, 0xFF);
}

    主要采集,数据处理代码如下所示:

uint8_t raw_data[5];
int32_t pressure_raw;
int16_t temperature_raw;
float pressure_hpa, temperature_c;

// 1. 读取5个寄存器的原始数据
HAL_I2C_Mem_Read(&hi2c2, LPS22HH_ADDRESS, 0x28, I2C_MEMADD_SIZE_8BIT, raw_data, 5, 0xFF);

// 2. 组合并转换压力数据
pressure_raw = (int32_t)((raw_data[2] << 16) | (raw_data[1] << 8) | raw_data[0]);
pressure_hpa = (float)pressure_raw / 4096.0f;

// 3. 组合并转换温度数据
temperature_raw = (int16_t)((raw_data[4] << 8) | raw_data[3]);
temperature_c = (float)temperature_raw / 100.0f;
    四:串口接收的数据如下所示:

05-2 LPS22HH串口数据.png

五:常见问题与避坑指南I2C 无响应/通信失败

    检查 CS 引脚电平:这是最常见的原因。请确保 CS 引脚连接到高电平 (VDDIO),否则传感器会处于 SPI 模式,不响应 I2C 命令。

    确认 I2C 地址:检查 SA0 引脚的电平,确认代码中使用的地址 (0x5C 或 0x5D) 与硬件连接一致。

    检查上拉电阻:确保 SCL 和 SDA 线上有正确阻值的上拉电阻。

读出的数据为 0 或固定值

1: 检查传感器是否退出掉电模式:确认 CTRL_REG1 已正确配置为非掉电模式,并且设置了非零的 ODR。数据读取错乱 (如压力

2:或温度跳变)开启 BDU (Block Data Update):在 CTRL_REG1 中使能 BDU 位,可以确保当你开始读取数据时,传感器不会更新输出寄存器,直到你读完为止。

3:检查数据就绪标志:不要在两次转换之间读取,否则可能会读到不完整的数据包。




关键词: ST传感器     LPS22HH    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]