1、IIC配置

2、lps22hb.c
#include "lps22hb.h"
float lps22hb_temp,lps22hb_pressure;
extern I2C_HandleTypeDef hi2c1;
/* Functions -------------------------------------------------------------------------------*/
//读寄存器
static void LPS22_Mem_Read(uint8_t MemAddress,uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
{
HAL_I2C_Mem_Read(&hi2c1, (LPS22HB_I2C_ADDR<<1) | 1, MemAddress , MemAddSize, pData, Size, 0xFF);
}
//写寄存器
static void LPS22_Mem_Write(uint8_t MemAddress,uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
{
HAL_I2C_Mem_Write(&hi2c1, LPS22HB_I2C_ADDR<<1, MemAddress , MemAddSize, pData, Size, 0xFF);
}
/**
* @brief LPS22HB_Init
*/
void LPS22HB_Init(void)
{
uint8_t reg_temp = 0;
//验证ID
LPS22_Mem_Read(LPS22HB_WHO_AM_I , 1, ®_temp, 1);
if(reg_temp != LPS22HB_DEVICE_ID)
{
mSensor_Flag.LPS22HB_status = 2; //验证ID失败,传感器异常
return;
}
/* Normal mode (low-noise mode) */
LPS22_Mem_Read(LPS22HB_RES_CONF,1,®_temp,1);
reg_temp &= 0x02;
reg_temp |= 0x00;
LPS22_Mem_Write(LPS22HB_RES_CONF,1,®_temp,1);
HAL_Delay(5);
/* Control register 1 */
reg_temp = 0x00;
reg_temp |= 0x20; // Output data rate, 10 Hz
reg_temp |= 0x00; // Low-pass filter disabled
reg_temp |= 0x02; // Block data update, enable
LPS22_Mem_Write(LPS22HB_CTRL_REG1 ,1, ®_temp,1);
HAL_Delay(5);
/* Control register 2 */
LPS22_Mem_Read(LPS22HB_CTRL_REG2,1,®_temp,1);
reg_temp &= 0xED;
reg_temp |= 0x10;
LPS22_Mem_Write(LPS22HB_CTRL_REG2,1,®_temp,1);
HAL_Delay(5);
mSensor_Flag.LPS22HB_status = 1; //传感器正常
}
/**
* @brief LPS22_GetRawData
*/
void LPS22HB_Get_Data(void)
{
uint8_t data_buff[3];
uint32_t data_tmp = 0;
//读取气压数据
LPS22_Mem_Read(LPS22HB_PRESS_OUT_XL , 1, data_buff, 3);
data_tmp = data_buff[2] << 16;
data_tmp |= data_buff[1] << 8;
data_tmp |= data_buff[0];
/* convert the 2's complement 24 bit to 2's complement 32 bit */
if(data_tmp & 0x00800000)
{
data_tmp |= 0xFF000000;
}
lps22hb_pressure = (data_tmp>>12) * 0.1;
//读取温度数据
LPS22_Mem_Read(LPS22HB_TEMP_OUT_L,1,data_buff,2);
data_tmp = data_buff[1] << 8;
data_tmp |= data_buff[0];
lps22hb_temp = data_tmp* 0.01;
}
/***************************** END OF FILE **************************/
3、lps22hb.h
#ifndef __LPS22HB_H
#define __LPS22HB_H
#include "main.h"
/* ---- LPS22HB Reg -------------------------------------------------------- */
#define LPS22HB_I2C_ADDR ((uint8_t)0x5C) /* 7b'1011100 */
#define LPS22HB_DEVICE_ID ((uint8_t)0xB1)
#define LPS22HB_INTERRUPT_CFG ((uint8_t)0x0B)
#define LPS22HB_THS_P_L ((uint8_t)0x0C)
#define LPS22HB_THS_P_H ((uint8_t)0x0D)
#define LPS22HB_WHO_AM_I ((uint8_t)0x0F)
#define LPS22HB_CTRL_REG1 ((uint8_t)0x10)
#define LPS22HB_CTRL_REG2 ((uint8_t)0x11)
#define LPS22HB_CTRL_REG3 ((uint8_t)0x12)
#define LPS22HB_FIFO_CTRL ((uint8_t)0x14)
#define LPS22HB_REF_P_XL ((uint8_t)0x15)
#define LPS22HB_REF_P_L ((uint8_t)0x16)
#define LPS22HB_REF_P_H ((uint8_t)0x17)
#define LPS22HB_RPDS_L ((uint8_t)0x18)
#define LPS22HB_RPDS_H ((uint8_t)0x19)
#define LPS22HB_RES_CONF ((uint8_t)0x1A)
#define LPS22HB_INT_SOURCE ((uint8_t)0x25)
#define LPS22HB_FIFO_STATUS ((uint8_t)0x26)
#define LPS22HB_STATUS ((uint8_t)0x27)
#define LPS22HB_PRESS_OUT_XL ((uint8_t)0x28)
#define LPS22HB_PRESS_OUT_L ((uint8_t)0x29)
#define LPS22HB_PRESS_OUT_H ((uint8_t)0x2A)
#define LPS22HB_TEMP_OUT_L ((uint8_t)0x2B)
#define LPS22HB_TEMP_OUT_H ((uint8_t)0x2C)
#define LPS22HB_LPFP_RES ((uint8_t)0x33)
void LPS22HB_Init(void);
void LPS22HB_Get_Data(void);
#endif