KT24-1110_65E-HA-651B/apps/common/device/bmp280/bmp280.h

174 lines
5.7 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#ifndef _BMP280_H_
#define _BMP280_H_
#include "typedef.h"
#include "os/os_api.h"
#include "system/includes.h"
#include "media/includes.h"
#include "asm/iic_hw.h"
#include "asm/iic_soft.h"
#include "asm/timer.h"
#define TCFG_BMP280_DEV_ENABLE 1
#define TCFG_BMP280_USER_IIC_TYPE 0
#if TCFG_BMP280_DEV_ENABLE
struct _bmp280_dev_platform_data {
u8 comms; //0:IIC; 1:SPI
u8 iic_hdl;
u8 iic_delay; //这个延时并非影响iic的时钟频率而是2Byte数据之间的延时
};
#define BMP280_I2C_ADDR 0x76 // The BMP280 I2C address
#define BMP280_I2C_ALT_ADDR 0x77 // The BMP280 I2C alternate address
#define BMP280_DEVICE_ID 0x58 // The BMP280 device ID
#define BMP280_RESET_VALUE 0xB6 // The BMP280 reset code
#define BMP280_CHIPID_REG 0xD0 /*Chip ID Register */
#define BMP280_RESET_REG 0xE0 /*Softreset Register */
#define BMP280_STATUS_REG 0xF3 /*Status Register */
#define BMP280_CTRLMEAS_REG 0xF4 /*Ctrl Measure Register */
#define BMP280_CONFIG_REG 0xF5 /*Configuration Register */
#define BMP280_PRESSURE_MSB_REG 0xF7 /*Pressure MSB Register */
#define BMP280_PRESSURE_LSB_REG 0xF8 /*Pressure LSB Register */
#define BMP280_PRESSURE_XLSB_REG 0xF9 /*Pressure XLSB Register */
#define BMP280_TEMPERATURE_MSB_REG 0xFA /*Temperature MSB Reg */
#define BMP280_TEMPERATURE_LSB_REG 0xFB /*Temperature LSB Reg */
#define BMP280_TEMPERATURE_XLSB_REG 0xFC /*Temperature XLSB Reg */
//状态寄存器转换标志
#define BMP280_MEASURING 0x01
#define BMP280_IM_UPDATE 0x08
/*calibration parameters */
#define BMP280_DIG_T1_LSB_REG 0x88
#define BMP280_DIG_T1_MSB_REG 0x89
#define BMP280_DIG_T2_LSB_REG 0x8A
#define BMP280_DIG_T2_MSB_REG 0x8B
#define BMP280_DIG_T3_LSB_REG 0x8C
#define BMP280_DIG_T3_MSB_REG 0x8D
#define BMP280_DIG_P1_LSB_REG 0x8E
#define BMP280_DIG_P1_MSB_REG 0x8F
#define BMP280_DIG_P2_LSB_REG 0x90
#define BMP280_DIG_P2_MSB_REG 0x91
#define BMP280_DIG_P3_LSB_REG 0x92
#define BMP280_DIG_P3_MSB_REG 0x93
#define BMP280_DIG_P4_LSB_REG 0x94
#define BMP280_DIG_P4_MSB_REG 0x95
#define BMP280_DIG_P5_LSB_REG 0x96
#define BMP280_DIG_P5_MSB_REG 0x97
#define BMP280_DIG_P6_LSB_REG 0x98
#define BMP280_DIG_P6_MSB_REG 0x99
#define BMP280_DIG_P7_LSB_REG 0x9A
#define BMP280_DIG_P7_MSB_REG 0x9B
#define BMP280_DIG_P8_LSB_REG 0x9C
#define BMP280_DIG_P8_MSB_REG 0x9D
#define BMP280_DIG_P9_LSB_REG 0x9E
#define BMP280_DIG_P9_MSB_REG 0x9F
/******************ctrl_meas reg************************/
//BMP工作模式 bit:1,0
typedef enum {
BMP280_SLEEP_MODE = 0x0,
BMP280_FORCED_MODE = 0x1, //可以说0x2
BMP280_NORMAL_MODE = 0x3
} BMP280_WORK_MODE;
//BMP压力过采样因子 bit:4,3,2
typedef enum {
BMP280_P_MODE_SKIP = 0x0, /*skipped*/
BMP280_P_MODE_1, /*x1*/
BMP280_P_MODE_2, /*x2*/
BMP280_P_MODE_3, /*x4*/
BMP280_P_MODE_4, /*x8*/
BMP280_P_MODE_5 /*x16*/
} BMP280_P_OVERSAMPLING;
//BMP温度过采样因子 bit:7,6,5
typedef enum {
BMP280_T_MODE_SKIP = 0x0, /*skipped*/
BMP280_T_MODE_1, /*x1*/
BMP280_T_MODE_2, /*x2*/
BMP280_T_MODE_3, /*x4*/
BMP280_T_MODE_4, /*x8*/
BMP280_T_MODE_5 /*x16*/
} BMP280_T_OVERSAMPLING;
/******************config reg************************/
//bit0:spi3w_en: 1:enable spi 3-wire
//IIR滤波器时间常数 bit:4,3,2
typedef enum {
BMP280_FILTER_OFF = 0x0, /*filter off*/
BMP280_FILTER_MODE_1, /*0.223*ODR*/ /*x2*/
BMP280_FILTER_MODE_2, /*0.092*ODR*/ /*x4*/
BMP280_FILTER_MODE_3, /*0.042*ODR*/ /*x8*/
BMP280_FILTER_MODE_4 /*0.021*ODR*/ /*x16*/
} BMP280_FILTER_COEFFICIENT;
//保持时间 bit:7,6,5
typedef enum {
BMP280_T_SB1 = 0x0, /*0.5ms*/
BMP280_T_SB2, /*62.5ms*/
BMP280_T_SB3, /*125ms*/
BMP280_T_SB4, /*250ms*/
BMP280_T_SB5, /*500ms*/
BMP280_T_SB6, /*1000ms*/
BMP280_T_SB7, /*2000ms*/
BMP280_T_SB8, /*4000ms*/
} BMP280_T_SB;
typedef struct {
/* T1~P9 为补偿系数 */
u16 t1;
s16 t2;
s16 t3;
u16 p1;
s16 p2;
s16 p3;
s16 p4;
s16 p5;
s16 p6;
s16 p7;
s16 p8;
s16 p9;
} bmp280_params;
typedef struct {
BMP280_T_OVERSAMPLING t_osample;
BMP280_P_OVERSAMPLING p_osample;
BMP280_WORK_MODE workmode;
} bmp_oversample_mode;
typedef struct {
BMP280_T_SB t_sb;
BMP280_FILTER_COEFFICIENT filter_coefficient;
u8 spi_en;
} bmp_config;
#define USE_FIXED_POINT_COMPENSATE 1//数据补偿算法选择:1:使用定点补偿 0:使用浮点补偿
#if USE_FIXED_POINT_COMPENSATE //使用定点补偿
typedef u32 bmp_pressure_data;
typedef s32 bmp_temperature_data;
#else //使用浮点补偿
typedef double bmp_pressure_data;
typedef double bmp_temperature_data;
#endif
bool bmp280_init(void *priv);
bool bmp280_set_temoversamp(bmp_oversample_mode *oversample_mode);
bool bmp280_set_standby_filter(bmp_config *bmp_config);
void bmp280_set_work_mode(BMP280_WORK_MODE workmode);
bool bmp280_reset(); //return 1:ok; 0:fail
void bmp280_get_temperature_and_pressure(bmp_temperature_data *temperature, bmp_pressure_data *pressure);
void bmp280_forced_mode_get_temperature_and_pressure(bmp_temperature_data *temperature, bmp_pressure_data *pressure);
float bmp280_get_altitude(bmp_temperature_data temperature, bmp_pressure_data pressure);
// void bmp280_init_read_test();
#endif
#endif