BMP280 pressure sensor library with SPI interface
Dependents: BMP280_SPI_Hello Cansat_of_kada_ver2 bmp280
BMP280_SPI.cpp@0:0463be4e35c0, 2018-02-08 (annotated)
- Committer:
- MACRUM
- Date:
- Thu Feb 08 09:56:31 2018 +0000
- Revision:
- 0:0463be4e35c0
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MACRUM | 0:0463be4e35c0 | 1 | /** |
MACRUM | 0:0463be4e35c0 | 2 | ****************************************************************************** |
MACRUM | 0:0463be4e35c0 | 3 | * @file BMP280_SPI.cpp |
MACRUM | 0:0463be4e35c0 | 4 | * @author Toyomasa Watarai |
MACRUM | 0:0463be4e35c0 | 5 | * @version V1.0.0 |
MACRUM | 0:0463be4e35c0 | 6 | * @date 8 Feb 2018 |
MACRUM | 0:0463be4e35c0 | 7 | * @brief BMP280_SPI class implementation |
MACRUM | 0:0463be4e35c0 | 8 | ****************************************************************************** |
MACRUM | 0:0463be4e35c0 | 9 | * @attention |
MACRUM | 0:0463be4e35c0 | 10 | * |
MACRUM | 0:0463be4e35c0 | 11 | * Licensed under the Apache License, Version 2.0 (the "License"); |
MACRUM | 0:0463be4e35c0 | 12 | * you may not use this file except in compliance with the License. |
MACRUM | 0:0463be4e35c0 | 13 | * You may obtain a copy of the License at |
MACRUM | 0:0463be4e35c0 | 14 | * |
MACRUM | 0:0463be4e35c0 | 15 | * http://www.apache.org/licenses/LICENSE-2.0 |
MACRUM | 0:0463be4e35c0 | 16 | * |
MACRUM | 0:0463be4e35c0 | 17 | * Unless required by applicable law or agreed to in writing, software |
MACRUM | 0:0463be4e35c0 | 18 | * distributed under the License is distributed on an "AS IS" BASIS, |
MACRUM | 0:0463be4e35c0 | 19 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
MACRUM | 0:0463be4e35c0 | 20 | * See the License for the specific language governing permissions and |
MACRUM | 0:0463be4e35c0 | 21 | * limitations under the License. |
MACRUM | 0:0463be4e35c0 | 22 | */ |
MACRUM | 0:0463be4e35c0 | 23 | |
MACRUM | 0:0463be4e35c0 | 24 | #include "mbed.h" |
MACRUM | 0:0463be4e35c0 | 25 | #include "BMP280_SPI.h" |
MACRUM | 0:0463be4e35c0 | 26 | |
MACRUM | 0:0463be4e35c0 | 27 | BMP280_SPI::BMP280_SPI(PinName mosi, PinName miso, PinName sclk, PinName cs) |
MACRUM | 0:0463be4e35c0 | 28 | : |
MACRUM | 0:0463be4e35c0 | 29 | _spi(mosi, miso, sclk), |
MACRUM | 0:0463be4e35c0 | 30 | _cs(cs), |
MACRUM | 0:0463be4e35c0 | 31 | t_fine(0) |
MACRUM | 0:0463be4e35c0 | 32 | { |
MACRUM | 0:0463be4e35c0 | 33 | initialize(); |
MACRUM | 0:0463be4e35c0 | 34 | } |
MACRUM | 0:0463be4e35c0 | 35 | |
MACRUM | 0:0463be4e35c0 | 36 | |
MACRUM | 0:0463be4e35c0 | 37 | BMP280_SPI::~BMP280_SPI() |
MACRUM | 0:0463be4e35c0 | 38 | { |
MACRUM | 0:0463be4e35c0 | 39 | } |
MACRUM | 0:0463be4e35c0 | 40 | |
MACRUM | 0:0463be4e35c0 | 41 | void BMP280_SPI::initialize() |
MACRUM | 0:0463be4e35c0 | 42 | { |
MACRUM | 0:0463be4e35c0 | 43 | char cmd[18]; |
MACRUM | 0:0463be4e35c0 | 44 | |
MACRUM | 0:0463be4e35c0 | 45 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 46 | _spi.format(8, 0); // 8-bit, mode=0 |
MACRUM | 0:0463be4e35c0 | 47 | _spi.frequency(1000000); // 1MHZ |
MACRUM | 0:0463be4e35c0 | 48 | |
MACRUM | 0:0463be4e35c0 | 49 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 50 | _spi.write(0xd0); // read chip_id |
MACRUM | 0:0463be4e35c0 | 51 | cmd[0] = _spi.write(0); // read chip_id |
MACRUM | 0:0463be4e35c0 | 52 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 53 | |
MACRUM | 0:0463be4e35c0 | 54 | DEBUG_PRINT("chip_id = 0x%x\n", cmd[0]); |
MACRUM | 0:0463be4e35c0 | 55 | |
MACRUM | 0:0463be4e35c0 | 56 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 57 | _spi.write(0xf4 & BMP280_SPI_WRITE); // ctrl_meas |
MACRUM | 0:0463be4e35c0 | 58 | _spi.write((3<<5) | (3<<2) | 3); // Temparature oversampling x4, Pressure oversampling x4, Normal mode |
MACRUM | 0:0463be4e35c0 | 59 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 60 | |
MACRUM | 0:0463be4e35c0 | 61 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 62 | _spi.write(0xf5 & BMP280_SPI_WRITE); // config |
MACRUM | 0:0463be4e35c0 | 63 | _spi.write((5<<5) | (0<<2) | 0); // Standby 1000ms, Filter off, 4-wire SPI interface |
MACRUM | 0:0463be4e35c0 | 64 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 65 | |
MACRUM | 0:0463be4e35c0 | 66 | wait(1); |
MACRUM | 0:0463be4e35c0 | 67 | |
MACRUM | 0:0463be4e35c0 | 68 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 69 | _spi.write(0x88); // read dig_T regs |
MACRUM | 0:0463be4e35c0 | 70 | for(int i = 0; i < 6; i++) |
MACRUM | 0:0463be4e35c0 | 71 | cmd[i] = _spi.write(0); |
MACRUM | 0:0463be4e35c0 | 72 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 73 | |
MACRUM | 0:0463be4e35c0 | 74 | dig_T1 = (cmd[1] << 8) | cmd[0]; |
MACRUM | 0:0463be4e35c0 | 75 | dig_T2 = (cmd[3] << 8) | cmd[2]; |
MACRUM | 0:0463be4e35c0 | 76 | dig_T3 = (cmd[5] << 8) | cmd[4]; |
MACRUM | 0:0463be4e35c0 | 77 | |
MACRUM | 0:0463be4e35c0 | 78 | DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3); |
MACRUM | 0:0463be4e35c0 | 79 | DEBUG_PRINT("dig_T = %d, %d, %d\n", dig_T1, dig_T2, dig_T3); |
MACRUM | 0:0463be4e35c0 | 80 | |
MACRUM | 0:0463be4e35c0 | 81 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 82 | _spi.write(0x8e); // read dig_P regs |
MACRUM | 0:0463be4e35c0 | 83 | for(int i = 0; i < 18; i++) |
MACRUM | 0:0463be4e35c0 | 84 | cmd[i] = _spi.write(0); |
MACRUM | 0:0463be4e35c0 | 85 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 86 | |
MACRUM | 0:0463be4e35c0 | 87 | dig_P1 = (cmd[ 1] << 8) | cmd[ 0]; |
MACRUM | 0:0463be4e35c0 | 88 | dig_P2 = (cmd[ 3] << 8) | cmd[ 2]; |
MACRUM | 0:0463be4e35c0 | 89 | dig_P3 = (cmd[ 5] << 8) | cmd[ 4]; |
MACRUM | 0:0463be4e35c0 | 90 | dig_P4 = (cmd[ 7] << 8) | cmd[ 6]; |
MACRUM | 0:0463be4e35c0 | 91 | dig_P5 = (cmd[ 9] << 8) | cmd[ 8]; |
MACRUM | 0:0463be4e35c0 | 92 | dig_P6 = (cmd[11] << 8) | cmd[10]; |
MACRUM | 0:0463be4e35c0 | 93 | dig_P7 = (cmd[13] << 8) | cmd[12]; |
MACRUM | 0:0463be4e35c0 | 94 | dig_P8 = (cmd[15] << 8) | cmd[14]; |
MACRUM | 0:0463be4e35c0 | 95 | dig_P9 = (cmd[17] << 8) | cmd[16]; |
MACRUM | 0:0463be4e35c0 | 96 | |
MACRUM | 0:0463be4e35c0 | 97 | DEBUG_PRINT("dig_P = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9); |
MACRUM | 0:0463be4e35c0 | 98 | DEBUG_PRINT("dig_P = %d, %d, %d, %d, %d, %d, %d, %d, %d\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9); |
MACRUM | 0:0463be4e35c0 | 99 | |
MACRUM | 0:0463be4e35c0 | 100 | } |
MACRUM | 0:0463be4e35c0 | 101 | |
MACRUM | 0:0463be4e35c0 | 102 | float BMP280_SPI::getTemperature() |
MACRUM | 0:0463be4e35c0 | 103 | { |
MACRUM | 0:0463be4e35c0 | 104 | int32_t temp_raw, var1, var2, temp; |
MACRUM | 0:0463be4e35c0 | 105 | float tempf; |
MACRUM | 0:0463be4e35c0 | 106 | char cmd[3]; |
MACRUM | 0:0463be4e35c0 | 107 | |
MACRUM | 0:0463be4e35c0 | 108 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 109 | _spi.write(0xfa); |
MACRUM | 0:0463be4e35c0 | 110 | for(int i = 0; i < 3; i++) |
MACRUM | 0:0463be4e35c0 | 111 | cmd[i] = _spi.write(0); |
MACRUM | 0:0463be4e35c0 | 112 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 113 | |
MACRUM | 0:0463be4e35c0 | 114 | temp_raw = (cmd[0] << 12) | (cmd[1] << 4) | (cmd[2] >> 4); |
MACRUM | 0:0463be4e35c0 | 115 | |
MACRUM | 0:0463be4e35c0 | 116 | var1 = ((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11; |
MACRUM | 0:0463be4e35c0 | 117 | var2 = (((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14; |
MACRUM | 0:0463be4e35c0 | 118 | |
MACRUM | 0:0463be4e35c0 | 119 | t_fine = var1 + var2; |
MACRUM | 0:0463be4e35c0 | 120 | temp = (t_fine * 5 + 128) >> 8; |
MACRUM | 0:0463be4e35c0 | 121 | tempf = (float)temp; |
MACRUM | 0:0463be4e35c0 | 122 | |
MACRUM | 0:0463be4e35c0 | 123 | return (tempf/100.0f); |
MACRUM | 0:0463be4e35c0 | 124 | } |
MACRUM | 0:0463be4e35c0 | 125 | |
MACRUM | 0:0463be4e35c0 | 126 | float BMP280_SPI::getPressure() |
MACRUM | 0:0463be4e35c0 | 127 | { |
MACRUM | 0:0463be4e35c0 | 128 | int32_t press_raw; |
MACRUM | 0:0463be4e35c0 | 129 | float pressf; |
MACRUM | 0:0463be4e35c0 | 130 | char cmd[3]; |
MACRUM | 0:0463be4e35c0 | 131 | |
MACRUM | 0:0463be4e35c0 | 132 | _cs = 0; |
MACRUM | 0:0463be4e35c0 | 133 | _spi.write(0xf7); // press_msb |
MACRUM | 0:0463be4e35c0 | 134 | for(int i = 0; i < 3; i++) |
MACRUM | 0:0463be4e35c0 | 135 | cmd[i] = _spi.write(0); |
MACRUM | 0:0463be4e35c0 | 136 | _cs = 1; |
MACRUM | 0:0463be4e35c0 | 137 | |
MACRUM | 0:0463be4e35c0 | 138 | press_raw = (cmd[0] << 12) | (cmd[1] << 4) | (cmd[2] >> 4); |
MACRUM | 0:0463be4e35c0 | 139 | |
MACRUM | 0:0463be4e35c0 | 140 | int64_t var1, var2, p; |
MACRUM | 0:0463be4e35c0 | 141 | uint32_t press; |
MACRUM | 0:0463be4e35c0 | 142 | |
MACRUM | 0:0463be4e35c0 | 143 | var1 = (int64_t)t_fine - 128000; |
MACRUM | 0:0463be4e35c0 | 144 | var2 = var1 * var1 * (int64_t)dig_P6; |
MACRUM | 0:0463be4e35c0 | 145 | var2 = var2 + ((var1 * (int64_t)dig_P5) << 17); |
MACRUM | 0:0463be4e35c0 | 146 | var2 = var2 + ((int64_t)dig_P4 << 35); |
MACRUM | 0:0463be4e35c0 | 147 | var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12); |
MACRUM | 0:0463be4e35c0 | 148 | var1 = (((((int64_t)1)<<47)+var1))*((int64_t)dig_P1)>>33; |
MACRUM | 0:0463be4e35c0 | 149 | |
MACRUM | 0:0463be4e35c0 | 150 | if (var1 == 0) { |
MACRUM | 0:0463be4e35c0 | 151 | return 0; |
MACRUM | 0:0463be4e35c0 | 152 | } |
MACRUM | 0:0463be4e35c0 | 153 | p = 1048576 - press_raw; |
MACRUM | 0:0463be4e35c0 | 154 | p = (((p<<31)-var2)*3125)/var1; |
MACRUM | 0:0463be4e35c0 | 155 | var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13)) >> 25; |
MACRUM | 0:0463be4e35c0 | 156 | var2 = (((int64_t)dig_P8) * p) >> 19; |
MACRUM | 0:0463be4e35c0 | 157 | p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4); |
MACRUM | 0:0463be4e35c0 | 158 | press = (uint32_t)p/256; |
MACRUM | 0:0463be4e35c0 | 159 | |
MACRUM | 0:0463be4e35c0 | 160 | pressf = (float)press; |
MACRUM | 0:0463be4e35c0 | 161 | return (pressf/100.0f); |
MACRUM | 0:0463be4e35c0 | 162 | } |
MACRUM | 0:0463be4e35c0 | 163 |