KT24-1110_65E-HA-651B/apps/common/device/bmp280/bmp280.h
2024-11-10 18:44:17 +08:00

174 lines
5.7 KiB
C
Raw Permalink 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.

#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