micro_climate/Drivers/HP203B/hp203b.c

94 lines
3.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "hp203b.h"
#include "i2c.h"
#include "pdebug.h"
#include "assertions.h"
#include "filter.h"
#include "cmsis_os.h"
uint8_t hp20X_SOFT_RST = 0x06; //软复位
uint8_t hp20X_READ_P = 0x30; //压力
uint8_t hp20X_READ_A = 0x31; //高度
uint8_t hp20X_READ_T = 0x32; //温度
uint8_t hp20X_READ_PT = 0x10; //温度压力
uint8_t hp20X_READ_AT = 0x11; //温度海拔
/****************************
*名称HP203_soft_reset
*功能对hp203发送软复位指令
*参数:无
*返回:无
*****************************/
void HP203_soft_reset(void)
{
HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &hp20X_SOFT_RST, 1, 0xffff);//0xec,0x06----进行软件复位
osDelay(30); //延时20MS thread误差+10
}
/****************************
*名称Hp203bReadPressureTemperature
*功能:获取气压、海拔、温度数据
*参数: Press--气压值
* Altitude--海拔
* Temp--温度
*返回:无
*****************************/
void Hp203bReadPressureTemperature(double *Hp203bPressure,double *Hp203bAltitude,double *Hp203bTemp)
{
uint8_t Osr_Cfg = HP20X_CONVERT_OSR1024; //0x08
uint8_t DataBuf[6];
long Hp203b_Temp;
long Hp203b_Pressure;
long Hp203b_Altitude;
uint8_t status = 0xFF;
uint8_t command = HP20X_WR_CONVERT_CMD | Osr_Cfg;
status = HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &command, 1, 0xffff);
// while(status != HAL_OK){}
if(HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &command, 1, 0xffff) == HAL_OK) //0x40 | 0x08 = 0x48----010: fixed; 010: OSR = 1024; 00: sensor pressure and temperature channel;
{
osDelay(74); //延时64MS 具体可以根据OSR值调整 thread误差+10
HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &hp20X_READ_PT, 1, 0xffff); //命令0x10----读取温度和压力数据
HAL_I2C_Master_Receive(&hi2c3, HP20X_ADDRESSCMD, DataBuf, 6, 0xffff); //读取6个字节数据3个字节的温度数据和3个字节的压力数据
Hp203b_Temp = DataBuf[0]; //将3个字节的温度数据整合成24位的温度数据
Hp203b_Temp <<= 8;
Hp203b_Temp |= DataBuf[1];
Hp203b_Temp <<= 8;
Hp203b_Temp |= DataBuf[2];
if(Hp203b_Temp > 0x7FFFFF) //判断是否负值
Hp203b_Temp = Hp203b_Temp - 16777216;
*Hp203bTemp = (double)Hp203b_Temp / 100; //计算温度数据
Hp203b_Pressure = DataBuf[3]; //将3个字节的压力数据整合成24位的压力数据
Hp203b_Pressure <<= 8;
Hp203b_Pressure |= DataBuf[4];
Hp203b_Pressure <<= 8;
Hp203b_Pressure |= DataBuf[5];
*Hp203bPressure = (double)Hp203b_Pressure / 100; //计算压力数据
HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &hp20X_READ_A, 1, 0xffff); //命令0x31----读取高度数据
HAL_I2C_Master_Receive(&hi2c3, HP20X_ADDRESSCMD, DataBuf, 3, 0xffff); //读取3个字节数据3个字节的高度数据
Hp203b_Altitude = DataBuf[0]; //将3个字节的高度数据整合成24位的高度数据
Hp203b_Altitude <<= 8;
Hp203b_Altitude |= DataBuf[1];
Hp203b_Altitude <<= 8;
Hp203b_Altitude |= DataBuf[2];
if(Hp203b_Altitude > 0x7FFFFF) //判断是否负值
Hp203b_Altitude = Hp203b_Altitude - 16777216;
*Hp203bAltitude = (double)Hp203b_Altitude / 100; //计算高度数据
}
}