MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.

Dependents:   WeatherSensor-Joe PAG-CourseWork-NicksEdits SOFT253_Assignment SOFT253_Assignment_V2 ... more

Fork of LPS25H by Kenji Arai

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LPS25H.cpp Source File

LPS25H.cpp

00001 /*
00002  * mbed library program
00003  *  LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
00004  *   made by STMicroelectronics
00005  *   http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230?s_searchtype=partnumber
00006  *
00007  * Copyright (c) 2015 Kenji Arai / JH1PJL
00008  *  http://www.page.sannet.ne.jp/kenjia/index.html
00009  *  http://mbed.org/users/kenjiArai/
00010  *      Created: Feburary  21st, 2015
00011  *      Revised: Feburary  22nd, 2015
00012  *
00013  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
00014  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
00015  * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
00016  * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00017  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00018  */
00019 
00020 #include "LPS25H.h"
00021 
00022 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
00023 {
00024     LPS25H_addr = addr;
00025     LPS25H_mode = FIFO_HW_FILTER;
00026     init();
00027 }
00028 
00029 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) : _i2c(p_sda, p_scl)
00030 {
00031     LPS25H_addr = addr;
00032     LPS25H_mode = mode;
00033     init();
00034 }
00035 
00036 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
00037 {
00038     LPS25H_addr = addr;
00039     LPS25H_mode = FIFO_HW_FILTER;
00040     init();
00041 }
00042 
00043 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr, uint8_t mode) : _i2c(p_i2c)
00044 {
00045     LPS25H_addr = addr;
00046     LPS25H_mode = mode;
00047     init();
00048 }
00049 
00050 /////////////// Initialize ////////////////////////////////
00051 void LPS25H::init(void)
00052 {
00053     _i2c.frequency(100000);
00054     // Check acc is available of not
00055     dt[0] = LPS25H_WHO_AM_I;
00056     _i2c.write(LPS25H_addr, dt, 1, true);
00057     _i2c.read(LPS25H_addr, dt, 1, false);
00058     if (dt[0] == I_AM_LPS25H) {
00059         LPS25H_id = I_AM_LPS25H;
00060         LPS25H_ready = 1;
00061     } else {
00062         LPS25H_id = 0;
00063         LPS25H_ready = 0;
00064         return;     // acc chip is NOT on I2C line then terminate
00065     }
00066     if (LPS25H_mode == FIFO_HW_FILTER){
00067         // Hardware digital filter
00068         // AN4450 April 2014 Rev1 P20/26, Filter enabling and suggested configuration
00069         dt[0] = LPS25H_RES_CONF;
00070         dt[1] = 0x05;
00071         _i2c.write(LPS25H_addr, dt, 2, false);
00072         dt[0] = LPS25H_FIFO_CTRL;
00073         dt[1] = 0xdf;
00074         _i2c.write(LPS25H_addr, dt, 2, false);
00075         dt[0] = LPS25H_CTRL_REG2;
00076         dt[1] = 0x40;
00077         _i2c.write(LPS25H_addr, dt, 2, false);
00078         dt[0] = LPS25H_CTRL_REG1;
00079         dt[1] = 0x90;
00080         _i2c.write(LPS25H_addr, dt, 2, false);
00081     } else {
00082         dt[0] = LPS25H_CTRL_REG2;
00083         dt[1] = 0x0;
00084         _i2c.write(LPS25H_addr, dt, 2, false);       
00085         dt[0] = LPS25H_CTRL_REG1;
00086         dt[1] = CR_STD_SET;
00087         _i2c.write(LPS25H_addr, dt, 2, false);
00088     }
00089 }
00090 
00091 /////////////// Start conv. and gwt all data //////////////
00092 void LPS25H::get(void)
00093 {
00094     if (LPS25H_ready == 0) {
00095         press = 0;
00096         temp = 0;
00097         return;
00098     }
00099     dt[0] = LPS25H_PRESS_POUT_XL | 0x80;
00100     _i2c.write(LPS25H_addr, dt, 1, true);
00101     _i2c.read(LPS25H_addr, dt, 3, false);
00102     press = dt[2] << 16 | dt[1] << 8 | dt[0];
00103     dt[0] = LPS25H_TEMP_OUT_L | 0x80;
00104     _i2c.write(LPS25H_addr, dt, 1, true);
00105     _i2c.read(LPS25H_addr, dt, 2, false);
00106     temp = dt[1] << 8 | dt[0];
00107 }
00108 
00109 /////////////// Read data from sensor /////////////////////
00110 float LPS25H::pressure()
00111 {
00112     return (float)press / 4096;
00113 }
00114 
00115 /////////////// Read data from sensor /////////////////////
00116 float LPS25H::temperature()
00117 {
00118     return (float)temp / 480  + 42.5f; //added 'f' to stop warning regarding single precision implicit conversion to double MS 29/03/2017
00119 }
00120 
00121 /////////////// ID ////////////////////////////////////////
00122 uint8_t LPS25H::read_id()
00123 {
00124     dt[0] = LPS25H_WHO_AM_I;
00125     _i2c.write(LPS25H_addr, dt, 1, true);
00126     _i2c.read(LPS25H_addr, dt, 1, false);
00127     return (uint8_t)dt[0];
00128 }
00129 
00130 /////////////// I2C Freq. /////////////////////////////////
00131 void LPS25H::frequency(int hz)
00132 {
00133     _i2c.frequency(hz);
00134 }
00135 
00136 /////////////// General purpose R/W ///////////////////////
00137 uint8_t LPS25H::read_reg(uint8_t addr)
00138 {
00139     if (LPS25H_ready == 1) {
00140         dt[0] = addr;
00141         _i2c.write(LPS25H_addr, dt, 1, true);
00142         _i2c.read(LPS25H_addr, dt, 1, false);
00143     } else {
00144         dt[0] = 0xff;
00145     }
00146     return (uint8_t)dt[0];
00147 }
00148 
00149 void LPS25H::write_reg(uint8_t addr, uint8_t data)
00150 {
00151     if (LPS25H_ready == 1) {
00152         dt[0] = addr;
00153         dt[1] = data;
00154         _i2c.write(LPS25H_addr, dt, 2, false);
00155     }
00156 }