STMicroelectronics barometric pressure sensor library. This library modified from KenjiArai's LPS25H library.

Fork of LPS25H by Kenji Arai

Committer:
feunoir
Date:
Wed Nov 30 17:45:08 2016 +0000
Revision:
1:5f21b0eac2c2
Child:
3:755ac86eb6fd
LPS22HB Library; ; Arranged from LPS25H Library(http://developer.mbed.org/users/kenjiArai/code/LPS25H/);

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feunoir 1:5f21b0eac2c2 1 /*
feunoir 1:5f21b0eac2c2 2 * mbed library program
feunoir 1:5f21b0eac2c2 3 * LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
feunoir 1:5f21b0eac2c2 4 * made by STMicroelectronics
feunoir 1:5f21b0eac2c2 5 * http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230?s_searchtype=partnumber
feunoir 1:5f21b0eac2c2 6 *
feunoir 1:5f21b0eac2c2 7 * Copyright (c) 2015 Kenji Arai / JH1PJL
feunoir 1:5f21b0eac2c2 8 * http://www.page.sannet.ne.jp/kenjia/index.html
feunoir 1:5f21b0eac2c2 9 * http://mbed.org/users/kenjiArai/
feunoir 1:5f21b0eac2c2 10 * Created: Feburary 21st, 2015
feunoir 1:5f21b0eac2c2 11 * Revised: Feburary 22nd, 2015
feunoir 1:5f21b0eac2c2 12 *
feunoir 1:5f21b0eac2c2 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
feunoir 1:5f21b0eac2c2 14 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
feunoir 1:5f21b0eac2c2 15 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
feunoir 1:5f21b0eac2c2 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
feunoir 1:5f21b0eac2c2 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
feunoir 1:5f21b0eac2c2 18 */
feunoir 1:5f21b0eac2c2 19
feunoir 1:5f21b0eac2c2 20 #include "LPS22HB.h"
feunoir 1:5f21b0eac2c2 21
feunoir 1:5f21b0eac2c2 22 LPS22HB::LPS22HB (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
feunoir 1:5f21b0eac2c2 23 {
feunoir 1:5f21b0eac2c2 24 LPS22HB_addr = addr;
feunoir 1:5f21b0eac2c2 25 //LPS22HB_mode = FIFO_BYPASS;
feunoir 1:5f21b0eac2c2 26 init();
feunoir 1:5f21b0eac2c2 27 }
feunoir 1:5f21b0eac2c2 28
feunoir 1:5f21b0eac2c2 29 /*LPS22HB::LPS22HB (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) : _i2c(p_sda, p_scl)
feunoir 1:5f21b0eac2c2 30 {
feunoir 1:5f21b0eac2c2 31 LPS22HB_addr = addr;
feunoir 1:5f21b0eac2c2 32 LPS22HB_mode = mode;
feunoir 1:5f21b0eac2c2 33 init();
feunoir 1:5f21b0eac2c2 34 }*/
feunoir 1:5f21b0eac2c2 35
feunoir 1:5f21b0eac2c2 36 LPS22HB::LPS22HB (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
feunoir 1:5f21b0eac2c2 37 {
feunoir 1:5f21b0eac2c2 38 LPS22HB_addr = addr;
feunoir 1:5f21b0eac2c2 39 //LPS22HB_mode = FIFO_BYPASS;
feunoir 1:5f21b0eac2c2 40 init();
feunoir 1:5f21b0eac2c2 41 }
feunoir 1:5f21b0eac2c2 42
feunoir 1:5f21b0eac2c2 43 /*LPS22HB::LPS22HB (I2C& p_i2c, uint8_t addr, uint8_t mode) : _i2c(p_i2c)
feunoir 1:5f21b0eac2c2 44 {
feunoir 1:5f21b0eac2c2 45 LPS22HB_addr = addr;
feunoir 1:5f21b0eac2c2 46 LPS22HB_mode = mode;
feunoir 1:5f21b0eac2c2 47 init();
feunoir 1:5f21b0eac2c2 48 }*/
feunoir 1:5f21b0eac2c2 49
feunoir 1:5f21b0eac2c2 50 /////////////// Initialize ////////////////////////////////
feunoir 1:5f21b0eac2c2 51 void LPS22HB::init(void)
feunoir 1:5f21b0eac2c2 52 {
feunoir 1:5f21b0eac2c2 53 _i2c.frequency(400000);
feunoir 1:5f21b0eac2c2 54 // Check acc is available of not
feunoir 1:5f21b0eac2c2 55 dt[0] = LPS22HB_WHO_AM_I;
feunoir 1:5f21b0eac2c2 56 _i2c.write(LPS22HB_addr, dt, 1, true);
feunoir 1:5f21b0eac2c2 57 _i2c.read(LPS22HB_addr, dt, 1, false);
feunoir 1:5f21b0eac2c2 58 if (dt[0] == I_AM_LPS22HB) {
feunoir 1:5f21b0eac2c2 59 LPS22HB_id = I_AM_LPS22HB;
feunoir 1:5f21b0eac2c2 60 LPS22HB_ready = 1;
feunoir 1:5f21b0eac2c2 61 } else {
feunoir 1:5f21b0eac2c2 62 LPS22HB_id = 0;
feunoir 1:5f21b0eac2c2 63 LPS22HB_ready = 0;
feunoir 1:5f21b0eac2c2 64 return; // acc chip is NOT on I2C line then terminate
feunoir 1:5f21b0eac2c2 65 }
feunoir 1:5f21b0eac2c2 66 /*if (LPS22HB_mode == FIFO_HW_FILTER){
feunoir 1:5f21b0eac2c2 67 // Hardware digital filter
feunoir 1:5f21b0eac2c2 68 // AN4450 April 2014 Rev1 P20/26, Filter enabling and suggested configuration
feunoir 1:5f21b0eac2c2 69 dt[0] = LPS22HB_RES_CONF;
feunoir 1:5f21b0eac2c2 70 dt[1] = 0x05;
feunoir 1:5f21b0eac2c2 71 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 72 dt[0] = LPS22HB_FIFO_CTRL;
feunoir 1:5f21b0eac2c2 73 dt[1] = 0xdf;
feunoir 1:5f21b0eac2c2 74 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 75 dt[0] = LPS22HB_CTRL_REG2;
feunoir 1:5f21b0eac2c2 76 dt[1] = 0x40;
feunoir 1:5f21b0eac2c2 77 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 78 dt[0] = LPS22HB_CTRL_REG1;
feunoir 1:5f21b0eac2c2 79 dt[1] = 0x90;
feunoir 1:5f21b0eac2c2 80 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 81 } else {
feunoir 1:5f21b0eac2c2 82 dt[0] = LPS22HB_CTRL_REG2;
feunoir 1:5f21b0eac2c2 83 dt[1] = 0x0;
feunoir 1:5f21b0eac2c2 84 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 85 dt[0] = LPS22HB_CTRL_REG1;
feunoir 1:5f21b0eac2c2 86 dt[1] = CR_STD_SET;
feunoir 1:5f21b0eac2c2 87 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 88 }*/
feunoir 1:5f21b0eac2c2 89
feunoir 1:5f21b0eac2c2 90 set_odr(LPS22HB_ODR_75HZ);
feunoir 1:5f21b0eac2c2 91
feunoir 1:5f21b0eac2c2 92 }
feunoir 1:5f21b0eac2c2 93
feunoir 1:5f21b0eac2c2 94 /////////////// Start conv. and gwt all data //////////////
feunoir 1:5f21b0eac2c2 95 void LPS22HB::get(void)
feunoir 1:5f21b0eac2c2 96 {
feunoir 1:5f21b0eac2c2 97 if (LPS22HB_ready == 0) {
feunoir 1:5f21b0eac2c2 98 press = 0;
feunoir 1:5f21b0eac2c2 99 temp = 0;
feunoir 1:5f21b0eac2c2 100 return;
feunoir 1:5f21b0eac2c2 101 }
feunoir 1:5f21b0eac2c2 102 dt[0] = LPS22HB_PRESS_POUT_XL | 0x80;
feunoir 1:5f21b0eac2c2 103 _i2c.write(LPS22HB_addr, dt, 1, true);
feunoir 1:5f21b0eac2c2 104 _i2c.read(LPS22HB_addr, dt, 3, false);
feunoir 1:5f21b0eac2c2 105 press = dt[2] << 16 | dt[1] << 8 | dt[0];
feunoir 1:5f21b0eac2c2 106 dt[0] = LPS22HB_TEMP_OUT_L | 0x80;
feunoir 1:5f21b0eac2c2 107 _i2c.write(LPS22HB_addr, dt, 1, true);
feunoir 1:5f21b0eac2c2 108 _i2c.read(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 109 temp = dt[1] << 8 | dt[0];
feunoir 1:5f21b0eac2c2 110 }
feunoir 1:5f21b0eac2c2 111
feunoir 1:5f21b0eac2c2 112 /////////////// Read data from sensor /////////////////////
feunoir 1:5f21b0eac2c2 113 float LPS22HB::pressure()
feunoir 1:5f21b0eac2c2 114 {
feunoir 1:5f21b0eac2c2 115 return (float)press / 4096;
feunoir 1:5f21b0eac2c2 116 }
feunoir 1:5f21b0eac2c2 117
feunoir 1:5f21b0eac2c2 118 /////////////// Read data from sensor /////////////////////
feunoir 1:5f21b0eac2c2 119 float LPS22HB::temperature()
feunoir 1:5f21b0eac2c2 120 {
feunoir 1:5f21b0eac2c2 121 return (float)temp / 480 + 42.5;
feunoir 1:5f21b0eac2c2 122 }
feunoir 1:5f21b0eac2c2 123
feunoir 1:5f21b0eac2c2 124 /////////////// ID ////////////////////////////////////////
feunoir 1:5f21b0eac2c2 125 uint8_t LPS22HB::read_id()
feunoir 1:5f21b0eac2c2 126 {
feunoir 1:5f21b0eac2c2 127 dt[0] = LPS22HB_WHO_AM_I;
feunoir 1:5f21b0eac2c2 128 _i2c.write(LPS22HB_addr, dt, 1, true);
feunoir 1:5f21b0eac2c2 129 _i2c.read(LPS22HB_addr, dt, 1, false);
feunoir 1:5f21b0eac2c2 130 return (uint8_t)dt[0];
feunoir 1:5f21b0eac2c2 131 }
feunoir 1:5f21b0eac2c2 132
feunoir 1:5f21b0eac2c2 133 /////////////// I2C Freq. /////////////////////////////////
feunoir 1:5f21b0eac2c2 134 void LPS22HB::frequency(int hz)
feunoir 1:5f21b0eac2c2 135 {
feunoir 1:5f21b0eac2c2 136 _i2c.frequency(hz);
feunoir 1:5f21b0eac2c2 137 }
feunoir 1:5f21b0eac2c2 138
feunoir 1:5f21b0eac2c2 139 /////////////// General purpose R/W ///////////////////////
feunoir 1:5f21b0eac2c2 140 uint8_t LPS22HB::read_reg(uint8_t addr)
feunoir 1:5f21b0eac2c2 141 {
feunoir 1:5f21b0eac2c2 142 if (LPS22HB_ready == 1) {
feunoir 1:5f21b0eac2c2 143 dt[0] = addr;
feunoir 1:5f21b0eac2c2 144 _i2c.write(LPS22HB_addr, dt, 1, true);
feunoir 1:5f21b0eac2c2 145 _i2c.read(LPS22HB_addr, dt, 1, false);
feunoir 1:5f21b0eac2c2 146 } else {
feunoir 1:5f21b0eac2c2 147 dt[0] = 0xff;
feunoir 1:5f21b0eac2c2 148 }
feunoir 1:5f21b0eac2c2 149 return (uint8_t)dt[0];
feunoir 1:5f21b0eac2c2 150 }
feunoir 1:5f21b0eac2c2 151
feunoir 1:5f21b0eac2c2 152 void LPS22HB::write_reg(uint8_t addr, uint8_t data)
feunoir 1:5f21b0eac2c2 153 {
feunoir 1:5f21b0eac2c2 154 if (LPS22HB_ready == 1) {
feunoir 1:5f21b0eac2c2 155 dt[0] = addr;
feunoir 1:5f21b0eac2c2 156 dt[1] = data;
feunoir 1:5f21b0eac2c2 157 _i2c.write(LPS22HB_addr, dt, 2, false);
feunoir 1:5f21b0eac2c2 158 }
feunoir 1:5f21b0eac2c2 159 }
feunoir 1:5f21b0eac2c2 160
feunoir 1:5f21b0eac2c2 161 /////////////// ODR ///////////////////////////////////////
feunoir 1:5f21b0eac2c2 162 void LPS22HB::set_odr(lps22hb_odr odrcfg)
feunoir 1:5f21b0eac2c2 163 {
feunoir 1:5f21b0eac2c2 164 uint8_t temp = read_reg(LPS22HB_CTRL_REG1);
feunoir 1:5f21b0eac2c2 165 temp &= 0xff ^ 0x70;
feunoir 1:5f21b0eac2c2 166 temp |= odrcfg;
feunoir 1:5f21b0eac2c2 167 write_reg(LPS22HB_CTRL_REG1, temp);
feunoir 1:5f21b0eac2c2 168 }
feunoir 1:5f21b0eac2c2 169
feunoir 1:5f21b0eac2c2 170 /////////////// LPF ///////////////////////////////////////
feunoir 1:5f21b0eac2c2 171 void LPS22HB::set_lpf(lps22hb_lpf lpfcfg)
feunoir 1:5f21b0eac2c2 172 {
feunoir 1:5f21b0eac2c2 173 uint8_t temp = read_reg(LPS22HB_CTRL_REG1);
feunoir 1:5f21b0eac2c2 174 temp &= 0xff ^ 0x0c;
feunoir 1:5f21b0eac2c2 175 temp |= lpfcfg;
feunoir 1:5f21b0eac2c2 176 write_reg(LPS22HB_CTRL_REG1, temp);
feunoir 1:5f21b0eac2c2 177 }
feunoir 1:5f21b0eac2c2 178
feunoir 1:5f21b0eac2c2 179 /////////////// DRDY //////////////////////////////////////
feunoir 1:5f21b0eac2c2 180 void LPS22HB::drdy(lps22hb_drdy drdycfg)
feunoir 1:5f21b0eac2c2 181 {
feunoir 1:5f21b0eac2c2 182 uint8_t temp = read_reg(LPS22HB_CTRL_REG3);
feunoir 1:5f21b0eac2c2 183 temp &= 0xff ^ 0x04;
feunoir 1:5f21b0eac2c2 184 temp |= drdycfg;
feunoir 1:5f21b0eac2c2 185 write_reg(LPS22HB_CTRL_REG3, temp);
feunoir 1:5f21b0eac2c2 186 }