BMP280 pressure sensor library with SPI interface

Dependents:   BMP280_SPI_Hello Cansat_of_kada_ver2 bmp280

Committer:
MACRUM
Date:
Thu Feb 08 09:56:31 2018 +0000
Revision:
0:0463be4e35c0
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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