114#ifdef BMP3_FLOAT_COMPENSATION
161static float pow_bmp3(
double base, uint8_t power);
208static uint32_t
pow_bmp3(uint8_t base, uint8_t power);
239static void interleave_reg_addr(
const uint8_t *reg_addr, uint8_t *temp_buff,
const uint8_t *reg_data, uint32_t len);
811 reg_addr = reg_addr | 0x80;
815 for (idx = 0; idx < len; idx++)
817 reg_data[idx] = temp_buff[idx + dev->
dummy_byte];
847 uint8_t temp_buff[len * 2];
849 uint8_t reg_addr_cnt;
859 temp_buff[0] = reg_data[0];
864 for (reg_addr_cnt = 0; reg_addr_cnt < len; reg_addr_cnt++)
866 reg_addr[reg_addr_cnt] = reg_addr[reg_addr_cnt] & 0x7F;
913 if (settings !=
NULL)
958 if (settings !=
NULL)
1239 uint8_t reg_data[2];
1241 if (fifo_length !=
NULL)
1270 uint8_t cmd_rdy_status;
1271 uint8_t cmd_err_status;
1313 uint8_t cmd_rdy_status;
1314 uint8_t cmd_err_status;
1353 uint8_t last_set_mode;
1360 uint8_t curr_mode = settings->
op_mode;
1407 if (op_mode !=
NULL)
1437 if (comp_data !=
NULL)
1683 uint8_t conf_err_status;
1720 uint8_t op_mode = settings->
op_mode;
1723 uint8_t op_mode_reg_val;
1731 op_mode_reg_val =
BMP3_SET_BITS(op_mode_reg_val, BMP3_OP_MODE, op_mode);
1749 uint8_t op_mode_reg_val;
1807static void interleave_reg_addr(
const uint8_t *reg_addr, uint8_t *temp_buff,
const uint8_t *reg_data, uint32_t len)
1811 for (index = 1; index < len; index++)
1813 temp_buff[(index * 2) - 1] = reg_addr[index];
1814 temp_buff[index * 2] = reg_data[index];
1933 uint8_t reg_addr[3] = { 0 };
1936 uint8_t reg_data[4];
1947 fill_osr_data(desired_settings, reg_addr, reg_data, &len, settings);
2075 uint8_t reg_data[4];
2097 uint32_t meas_t = 234;
2098 uint32_t meas_t_p = 0;
2101 uint32_t odr[18] = {
2102 5000, 10000, 20000, 40000, 80000, 160000, 320000, 640000, 1280000, 2560000, 5120000, 10240000, 20480000,
2103 40960000, 81920000, 163840000, 327680000, 655360000
2134 if (meas_t < odr_duration)
2155 uint32_t press_meas_t;
2158#ifdef BMP3_FLOAT_COMPENSATION
2163 uint32_t partial_out;
2169 return press_meas_t;
2178 uint32_t temp_meas_t;
2181#ifdef BMP3_FLOAT_COMPENSATION
2186 uint32_t partial_out;
2281 data_xlsb = (uint32_t)reg_data[0];
2282 data_lsb = (uint32_t)reg_data[1] << 8;
2283 data_msb = (uint32_t)reg_data[2] << 16;
2284 uncomp_data->
pressure = data_msb | data_lsb | data_xlsb;
2287 data_xlsb = (uint32_t)reg_data[3];
2288 data_lsb = (uint32_t)reg_data[4] << 8;
2289 data_msb = (uint32_t)reg_data[5] << 16;
2290 uncomp_data->
temperature = data_msb | data_lsb | data_xlsb;
2304 if ((uncomp_data !=
NULL) && (comp_data !=
NULL) && (calib_data !=
NULL))
2365#ifdef BMP3_FLOAT_COMPENSATION
2381 temp_var = 0.00390625f;
2383 quantized_calib_data->
par_t1 = ((double)reg_calib_data->
par_t1 / temp_var);
2385 temp_var = 1073741824.0f;
2386 quantized_calib_data->
par_t2 = ((double)reg_calib_data->
par_t2 / temp_var);
2387 reg_calib_data->
par_t3 = (int8_t)reg_data[4];
2388 temp_var = 281474976710656.0f;
2389 quantized_calib_data->
par_t3 = ((double)reg_calib_data->
par_t3 / temp_var);
2391 temp_var = 1048576.0f;
2392 quantized_calib_data->
par_p1 = ((double)(reg_calib_data->
par_p1 - (16384)) / temp_var);
2394 temp_var = 536870912.0f;
2395 quantized_calib_data->
par_p2 = ((double)(reg_calib_data->
par_p2 - (16384)) / temp_var);
2396 reg_calib_data->
par_p3 = (int8_t)reg_data[9];
2397 temp_var = 4294967296.0f;
2398 quantized_calib_data->
par_p3 = ((double)reg_calib_data->
par_p3 / temp_var);
2399 reg_calib_data->
par_p4 = (int8_t)reg_data[10];
2400 temp_var = 137438953472.0f;
2401 quantized_calib_data->
par_p4 = ((double)reg_calib_data->
par_p4 / temp_var);
2406 quantized_calib_data->
par_p5 = ((double)reg_calib_data->
par_p5 / temp_var);
2409 quantized_calib_data->
par_p6 = ((double)reg_calib_data->
par_p6 / temp_var);
2410 reg_calib_data->
par_p7 = (int8_t)reg_data[15];
2412 quantized_calib_data->
par_p7 = ((double)reg_calib_data->
par_p7 / temp_var);
2413 reg_calib_data->
par_p8 = (int8_t)reg_data[16];
2414 temp_var = 32768.0f;
2415 quantized_calib_data->
par_p8 = ((double)reg_calib_data->
par_p8 / temp_var);
2417 temp_var = 281474976710656.0f;
2418 quantized_calib_data->
par_p9 = ((double)reg_calib_data->
par_p9 / temp_var);
2419 reg_calib_data->
par_p10 = (int8_t)reg_data[19];
2420 temp_var = 281474976710656.0f;
2421 quantized_calib_data->
par_p10 = ((double)reg_calib_data->
par_p10 / temp_var);
2422 reg_calib_data->
par_p11 = (int8_t)reg_data[20];
2423 temp_var = 36893488147419103232.0f;
2424 quantized_calib_data->
par_p11 = ((double)reg_calib_data->
par_p11 / temp_var);
2439 double partial_data1;
2440 double partial_data2;
2484 double partial_data1;
2485 double partial_data2;
2486 double partial_data3;
2487 double partial_data4;
2488 double partial_out1;
2489 double partial_out2;
2491 partial_data1 = quantized_calib_data->
par_p6 * quantized_calib_data->
t_lin;
2494 partial_out1 = quantized_calib_data->
par_p5 + partial_data1 + partial_data2 + partial_data3;
2495 partial_data1 = quantized_calib_data->
par_p2 * quantized_calib_data->
t_lin;
2498 partial_out2 = uncomp_data->
pressure *
2499 (quantized_calib_data->
par_p1 + partial_data1 + partial_data2 + partial_data3);
2501 partial_data2 = quantized_calib_data->
par_p9 + quantized_calib_data->
par_p10 * quantized_calib_data->
t_lin;
2502 partial_data3 = partial_data1 * partial_data2;
2504 comp_press = partial_out1 + partial_out2 + partial_data4;
2518 (*pressure) = comp_press;
2527static float pow_bmp3(
double base, uint8_t power)
2529 float pow_output = 1;
2533 pow_output = (float) base * pow_output;
2552 reg_calib_data->
par_t3 = (int8_t)reg_data[4];
2555 reg_calib_data->
par_p3 = (int8_t)reg_data[9];
2556 reg_calib_data->
par_p4 = (int8_t)reg_data[10];
2559 reg_calib_data->
par_p7 = (int8_t)reg_data[15];
2560 reg_calib_data->
par_p8 = (int8_t)reg_data[16];
2562 reg_calib_data->
par_p10 = (int8_t)reg_data[19];
2563 reg_calib_data->
par_p11 = (int8_t)reg_data[20];
2577 int64_t partial_data1;
2578 int64_t partial_data2;
2579 int64_t partial_data3;
2580 int64_t partial_data4;
2581 int64_t partial_data5;
2582 int64_t partial_data6;
2587 partial_data3 = (int64_t)(partial_data1 * partial_data1);
2589 partial_data5 = (int64_t)((int64_t)(partial_data2 * 262144) + partial_data4);
2590 partial_data6 = (int64_t)(partial_data5 / 4294967296);
2594 comp_temp = (int64_t)((partial_data6 * 25) / 16384);
2608 (*temperature) = comp_temp;
2624 int64_t partial_data1;
2625 int64_t partial_data2;
2626 int64_t partial_data3;
2627 int64_t partial_data4;
2628 int64_t partial_data5;
2629 int64_t partial_data6;
2631 int64_t sensitivity;
2632 uint64_t comp_press;
2634 partial_data1 = (int64_t)(reg_calib_data->
t_lin * reg_calib_data->
t_lin);
2635 partial_data2 = (int64_t)(partial_data1 / 64);
2636 partial_data3 = (int64_t)((partial_data2 * reg_calib_data->
t_lin) / 256);
2637 partial_data4 = (int64_t)((reg_calib_data->
par_p8 * partial_data3) / 32);
2638 partial_data5 = (int64_t)((reg_calib_data->
par_p7 * partial_data1) * 16);
2639 partial_data6 = (int64_t)((reg_calib_data->
par_p6 * reg_calib_data->
t_lin) * 4194304);
2640 offset = (int64_t)((reg_calib_data->
par_p5 * 140737488355328) + partial_data4 + partial_data5 + partial_data6);
2641 partial_data2 = (int64_t)((reg_calib_data->
par_p4 * partial_data3) / 32);
2642 partial_data4 = (int64_t)((reg_calib_data->
par_p3 * partial_data1) * 4);
2643 partial_data5 = (int64_t)((reg_calib_data->
par_p2 - (int32_t)16384) * reg_calib_data->
t_lin * 2097152);
2645 (int64_t)(((reg_calib_data->
par_p1 - (int32_t)16384) * 70368744177664) + partial_data2 + partial_data4 +
2647 partial_data1 = (int64_t)((sensitivity / 16777216) * uncomp_data->
pressure);
2648 partial_data2 = (int64_t)(reg_calib_data->
par_p10 * reg_calib_data->
t_lin);
2649 partial_data3 = (int64_t)(partial_data2 + ((int32_t)65536 * reg_calib_data->
par_p9));
2650 partial_data4 = (int64_t)((partial_data3 * uncomp_data->
pressure) / (int32_t)8192);
2655 partial_data5 = (int64_t)((uncomp_data->
pressure * (partial_data4 / 10)) / (int32_t)512);
2656 partial_data5 = (int64_t)(partial_data5 * 10);
2658 partial_data2 = (int64_t)((reg_calib_data->
par_p11 * partial_data6) / (int32_t)65536);
2659 partial_data3 = (int64_t)((int64_t)(partial_data2 * uncomp_data->
pressure) / 128);
2660 partial_data4 = (int64_t)((offset / 4) + partial_data1 + partial_data5 + partial_data3);
2661 comp_press = (((uint64_t)partial_data4 * 25) / (uint64_t)1099511627776);
2675 (*pressure) = comp_press;
2685 uint32_t pow_output = 1;
2689 pow_output = base * pow_output;
2704 uint8_t settings_changed =
FALSE;
2706 if (sub_settings & desired_settings)
2709 settings_changed =
TRUE;
2714 settings_changed =
FALSE;
2717 return settings_changed;
static int8_t set_advance_settings(uint32_t desired_settings, const struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API sets the advance (i2c_wdt_en, i2c_wdt_sel) settings of the sensor based on the sett...
int8_t bmp3_set_sensor_settings(uint32_t desired_settings, struct bmp3_settings *settings, struct bmp3_dev *dev)
This API sets the power control(pressure enable and temperature enable), over sampling,...
static int8_t set_pwr_ctrl_settings(uint32_t desired_settings, const struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API sets the pressure enable and temperature enable settings of the sensor.
static int8_t write_power_mode(const struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API writes the power mode in the sensor.
static void parse_advance_settings(const uint8_t *reg_data, struct bmp3_adv_settings *settings)
This internal API parse the advance (i2c_wdt_en, i2c_wdt_sel) settings and store in the device struct...
static int8_t validate_osr_and_odr_settings(const struct bmp3_settings *settings)
This internal API validate the over sampling, ODR settings of the sensor.
static int8_t get_err_status(struct bmp3_status *status, struct bmp3_dev *dev)
This API gets the fatal, command and configuration error from the sensor.
static void parse_calib_data(const uint8_t *reg_data, struct bmp3_dev *dev)
This internal API is used to parse the calibration data, compensates it and store it in device struct...
static void parse_sensor_data(const uint8_t *reg_data, struct bmp3_uncomp_data *uncomp_data)
This internal API is used to parse the pressure and temperature data and store it in the bmp3_uncomp_...
static int8_t set_normal_mode(struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API sets the normal mode in the sensor.
static int8_t get_int_status(struct bmp3_status *status, struct bmp3_dev *dev)
This API gets the interrupt (fifo watermark, fifo full, data ready) status from the sensor.
static void fill_osr_data(uint32_t desired_settings, uint8_t *addr, uint8_t *reg_data, uint8_t *len, const struct bmp3_settings *settings)
This internal API fills the register address and register data of the the over sampling settings for ...
static int8_t get_calib_data(struct bmp3_dev *dev)
This internal API reads the calibration data from the sensor, parse it then compensates it and store ...
int8_t bmp3_set_op_mode(struct bmp3_settings *settings, struct bmp3_dev *dev)
This API sets the power mode of the sensor.
static int8_t get_odr_filter_settings(struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API gets the over sampling, ODR and filter settings from the sensor.
static void fill_filter_data(uint8_t *addr, uint8_t *reg_data, uint8_t *len, const struct bmp3_settings *settings)
This internal API fills the register address and register data of the the filter settings for burst w...
static int8_t put_device_to_sleep(struct bmp3_dev *dev)
This internal API puts the device to sleep mode.
static int8_t compensate_pressure(uint64_t *pressure, const struct bmp3_uncomp_data *uncomp_data, const struct bmp3_calib_data *calib_data)
This internal API is used to compensate the pressure data and return the compensated pressure data in...
static int8_t get_sensor_status(struct bmp3_status *status, struct bmp3_dev *dev)
This internal API fills the fifo_config_1(fifo_mode, fifo_stop_on_full, fifo_time_en,...
int8_t bmp3_get_status(struct bmp3_status *status, struct bmp3_dev *dev)
This API sets the fifo_config_1(fifo_mode, fifo_stop_on_full, fifo_time_en, fifo_press_en,...
static void parse_pwr_ctrl_settings(const uint8_t *reg_data, struct bmp3_settings *settings)
This internal API parse the power control(power mode, pressure enable and temperature enable) setting...
static int8_t compensate_data(uint8_t sensor_comp, const struct bmp3_uncomp_data *uncomp_data, struct bmp3_data *comp_data, struct bmp3_calib_data *calib_data)
This internal API is used to compensate the pressure or temperature or both the data according to the...
static int8_t verify_meas_time_and_odr_duration(uint32_t meas_t, uint32_t odr_duration)
This internal API checks whether the measurement time and ODR duration of the sensor are proper.
int8_t bmp3_get_sensor_data(uint8_t sensor_comp, struct bmp3_data *comp_data, struct bmp3_dev *dev)
This API reads the pressure, temperature or both data from the sensor, compensates the data and store...
static void parse_int_ctrl_settings(const uint8_t *reg_data, struct bmp3_int_ctrl_settings *settings)
This internal API parse the interrupt control(output mode, level, latch and data ready) settings and ...
static int8_t compensate_temperature(int64_t *temperature, const struct bmp3_uncomp_data *uncomp_data, struct bmp3_calib_data *calib_data)
This internal API is used to compensate the raw temperature data and return the compensated temperatu...
static int8_t null_ptr_check(const struct bmp3_dev *dev)
This internal API is used to validate the device pointer for null conditions.
int8_t bmp3_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct bmp3_dev *dev)
This API reads the data from the given register address of the sensor.
static uint8_t are_settings_changed(uint32_t sub_settings, uint32_t settings)
This internal API is used to identify the settings which the user wants to modify in the sensor.
static void interleave_reg_addr(const uint8_t *reg_addr, uint8_t *temp_buff, const uint8_t *reg_data, uint32_t len)
This internal API interleaves the register address between the register data buffer for burst write o...
static int8_t validate_normal_mode_settings(struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API validate the normal mode settings of the sensor.
int8_t bmp3_get_op_mode(uint8_t *op_mode, struct bmp3_dev *dev)
This API gets the power mode of the sensor.
static uint32_t pow_bmp3(uint8_t base, uint8_t power)
This internal API is used to calculate the power functionality.
static int8_t set_int_ctrl_settings(uint32_t desired_settings, const struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API sets the interrupt control (output mode, level, latch and data ready) settings of t...
int8_t bmp3_fifo_flush(struct bmp3_dev *dev)
This API performs the soft reset of the sensor.
static int8_t set_odr_filter_settings(uint32_t desired_settings, struct bmp3_settings *settings, struct bmp3_dev *dev)
This internal API sets the over sampling, ODR and filter settings of the sensor based on the settings...
static void fill_odr_data(uint8_t *addr, uint8_t *reg_data, uint8_t *len, struct bmp3_settings *settings)
This internal API fills the register address and register data of the the ODR settings for burst writ...
int8_t bmp3_set_regs(uint8_t *reg_addr, const uint8_t *reg_data, uint32_t len, struct bmp3_dev *dev)
This API writes the given data to the register address of the sensor.
static uint32_t calculate_temp_meas_time(const struct bmp3_settings *settings)
This internal API calculates the temperature measurement duration of the sensor.
int8_t bmp3_soft_reset(struct bmp3_dev *dev)
This API performs the soft reset of the sensor.
static void parse_odr_filter_settings(const uint8_t *reg_data, struct bmp3_odr_filter_settings *settings)
This internal API parse the over sampling, ODR and filter settings and store in the device structure.
int8_t bmp3_get_fifo_length(uint16_t *fifo_length, struct bmp3_dev *dev)
This API gets the fifo length from the sensor.
static void parse_sett_data(const uint8_t *reg_data, struct bmp3_settings *settings)
This internal API parse the power control(power mode, pressure enable and temperature enable),...
int8_t bmp3_get_sensor_settings(struct bmp3_settings *settings, struct bmp3_dev *dev)
This API gets the power control(power mode, pressure enable and temperature enable),...
static uint32_t calculate_press_meas_time(const struct bmp3_settings *settings)
This internal API calculates the pressure measurement duration of the sensor.
int8_t bmp3_init(struct bmp3_dev *dev)
This internal API converts the no. of frames required by the user to bytes so as to write in the wate...
#define BMP3_REG_PWR_CTRL
#define BMP3_MIN_TEMP_DOUBLE
#define BMP3_INTF_RET_SUCCESS
#define BMP3_MAX_TEMP_INT
#define BMP3_SEL_OUTPUT_MODE
#define BMP3_SETTLE_TIME_TEMP
#define BMP3_GET_BITS_POS_0(reg_data, bitname)
#define BMP3_ADC_CONV_TIME
#define BMP3_MAX_PRES_INT
#define BMP3_LEN_P_T_DATA
#define BMP3_MIN_PRES_INT
#define BMP3_REG_SENS_STATUS
#define BMP3_MAX_TEMP_DOUBLE
#define BMP3_SEL_I2C_WDT_EN
#define BMP3_REG_FIFO_LENGTH
#define BMP3_MIN_PRES_DOUBLE
#define BMP3_REG_INT_STATUS
#define BMP3_E_CONFIGURATION_ERR
#define BMP3_MAX_PRES_DOUBLE
#define BMP3_LEN_GEN_SETT
#define BMP3_E_INVALID_ODR_OSR_SETTINGS
#define BMP3_LEN_CALIB_DATA
#define BMP3_SEL_PRESS_EN
#define BMP3_SEL_IIR_FILTER
#define BMP3_CONCAT_BYTES(msb, lsb)
#define BMP3_REG_INT_CTRL
#define BMP3_GET_BITS(reg_data, bitname)
#define BMP3_SETTLE_TIME_PRESS
#define BMP3_MIN_TEMP_INT
#define BMP3_ODR_0_001_HZ
#define BMP3_E_DEV_NOT_FOUND
#define BMP3_REG_CALIB_DATA
#define BMP3_SEL_PRESS_OS
#define BMP3_SET_BITS(reg_data, bitname, data)
#define BMP3_SET_BITS_POS_0(reg_data, bitname, data)
#define BMP3_E_INVALID_LEN
#define BMP3_E_CMD_EXEC_FAILED
struct bmp3_reg_calib_data reg_calib_data
struct bmp3_quantized_calib_data quantized_calib_data
bmp3 sensor structure which comprises of temperature and pressure data.
BMP3_INTF_RET_TYPE intf_rslt
struct bmp3_calib_data calib_data
bmp3_delay_us_fptr_t delay_us
bmp3 interrupt pin settings
bmp3 odr and filter settings
Quantized Trim Variables.
struct bmp3_int_ctrl_settings int_settings
struct bmp3_adv_settings adv_settings
struct bmp3_odr_filter_settings odr_filter
struct bmp3_sens_status sensor
struct bmp3_err_status err
struct bmp3_int_status intr
bmp3 sensor structure which comprises of un-compensated temperature and pressure data.