Firmware enhancements for HSP_RPC_GUI 3.0.1

Dependencies:   USBDevice

Fork of HSP_RPC_GUI by Maxim Integrated

This command can be used to import the project to your local environment

This command can be used to compile the code and produce the HSP_RPC_GUI_3_0_1.bin

Quote:

mbed compile -t GCC_ARM -m MAX32620HSP

This link may be used to install the mbed command-line-interface (cli) if needed

Committer:
jbradshaw
Date:
Tue Apr 25 10:47:10 2017 -0500
Revision:
3:8e9b9f5818aa
Parent:
1:9490836294ea
Removed Bulk Erasing, instead a small number of bytes are sampled from each and every page to determine if sector is "dirty", if so sector is erased
Prevents device from sleeping when the firmware detects a series of binary flash page RPC transfers, this increases flash page transfers by %450
when 200mS elapse with the last flash page transfer, normal sleep behaviour is resumed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jbradshaw 0:e4a10ed6eb92 1 /*******************************************************************************
jbradshaw 0:e4a10ed6eb92 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
jbradshaw 0:e4a10ed6eb92 3 *
jbradshaw 0:e4a10ed6eb92 4 * Permission is hereby granted, free of charge, to any person obtaining a
jbradshaw 0:e4a10ed6eb92 5 * copy of this software and associated documentation files (the "Software"),
jbradshaw 0:e4a10ed6eb92 6 * to deal in the Software without restriction, including without limitation
jbradshaw 0:e4a10ed6eb92 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
jbradshaw 0:e4a10ed6eb92 8 * and/or sell copies of the Software, and to permit persons to whom the
jbradshaw 0:e4a10ed6eb92 9 * Software is furnished to do so, subject to the following conditions:
jbradshaw 0:e4a10ed6eb92 10 *
jbradshaw 0:e4a10ed6eb92 11 * The above copyright notice and this permission notice shall be included
jbradshaw 0:e4a10ed6eb92 12 * in all copies or substantial portions of the Software.
jbradshaw 0:e4a10ed6eb92 13 *
jbradshaw 0:e4a10ed6eb92 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
jbradshaw 0:e4a10ed6eb92 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
jbradshaw 0:e4a10ed6eb92 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
jbradshaw 0:e4a10ed6eb92 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
jbradshaw 0:e4a10ed6eb92 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
jbradshaw 0:e4a10ed6eb92 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
jbradshaw 0:e4a10ed6eb92 20 * OTHER DEALINGS IN THE SOFTWARE.
jbradshaw 0:e4a10ed6eb92 21 *
jbradshaw 0:e4a10ed6eb92 22 * Except as contained in this notice, the name of Maxim Integrated
jbradshaw 0:e4a10ed6eb92 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
jbradshaw 0:e4a10ed6eb92 24 * Products, Inc. Branding Policy.
jbradshaw 0:e4a10ed6eb92 25 *
jbradshaw 0:e4a10ed6eb92 26 * The mere transfer of this software does not imply any licenses
jbradshaw 0:e4a10ed6eb92 27 * of trade secrets, proprietary technology, copyrights, patents,
jbradshaw 0:e4a10ed6eb92 28 * trademarks, maskwork rights, or any other form of intellectual
jbradshaw 0:e4a10ed6eb92 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
jbradshaw 0:e4a10ed6eb92 30 * ownership rights.
jbradshaw 0:e4a10ed6eb92 31 *******************************************************************************
jbradshaw 0:e4a10ed6eb92 32 */
jbradshaw 0:e4a10ed6eb92 33 #include "mbed.h"
jbradshaw 0:e4a10ed6eb92 34 #include "BMP280.h"
jbradshaw 0:e4a10ed6eb92 35
jbradshaw 0:e4a10ed6eb92 36 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 37 BMP280::BMP280(PinName sda, PinName scl, int slaveAddress) :
jbradshaw 0:e4a10ed6eb92 38 slaveAddress(slaveAddress) {
jbradshaw 1:9490836294ea 39
jbradshaw 0:e4a10ed6eb92 40 i2c = new I2C(sda, scl);
jbradshaw 0:e4a10ed6eb92 41 isOwner = true;
jbradshaw 0:e4a10ed6eb92 42 }
jbradshaw 1:9490836294ea 43
jbradshaw 0:e4a10ed6eb92 44 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 45 BMP280::BMP280(I2C *i2c, int slaveAddress) :
jbradshaw 0:e4a10ed6eb92 46 slaveAddress(slaveAddress) {
jbradshaw 1:9490836294ea 47
jbradshaw 0:e4a10ed6eb92 48 this->i2c = i2c;
jbradshaw 0:e4a10ed6eb92 49 isOwner = false;
jbradshaw 0:e4a10ed6eb92 50
jbradshaw 0:e4a10ed6eb92 51 i2c->frequency(100000);
jbradshaw 0:e4a10ed6eb92 52 loggingEnabled = 0;
jbradshaw 0:e4a10ed6eb92 53 loggingSampleRate = 5;
jbradshaw 0:e4a10ed6eb92 54 }
jbradshaw 1:9490836294ea 55
jbradshaw 0:e4a10ed6eb92 56 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 57 BMP280::~BMP280(void) {
jbradshaw 1:9490836294ea 58
jbradshaw 0:e4a10ed6eb92 59 if (isOwner == true) {
jbradshaw 0:e4a10ed6eb92 60 delete i2c;
jbradshaw 0:e4a10ed6eb92 61 }
jbradshaw 0:e4a10ed6eb92 62 }
jbradshaw 0:e4a10ed6eb92 63
jbradshaw 0:e4a10ed6eb92 64 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 65 int BMP280::init(BMP280::bmp280_osrs_P_t Osrs_p, BMP280::bmp280_osrs_T_t Osrs_t,
jbradshaw 0:e4a10ed6eb92 66 BMP280::bmp280_FILT_t Filter, BMP280::bmp280_MODE_t Mode,
jbradshaw 1:9490836294ea 67 BMP280::bmp280_TSB_t T_sb) {
jbradshaw 0:e4a10ed6eb92 68
jbradshaw 0:e4a10ed6eb92 69 char raw_Tn[6];
jbradshaw 0:e4a10ed6eb92 70 char raw_Pn[20];
jbradshaw 1:9490836294ea 71
jbradshaw 1:9490836294ea 72 bmp280_ctrl_meas_t ctrl_meas;
jbradshaw 1:9490836294ea 73 bmp280_config_t config;
jbradshaw 0:e4a10ed6eb92 74
jbradshaw 1:9490836294ea 75 ///
jbradshaw 1:9490836294ea 76 /// Read all the temp coeffecients from the BMP280 memory. It will be used in
jbradshaw 1:9490836294ea 77 /// calculation
jbradshaw 1:9490836294ea 78 ///
jbradshaw 1:9490836294ea 79 if (reg_read(BMP280_CALIB00, raw_Tn, 6) != 0) {
jbradshaw 0:e4a10ed6eb92 80 return -1;
jbradshaw 0:e4a10ed6eb92 81 }
jbradshaw 0:e4a10ed6eb92 82
jbradshaw 0:e4a10ed6eb92 83 dig_T1 = (((uint16_t)raw_Tn[1]) << 8) | raw_Tn[0];
jbradshaw 0:e4a10ed6eb92 84 dig_T2 = (((int16_t)raw_Tn[3]) << 8) | raw_Tn[2];
jbradshaw 0:e4a10ed6eb92 85 dig_T3 = (((int16_t)raw_Tn[5]) << 8) | raw_Tn[4];
jbradshaw 0:e4a10ed6eb92 86
jbradshaw 1:9490836294ea 87 ///
jbradshaw 1:9490836294ea 88 /// Read all the press coeffecients from the BMP280 memory. It will be used in
jbradshaw 1:9490836294ea 89 /// calculation
jbradshaw 1:9490836294ea 90 ///
jbradshaw 1:9490836294ea 91 if (reg_read((BMP280_REG_map_t)(BMP280_CALIB00+6) /*reg*/, raw_Pn, 20) != 0) {
jbradshaw 0:e4a10ed6eb92 92 return -1;
jbradshaw 0:e4a10ed6eb92 93 }
jbradshaw 0:e4a10ed6eb92 94
jbradshaw 0:e4a10ed6eb92 95 dig_P1 = (((uint16_t)raw_Pn[1]) << 8) | raw_Pn[0];
jbradshaw 0:e4a10ed6eb92 96 dig_P2 = (((int16_t)raw_Pn[3]) << 8) | raw_Pn[2];
jbradshaw 0:e4a10ed6eb92 97 dig_P3 = (((int16_t)raw_Pn[5]) << 8) | raw_Pn[4];
jbradshaw 0:e4a10ed6eb92 98 dig_P4 = (((int16_t)raw_Pn[7]) << 8) | raw_Pn[6];
jbradshaw 0:e4a10ed6eb92 99 dig_P5 = (((int16_t)raw_Pn[9]) << 8) | raw_Pn[8];
jbradshaw 0:e4a10ed6eb92 100 dig_P6 = (((int16_t)raw_Pn[11]) << 8) | raw_Pn[10];
jbradshaw 0:e4a10ed6eb92 101 dig_P7 = (((int16_t)raw_Pn[13]) << 8) | raw_Pn[12];
jbradshaw 0:e4a10ed6eb92 102 dig_P8 = (((int16_t)raw_Pn[15]) << 8) | raw_Pn[14];
jbradshaw 0:e4a10ed6eb92 103 dig_P9 = (((int16_t)raw_Pn[17]) << 8) | raw_Pn[16];
jbradshaw 0:e4a10ed6eb92 104
jbradshaw 0:e4a10ed6eb92 105
jbradshaw 0:e4a10ed6eb92 106 wait(1.0 / 10.0);
jbradshaw 0:e4a10ed6eb92 107
jbradshaw 0:e4a10ed6eb92 108 /****/
jbradshaw 1:9490836294ea 109 if (reg_read(BMP280_CTRL_MEAS, &ctrl_meas.all, 1) != 0) {
jbradshaw 0:e4a10ed6eb92 110 return -1;
jbradshaw 0:e4a10ed6eb92 111 }
jbradshaw 0:e4a10ed6eb92 112
jbradshaw 1:9490836294ea 113 ctrl_meas.bit.osrs_p = Osrs_p;
jbradshaw 1:9490836294ea 114 ctrl_meas.bit.osrs_t = Osrs_t;
jbradshaw 0:e4a10ed6eb92 115
jbradshaw 1:9490836294ea 116 ctrl_meas.bit.mode = Mode;
jbradshaw 0:e4a10ed6eb92 117
jbradshaw 1:9490836294ea 118 if (reg_write(BMP280_CTRL_MEAS, ctrl_meas.all) != 0) {
jbradshaw 0:e4a10ed6eb92 119 return -1;
jbradshaw 0:e4a10ed6eb92 120 }
jbradshaw 0:e4a10ed6eb92 121
jbradshaw 0:e4a10ed6eb92 122 /****/
jbradshaw 0:e4a10ed6eb92 123
jbradshaw 1:9490836294ea 124 if (reg_read(BMP280_CONFIG, &config.all, 1) != 0) {
jbradshaw 0:e4a10ed6eb92 125 return -1;
jbradshaw 0:e4a10ed6eb92 126 }
jbradshaw 0:e4a10ed6eb92 127
jbradshaw 1:9490836294ea 128 config.bit.filter = Filter;
jbradshaw 0:e4a10ed6eb92 129
jbradshaw 0:e4a10ed6eb92 130 if (Mode == 0b11) {
jbradshaw 1:9490836294ea 131 config.bit.t_sb = T_sb;
jbradshaw 0:e4a10ed6eb92 132 }
jbradshaw 0:e4a10ed6eb92 133
jbradshaw 1:9490836294ea 134 if (reg_write(BMP280_CONFIG, config.all) != 0) {
jbradshaw 0:e4a10ed6eb92 135 return -1;
jbradshaw 0:e4a10ed6eb92 136 }
jbradshaw 0:e4a10ed6eb92 137
jbradshaw 0:e4a10ed6eb92 138 return 0;
jbradshaw 0:e4a10ed6eb92 139 }
jbradshaw 0:e4a10ed6eb92 140
jbradshaw 0:e4a10ed6eb92 141 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 142 float BMP280::ToFahrenheit(float temperature) {
jbradshaw 1:9490836294ea 143
jbradshaw 1:9490836294ea 144 return temperature * (9 / 5.0f) + 32;
jbradshaw 0:e4a10ed6eb92 145 }
jbradshaw 0:e4a10ed6eb92 146
jbradshaw 0:e4a10ed6eb92 147 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 148 int BMP280::ReadCompDataRaw2(char *bmp280_rawData) {
jbradshaw 1:9490836294ea 149
jbradshaw 0:e4a10ed6eb92 150 int i;
jbradshaw 0:e4a10ed6eb92 151 char data[6];
jbradshaw 0:e4a10ed6eb92 152 float temp;
jbradshaw 0:e4a10ed6eb92 153 float pressure;
jbradshaw 0:e4a10ed6eb92 154 int iPressure;
jbradshaw 0:e4a10ed6eb92 155 char str[32];
jbradshaw 0:e4a10ed6eb92 156 ReadCompDataRaw(data);
jbradshaw 0:e4a10ed6eb92 157 ToFloat(data, &temp, &pressure);
jbradshaw 0:e4a10ed6eb92 158 iPressure = (int)pressure;
jbradshaw 0:e4a10ed6eb92 159 sprintf(str, "%d ", iPressure);
jbradshaw 0:e4a10ed6eb92 160 for (i = 0; i < 6; i++) {
jbradshaw 0:e4a10ed6eb92 161 bmp280_rawData[i] = str[i];
jbradshaw 0:e4a10ed6eb92 162 }
jbradshaw 0:e4a10ed6eb92 163 return 0;
jbradshaw 0:e4a10ed6eb92 164 }
jbradshaw 0:e4a10ed6eb92 165
jbradshaw 0:e4a10ed6eb92 166 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 167 int BMP280::ReadCompDataRaw(char *bmp280_rawData) {
jbradshaw 0:e4a10ed6eb92 168
jbradshaw 1:9490836294ea 169 if (reg_read(BMP280_PRESS_MSB, bmp280_rawData, 6) != 0) {
jbradshaw 0:e4a10ed6eb92 170 return -1;
jbradshaw 0:e4a10ed6eb92 171 }
jbradshaw 0:e4a10ed6eb92 172 return 0;
jbradshaw 0:e4a10ed6eb92 173 }
jbradshaw 0:e4a10ed6eb92 174
jbradshaw 0:e4a10ed6eb92 175 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 176 void BMP280::ToFloat(char *bmp280_rawData, float *Temp_degC, float *Press_Pa) {
jbradshaw 1:9490836294ea 177
jbradshaw 0:e4a10ed6eb92 178 bmp280_rawPress = (uint32_t)(bmp280_rawData[0] << 12) |
jbradshaw 0:e4a10ed6eb92 179 (bmp280_rawData[1] << 4) | (bmp280_rawData[2] >> 4);
jbradshaw 0:e4a10ed6eb92 180
jbradshaw 0:e4a10ed6eb92 181 bmp280_rawTemp = (uint32_t)(bmp280_rawData[3] << 12) |
jbradshaw 0:e4a10ed6eb92 182 (bmp280_rawData[4] << 4) | (bmp280_rawData[5] >> 4);
jbradshaw 0:e4a10ed6eb92 183
jbradshaw 0:e4a10ed6eb92 184 *Temp_degC = compensate_T_float(bmp280_rawTemp);
jbradshaw 0:e4a10ed6eb92 185 *Press_Pa = compensate_P_float(bmp280_rawPress);
jbradshaw 0:e4a10ed6eb92 186 }
jbradshaw 0:e4a10ed6eb92 187
jbradshaw 0:e4a10ed6eb92 188 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 189 int BMP280::ReadCompData(float *Temp_degC, float *Press_Pa) {
jbradshaw 1:9490836294ea 190
jbradshaw 0:e4a10ed6eb92 191 char bmp280_rawData[6];
jbradshaw 0:e4a10ed6eb92 192
jbradshaw 0:e4a10ed6eb92 193 if (ReadCompDataRaw(bmp280_rawData) != 0) {
jbradshaw 0:e4a10ed6eb92 194 return -1;
jbradshaw 0:e4a10ed6eb92 195 }
jbradshaw 0:e4a10ed6eb92 196 ToFloat(bmp280_rawData, Temp_degC, Press_Pa);
jbradshaw 0:e4a10ed6eb92 197 return 0;
jbradshaw 0:e4a10ed6eb92 198 }
jbradshaw 0:e4a10ed6eb92 199
jbradshaw 0:e4a10ed6eb92 200 //******************************************************************************
jbradshaw 1:9490836294ea 201 int BMP280::reg_write(BMP280_REG_map_t reg, char value) {
jbradshaw 1:9490836294ea 202
jbradshaw 0:e4a10ed6eb92 203 int result;
jbradshaw 0:e4a10ed6eb92 204 char cmdData[2] = {(char)reg, value};
jbradshaw 0:e4a10ed6eb92 205 result = i2c->write(slaveAddress, cmdData, 2);
jbradshaw 1:9490836294ea 206 if (result != 0) {
jbradshaw 0:e4a10ed6eb92 207 return -1;
jbradshaw 1:9490836294ea 208 }
jbradshaw 0:e4a10ed6eb92 209 return 0;
jbradshaw 0:e4a10ed6eb92 210 }
jbradshaw 0:e4a10ed6eb92 211
jbradshaw 0:e4a10ed6eb92 212 //******************************************************************************
jbradshaw 1:9490836294ea 213 int BMP280::reg_read(BMP280_REG_map_t reg, char *value, char number) {
jbradshaw 1:9490836294ea 214
jbradshaw 0:e4a10ed6eb92 215 int result;
jbradshaw 0:e4a10ed6eb92 216 char cmdData[1] = {(char)reg};
jbradshaw 0:e4a10ed6eb92 217
jbradshaw 0:e4a10ed6eb92 218 result = i2c->write(slaveAddress, cmdData, 1);
jbradshaw 1:9490836294ea 219 if (result != 0) {
jbradshaw 0:e4a10ed6eb92 220 return -1;
jbradshaw 1:9490836294ea 221 }
jbradshaw 0:e4a10ed6eb92 222 result = i2c->read(slaveAddress, value, number);
jbradshaw 1:9490836294ea 223 if (result != 0) {
jbradshaw 0:e4a10ed6eb92 224 return -1;
jbradshaw 1:9490836294ea 225 }
jbradshaw 0:e4a10ed6eb92 226 return 0;
jbradshaw 0:e4a10ed6eb92 227 }
jbradshaw 0:e4a10ed6eb92 228
jbradshaw 0:e4a10ed6eb92 229 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 230 int BMP280::Sleep(void) {
jbradshaw 1:9490836294ea 231
jbradshaw 1:9490836294ea 232 bmp280_ctrl_meas_t ctrl_meas;
jbradshaw 0:e4a10ed6eb92 233
jbradshaw 1:9490836294ea 234 if (reg_read(BMP280_CTRL_MEAS, &ctrl_meas.all, 1) != 0) {
jbradshaw 0:e4a10ed6eb92 235 return -1;
jbradshaw 0:e4a10ed6eb92 236 }
jbradshaw 1:9490836294ea 237 ctrl_meas.bit.mode = 0b00; // put everything to sleep mode...
jbradshaw 0:e4a10ed6eb92 238
jbradshaw 1:9490836294ea 239 if (reg_write(BMP280_CTRL_MEAS, ctrl_meas.all) != 0) {
jbradshaw 0:e4a10ed6eb92 240 return -1;
jbradshaw 0:e4a10ed6eb92 241 }
jbradshaw 0:e4a10ed6eb92 242 return 0;
jbradshaw 0:e4a10ed6eb92 243 }
jbradshaw 0:e4a10ed6eb92 244
jbradshaw 0:e4a10ed6eb92 245 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 246 void BMP280::Reset(void) {
jbradshaw 1:9490836294ea 247
jbradshaw 0:e4a10ed6eb92 248 reg_write(BMP280_RESET, 0xB6); // Initiate a Soft Reset
jbradshaw 0:e4a10ed6eb92 249 }
jbradshaw 0:e4a10ed6eb92 250
jbradshaw 0:e4a10ed6eb92 251 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 252 int BMP280::Detect(void) {
jbradshaw 1:9490836294ea 253
jbradshaw 0:e4a10ed6eb92 254 if (reg_read(BMP280_ID, &bmp280_id, 1) != 0) {
jbradshaw 0:e4a10ed6eb92 255 return -1;
jbradshaw 0:e4a10ed6eb92 256 }
jbradshaw 0:e4a10ed6eb92 257
jbradshaw 0:e4a10ed6eb92 258 if (bmp280_id == 0x58) {
jbradshaw 0:e4a10ed6eb92 259 return 1;
jbradshaw 0:e4a10ed6eb92 260 }
jbradshaw 0:e4a10ed6eb92 261 return 0;
jbradshaw 0:e4a10ed6eb92 262 }
jbradshaw 0:e4a10ed6eb92 263
jbradshaw 0:e4a10ed6eb92 264 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 265 int BMP280::ReadId(void) {
jbradshaw 1:9490836294ea 266
jbradshaw 0:e4a10ed6eb92 267 if (reg_read(BMP280_ID, &bmp280_id, 1) != 0) {
jbradshaw 0:e4a10ed6eb92 268 return -1;
jbradshaw 0:e4a10ed6eb92 269 }
jbradshaw 0:e4a10ed6eb92 270 return bmp280_id;
jbradshaw 0:e4a10ed6eb92 271 }
jbradshaw 0:e4a10ed6eb92 272
jbradshaw 0:e4a10ed6eb92 273 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 274 float BMP280::compensate_T_float(int32_t adc_T) {
jbradshaw 1:9490836294ea 275
jbradshaw 0:e4a10ed6eb92 276 float var1, var2, T;
jbradshaw 0:e4a10ed6eb92 277 var1 =
jbradshaw 1:9490836294ea 278 (((float)adc_T) / 16384.0f - ((float)dig_T1) / 1024.0f) * ((float)dig_T2);
jbradshaw 0:e4a10ed6eb92 279
jbradshaw 1:9490836294ea 280 var2 = ((((float)adc_T) / 131072.0f - ((float)dig_T1) / 8192.0f) *
jbradshaw 1:9490836294ea 281 (((float)adc_T) / 131072.0f - ((float)dig_T1) / 8192.0f)) *
jbradshaw 0:e4a10ed6eb92 282 ((float)dig_T3);
jbradshaw 0:e4a10ed6eb92 283
jbradshaw 0:e4a10ed6eb92 284 t_fine = (int32_t)(var1 + var2);
jbradshaw 0:e4a10ed6eb92 285
jbradshaw 1:9490836294ea 286 T = (var1 + var2) / 5120.0f;
jbradshaw 0:e4a10ed6eb92 287
jbradshaw 0:e4a10ed6eb92 288 return T;
jbradshaw 0:e4a10ed6eb92 289 }
jbradshaw 0:e4a10ed6eb92 290
jbradshaw 0:e4a10ed6eb92 291 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 292 float BMP280::compensate_P_float(int32_t adc_P) {
jbradshaw 1:9490836294ea 293
jbradshaw 0:e4a10ed6eb92 294 float var1, var2, p;
jbradshaw 1:9490836294ea 295 var1 = ((float)t_fine / 2.0f) - 64000.0f;
jbradshaw 1:9490836294ea 296 var2 = var1 * var1 * ((float)dig_P6) / 32768.0f;
jbradshaw 1:9490836294ea 297 var2 = var2 + var1 * ((float)dig_P5) * 2.0f;
jbradshaw 1:9490836294ea 298 var2 = (var2 / 4.0f) + (((float)dig_P4) * 65536.0f);
jbradshaw 1:9490836294ea 299 var1 = (((float)dig_P3) * var1 * var1 / 524288.0f + ((float)dig_P2) * var1) / 524288.0f;
jbradshaw 1:9490836294ea 300 var1 = (1.0f + var1 / 32768.0f) * ((float)dig_P1);
jbradshaw 1:9490836294ea 301 if (var1 == 0.0f) {
jbradshaw 0:e4a10ed6eb92 302 return 0; // avoid exception caused by division by zero
jbradshaw 0:e4a10ed6eb92 303 }
jbradshaw 1:9490836294ea 304 p = 1048576.0f - (float)adc_P;
jbradshaw 1:9490836294ea 305 p = (p - (var2 / 4096.0f)) * 6250.0f / var1;
jbradshaw 1:9490836294ea 306 var1 = ((float)dig_P9) * p * p / 2147483648.0f;
jbradshaw 1:9490836294ea 307 var2 = p * ((float)dig_P8) / 32768.0f;
jbradshaw 1:9490836294ea 308 p = p + (var1 + var2 + ((float)dig_P7)) / 16.0f;
jbradshaw 0:e4a10ed6eb92 309 return p;
jbradshaw 0:e4a10ed6eb92 310 }