该款芯片的详细信息可以看其数据手册 ,这里不多做介绍。
读写HP303S的操作是基于IIC通讯的。本实验采用的是硬件IIC通讯,所以器件地址是0x77,值得注意的是,在stm32的硬件IIC 读写操作是需要将 器件地址左移一位的,因为最低位是读写操作位(本人就是因为粗心 在这个细节上忽略了,搞得都怀疑人生)
stm32 硬件iic配置这里不做解释,很简单。
hp303S.h头文件
#ifndef HP303S_H
#define HP303S_H
#include "main.h"
#define Write 1
#define Read 0
#define HP303S_ADDRESS 0XEE //0X77<<1
#define HP303S_KP 253952.0
#define HP303S_TP 1
typedef struct
{
//压力数据
uint8_t PRS_B[3];
// uint8_t PRS_B1;
// uint8_t PRS_B0;
//温度数据
uint8_t TMP_B[3];
// uint8_t TMP_B1;
// uint8_t TMP_B0;
}HP303S_T_and_P;
typedef struct
{
uint8_t reg0x10;
uint8_t reg0x11;
uint8_t reg0x12;
uint8_t reg0x13;
uint8_t reg0x14;
uint8_t reg0x15;
uint8_t reg0x16;
uint8_t reg0x17;
uint8_t reg0x18;
uint8_t reg0x19;
uint8_t reg0x1A;
uint8_t reg0x1B;
uint8_t reg0x1C;
uint8_t reg0x1D;
uint8_t reg0x1E;
uint8_t reg0x1F;
uint8_t reg0x20;
uint8_t reg0x21;
}REG_0X10_0X21;
typedef struct
{
int32_t C0;
int32_t C1;
long C00;
long C01;
int32_t C10;
int32_t C11;
int32_t C20;
int32_t C21;
int32_t C30;
int32_t Praw;
double Praw_sc;
int32_t Traw;
double Traw_sc;
double Pcomp;
double Tcomp;
}COEF_DATA;
extern HP303S_T_and_P hp303sData;
extern REG_0X10_0X21 Reg0x10_0x20;
void HP303S_init(void);
HAL_StatusTypeDef HP303S_ReadData(void);
HAL_StatusTypeDef HP303s_WriteData(uint8_t address, uint8_t *data, uint16_t length);
void COEF_CALC(void);
#endif
hp303S.c文件
#include "hp303s.h"
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
#include "i2c.h"
#include "lora.h"
uint8_t PRS_CFG = 0x34;//压力分辨率配置 128/s 16times oversampling 寄存器0x06
uint8_t TMP_CFG = 0X84;//温度分辨率配置 寄存器0x07
uint8_t CFG_REG = 0X0C;//FIFO配置 寄存器0x09
HP303S_T_and_P hp303sData;
REG_0X10_0X21 Reg0x10_0x20;
COEF_DATA coefData;
void HP303S_init(void)
{
//从寄存器 0x10 to 0x21 中读取系数
uint8_t hpAddress = 0x10;
HAL_I2C_Mem_Read(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&Reg0x10_0x20,sizeof(Reg0x10_0x20),5000);
HAL_Delay(4000);
//压力分辨率配置 0x06
hpAddress = 0x06;
HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&PRS_CFG,sizeof(PRS_CFG),5000);
HAL_Delay(200);
//温度分辨率配置 0x07
hpAddress = 0x07;
HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&TMP_CFG,sizeof(TMP_CFG),5000);
HAL_Delay(200);
// Set P result shift Write to reg: 0x09
hpAddress = 0x09;
HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&CFG_REG,sizeof(CFG_REG),5000);
HAL_Delay(200);
COEF_CALC();
}
HAL_StatusTypeDef HP303S_ReadData(void)
{
uint8_t hpAddress = 0;
uint8_t HP303_temp = 0;//临时参数
//write 0x02 to 0x08reg
hpAddress = 0x08;
HP303_temp = 0x02;
HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&HP303_temp,sizeof(HP303_temp),5000);
HAL_Delay(10);
//read reg 0x03 to 0x05
hpAddress = 0x03;
HAL_I2C_Mem_Read(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&hp303sData.TMP_B,sizeof(hp303sData.TMP_B),5000);
HAL_Delay(10);
//计算温度
coefData.Traw = (hp303sData.TMP_B[0] << 16)| (hp303sData.TMP_B[1] << 8) | (hp303sData.TMP_B[0] << 0);
if(coefData.Traw > 8388607)
{
coefData.Traw = coefData.Traw -16777216;
}
coefData.Traw_sc = ((double)coefData.Traw/HP303S_KP);
coefData.Tcomp = coefData.C0*0.5 + coefData.C1*coefData.Traw_sc;
//write 0x01 to 0x08
hpAddress = 0x08;
HP303_temp = 0x01;
HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&HP303_temp,sizeof(HP303_temp),2000);
HAL_Delay(10);
//read 0x00 to 0x02
hpAddress = 0x00;
HAL_I2C_Mem_Read(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&hp303sData.PRS_B,sizeof(hp303sData.TMP_B),2000);
HAL_Delay(10);
//计算压强
coefData.Praw = (hp303sData.PRS_B[0] << 16) | (hp303sData.PRS_B[1] << 8) | (hp303sData.PRS_B[2] << 0);
if( coefData.Praw > 8388607)
{
coefData.Praw = coefData.Praw - 16777216;
}
coefData.Praw_sc = ((double)coefData.Praw/HP303S_KP);
coefData.Pcomp = coefData.C00 + (coefData.Praw_sc *(coefData.C10 + coefData.Praw_sc*(coefData.C20 + (coefData.Praw_sc *coefData.C30)))) + (coefData.Traw_sc *coefData.C01) + (coefData.Traw_sc * coefData.Praw_sc *(coefData.C11 + (coefData.Praw_sc*coefData.C21)));
//清除缓存数据
hpAddress = 0x0c;
HP303_temp = 0x80;
HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&HP303_temp,sizeof(HP303_temp),2000);
return HAL_OK;
}
HAL_StatusTypeDef HP303s_WriteData(uint8_t address, uint8_t *data, uint16_t length)
{
HAL_StatusTypeDef res;
res = HAL_I2C_Master_Transmit(&hi2c1,address,data,length,5000);
return res;
}
void COEF_CALC(void)
{
coefData.C0 = ( Reg0x10_0x20.reg0x10 << 4) | ((Reg0x10_0x20.reg0x11 & 0XF0) >> 4);
if(coefData.C0 > (2048 - 1))
{
coefData.C0 = coefData.C0 - 4096;
}
coefData.C1 = ((Reg0x10_0x20.reg0x11 & 0X0F)<<8 | (Reg0x10_0x20.reg0x12));
if(coefData.C1 > 2047)
{
coefData.C1 = coefData.C1-4096;
}
coefData.C00 = (Reg0x10_0x20.reg0x13<<12)|(Reg0x10_0x20.reg0x14 << 4)|((Reg0x10_0x20.reg0x15&0xF0) >> 4);
if(coefData.C00 > 524287)
{
coefData.C00 = coefData.C00 - 1048576;
}
coefData.C10 = ((Reg0x10_0x20.reg0x15&0x0F) << 16) | (Reg0x10_0x20.reg0x16 << 8) | Reg0x10_0x20.reg0x17;
if(coefData.C10 > 524287)
{
coefData.C10 = coefData.C10 - 1048576;
}
coefData.C01= (Reg0x10_0x20.reg0x18 <<8) | (Reg0x10_0x20.reg0x19);
if(coefData.C01 > 32767)
{
coefData.C01 = coefData.C01 - 65536;
}
coefData.C11 = (Reg0x10_0x20.reg0x1A << 8) |(Reg0x10_0x20.reg0x1B);
if(coefData.C11 > 32767)
{
coefData.C11 = coefData.C11 - 65536;
}
coefData.C20 = Reg0x10_0x20.reg0x1B | (Reg0x10_0x20.reg0x1C << 8);
if(coefData.C20 > (32768-1))
{
coefData.C20 = coefData.C20 - 65536;
}
coefData.C21 = (Reg0x10_0x20.reg0x1E <<8) | (Reg0x10_0x20.reg0x1F);
if(coefData.C21 > 32767)
{
coefData.C21 = coefData.C21 - 65536;
}
coefData.C30 = (Reg0x10_0x20.reg0x20 <<8 ) | (Reg0x10_0x20.reg0x21);
if(coefData.C30 > 32767)
{
coefData.C30 = coefData.C30 - 65536;
}
}
main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
HP303S_init();
/* USER CODE END 2 */
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HP303S_ReadData();
HAL_Delay(100);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
试验现象
制作不易,如果对你有帮助记得点赞哦