![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Firmware enhancements for HSP_RPC_GUI 3.0.1
Fork of HSP_RPC_GUI by
This command can be used to import the project to your local environment
Quote:
mbed import http://mbed.org/users/jbradshaw/code/HSP_RPC_GUI_3_0_1/
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
HSP/Devices/BMP280/BMP280/BMP280.cpp@3:8e9b9f5818aa, 2017-04-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |