174 lines
5.7 KiB
C
174 lines
5.7 KiB
C
#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
|