- #include <inttypes.h>
- typedef enum
- {
- LPS22HH_PASSED = 0U,
- LPS22HH_FAILED
- } LPS22HHState;
- #define LPS22HH_RD 0xBB
- #define LPS22HH_WR 0xBA
- #define IF_CTRL 0x0E
- #define CTRL_REG1 0x10
- #define REG_WHO_AM_I 0x0F
- #define PRESSURE_OUT_XL 0x28
- #define PRESSURE_OUT_L 0x29
- #define PRESSURE_OUT_H 0x2A
- #define TEMP_OUT_L 0x2B
- #define TEMP_OUT_H 0x2C
- void LPS22HH_Init(void);
- float LPS22HH_GET_Pressure(void);
- float LPS22HH_GET_Temperature(void);
- LPS22HHState LPS22HH_Identity_Verification(void);
传感器初始化代码中,给IF_CTRL赋值0x00,即采用I2C模式,不使用内部上下拉;给CTRL_REG1赋值0x20,即转换频率10Hz,不使用滤波器且连续转换:
- void LPS22HH_Init(void)
- {
- uint8_t cfg1[2] = {IF_CTRL, 0x00};
- HAL_I2C_Mem_Write(&hi2c2, LPS22HH_WR, cfg1[0], I2C_MEMADD_SIZE_8BIT, cfg1 + 1, 1, 0xFF);
- uint8_t cfg2[2] = {CTRL_REG1, 0x20};
- HAL_I2C_Mem_Write(&hi2c2, LPS22HH_WR, cfg2[0], I2C_MEMADD_SIZE_8BIT, cfg2 + 1, 1, 0xFF);
- }
身份验证代码如下所示:
- LPS22HHState LPS22HH_Identity_Verification(void)
- {
- uint8_t reg_value = 0;
- HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, REG_WHO_AM_I, I2C_MEMADD_SIZE_8BIT, reg_value, 1, 0xFFFF);
- if (reg_value == 0xB3)
- return LPS22HH_PASSED;
- else
- return LPS22HH_FAILED;
- }
读取压力时,先通过I2C总线获取PRESSURE_OUT_XL、PRESSURE_OUT_L、PRESSURE_OUT_H三个寄存器的值,位移后组合为24位2进制补码形式。组合方式见下图。
该数据/4096即可换算得到单位为hPa的压力值,代码中将之转换为kPa。
- float LPS22HH_GET_Pressure(void)
- {
- float pressure = 0;
- int32_t pressure_s32 = 0;
- uint8_t pressure_xl, pressure_l, pressure_h = 0;
- HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, PRESSURE_OUT_XL, I2C_MEMADD_SIZE_8BIT, &pressure_xl, 1, 0xFFFF);
- HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, PRESSURE_OUT_L, I2C_MEMADD_SIZE_8BIT, &pressure_l, 1, 0xFFFF);
- HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, PRESSURE_OUT_H, I2C_MEMADD_SIZE_8BIT, &pressure_h, 1, 0xFFFF);
- pressure_s32 = (pressure_h << 16) | (pressure_l << 8) | pressure_xl;
- pressure = (float)pressure_s32 / 4096 / 10;
- return pressure;
- }
读取温度时,通过TEMP_OUT_L、TEMP_OUT_H组合16位温度数据,组合方式见下图:
对组合后的数据/100,即可换算得到当前温度数据;温度传感器误差范围±1.5摄氏度,转换时对其进行了补偿,代码如下:
- float LPS22HH_GET_Temperature(void)
- {
- float temperature = 0;
- int16_t temperature_s16 = 0;
- uint8_t temperature_l, temperature_h = 0;
- HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, TEMP_OUT_L, I2C_MEMADD_SIZE_8BIT, &temperature_l, 1, 0xFFFF);
- HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, TEMP_OUT_H, I2C_MEMADD_SIZE_8BIT, &temperature_h, 1, 0xFFFF);
- temperature_s16 = (temperature_h << 8) | temperature_l;
- temperature = (float)temperature_s16 / 100 - 1.5;
- return temperature;
- }
最后给出简单的气压-海拔换算公式,其中,压力单位为kPa:
- printf("----Altitude-----: %fm\r\n",44330*(1- pow(pressure/102.3,0.19))/1000);
上个图展示下效果,本人在海边,海拔大约1~2米,与换算结果较为一致: