一:LPS22HH基本知识:
LPS22HH是一款超小型压阻式绝对压力传感器,它兼具数字输出气压计的功能。该设备包含一个传感元件以及一个集成电路接口,该接口可通过I2C、MIPI13CSM或SPI方式从传感元件与应用程序进行通信。
该传感元件用于检测绝对压力,由ST公司开发的专用工艺制造的悬吊膜构成
LPS22HH现已提供全模、带孔LGA封装(HLGA)版本。该产品保证可在从-40°C至+85°C的温度范围内稳定运行。该封装带有孔洞设计,以便外部压力能够触及传感元件。二:原理图如下所示:

三:软件代码:
检测模块设备是否正常:
这一步是确认与传感器的通信已经建立。
操作:读取 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;四:串口接收的数据如下所示:

五:常见问题与避坑指南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:检查数据就绪标志:不要在两次转换之间读取,否则可能会读到不完整的数据包。
我要赚赏金
