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

Files at this revision

API Documentation at this revision

Comitter:
kenjiArai
Date:
Sun Feb 22 00:59:52 2015 +0000
Child:
1:54e65e221cae
Commit message:
MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.

Changed in this revision

LPS25H.cpp Show annotated file Show diff for this revision Revisions of this file
LPS25H.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPS25H.cpp	Sun Feb 22 00:59:52 2015 +0000
@@ -0,0 +1,156 @@
+/*
+ * mbed library program
+ *  LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
+ *   made by STMicroelectronics
+ *   http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230?s_searchtype=partnumber
+ *
+ * Copyright (c) 2015 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created: Feburary  21st, 2015
+ *      Revised: Feburary  22nd, 2015
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "LPS25H.h"
+
+LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
+{
+    LPS25H_addr = addr;
+    LPS25H_mode = FIFO_HW_FILTER;
+    init();
+}
+
+LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) : _i2c(p_sda, p_scl)
+{
+    LPS25H_addr = addr;
+    LPS25H_mode = mode;
+    init();
+}
+
+LPS25H::LPS25H (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
+{
+    LPS25H_addr = addr;
+    LPS25H_mode = FIFO_HW_FILTER;
+    init();
+}
+
+LPS25H::LPS25H (I2C& p_i2c, uint8_t addr, uint8_t mode) : _i2c(p_i2c)
+{
+    LPS25H_addr = addr;
+    LPS25H_mode = mode;
+    init();
+}
+
+/////////////// Initialize ////////////////////////////////
+void LPS25H::init(void)
+{
+    _i2c.frequency(100000);
+    // Check acc is available of not
+    dt[0] = LPS25H_WHO_AM_I;
+    _i2c.write(LPS25H_addr, dt, 1, true);
+    _i2c.read(LPS25H_addr, dt, 1, false);
+    if (dt[0] == I_AM_LPS25H) {
+        LPS25H_id = I_AM_LPS25H;
+        LPS25H_ready = 1;
+    } else {
+        LPS25H_id = 0;
+        LPS25H_ready = 0;
+        return;     // acc chip is NOT on I2C line then terminate
+    }
+    if (LPS25H_mode == FIFO_HW_FILTER){
+        // Hardware digital filter
+        // AN4450 April 2014 Rev1 P20/26, Filter enabling and suggested configuration
+        dt[0] = LPS25H_RES_CONF;
+        dt[1] = 0x05;
+        _i2c.write(LPS25H_addr, dt, 2, false);
+        dt[0] = LPS25H_FIFO_CTRL;
+        dt[1] = 0xdf;
+        _i2c.write(LPS25H_addr, dt, 2, false);
+        dt[0] = LPS25H_CTRL_REG2;
+        dt[1] = 0x40;
+        _i2c.write(LPS25H_addr, dt, 2, false);
+        dt[0] = LPS25H_CTRL_REG1;
+        dt[1] = 0x90;
+        _i2c.write(LPS25H_addr, dt, 2, false);
+    } else {
+        dt[0] = LPS25H_CTRL_REG2;
+        dt[1] = 0x0;
+        _i2c.write(LPS25H_addr, dt, 2, false);       
+        dt[0] = LPS25H_CTRL_REG1;
+        dt[1] = CR_STD_SET;
+        _i2c.write(LPS25H_addr, dt, 2, false);
+    }
+}
+
+/////////////// Start conv. and gwt all data //////////////
+void LPS25H::get(void)
+{
+    if (LPS25H_ready == 0) {
+        press = 0;
+        temp = 0;
+        return;
+    }
+    dt[0] = LPS25H_PRESS_POUT_XL | 0x80;
+    _i2c.write(LPS25H_addr, dt, 1, true);
+    _i2c.read(LPS25H_addr, dt, 3, false);
+    press = dt[2] << 16 | dt[1] << 8 | dt[0];
+    dt[0] = LPS25H_TEMP_OUT_L | 0x80;
+    _i2c.write(LPS25H_addr, dt, 1, true);
+    _i2c.read(LPS25H_addr, dt, 2, false);
+    temp = dt[1] << 8 | dt[0];
+}
+
+/////////////// Read data from sensor /////////////////////
+float LPS25H::pressure()
+{
+    return (float)press / 4096;
+}
+
+/////////////// Read data from sensor /////////////////////
+float LPS25H::temperature()
+{
+    return (float)temp / 480  + 42.5;
+}
+
+/////////////// ID ////////////////////////////////////////
+uint8_t LPS25H::read_id()
+{
+    dt[0] = LPS25H_WHO_AM_I;
+    _i2c.write(LPS25H_addr, dt, 1, true);
+    _i2c.read(LPS25H_addr, dt, 1, false);
+    return (uint8_t)dt[0];
+}
+
+/////////////// I2C Freq. /////////////////////////////////
+void LPS25H::frequency(int hz)
+{
+    _i2c.frequency(hz);
+}
+
+/////////////// General purpose R/W ///////////////////////
+uint8_t LPS25H::read_reg(uint8_t addr)
+{
+    if (LPS25H_ready == 1) {
+        dt[0] = addr;
+        _i2c.write(LPS25H_addr, dt, 1, true);
+        _i2c.read(LPS25H_addr, dt, 1, false);
+    } else {
+        dt[0] = 0xff;
+    }
+    return (uint8_t)dt[0];
+}
+
+void LPS25H::write_reg(uint8_t addr, uint8_t data)
+{
+    if (LPS25H_ready == 1) {
+        dt[0] = addr;
+        dt[1] = data;
+        _i2c.write(LPS25H_addr, dt, 2, false);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPS25H.h	Sun Feb 22 00:59:52 2015 +0000
@@ -0,0 +1,192 @@
+/*
+ * mbed library program
+ *  LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
+ *   made by STMicroelectronics
+ *   http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230
+ *
+ * Copyright (c) 2015 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created: Feburary  21st, 2015
+ *      Revised: Feburary  22nd, 2015
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/*
+ *---------------- REFERENCE ----------------------------------------------------------------------
+ * Original Information
+ *  http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM89/SC1316/PF255230
+ * AN4450 Application Note (as follows)
+ *  http://www.st.com/st-web-ui/static/active/jp/
+ *         resource/technical/document/application_note/DM00108837.pdf
+ * Device kit
+ *  http://akizukidenshi.com/catalog/g/gK-08338/
+ */
+
+#ifndef LPS25H_H
+#define LPS25H_H
+
+#include "mbed.h"
+
+//  LPS25H Address
+//  7bit address = 0b101110x(0x5c or 0x5d depends on SA0/SDO)
+#define LPS25H_G_CHIP_ADDR  (0x5c << 1)    // SA0(=SDO pin) = Ground
+#define LPS25H_V_CHIP_ADDR  (0x5d << 1)    // SA0(=SDO pin) = Vdd
+
+// MODE Selection
+#define FIFO_HW_FILTER          1
+#define FIFO_BYPASS             0
+
+//   LPS25H ID
+#define I_AM_LPS25H            0xbd
+
+//  Register's definition
+#define LPS25H_WHO_AM_I        0x0f
+#define LPS25H_RES_CONF        0x10
+
+#define LPS25H_CTRL_REG1       0x20
+#define LPS25H_CTRL_REG2       0x21
+#define LPS25H_CTRL_REG3       0x22
+#define LPS25H_CTRL_REG4       0x23
+
+#define LPS25H_STATUS_REG      0x27
+#define LPS25H_PRESS_POUT_XL   0x28
+#define LPS25H_PRESS_OUT_L     0x29
+#define LPS25H_PRESS_OUT_H     0x2a
+#define LPS25H_TEMP_OUT_L      0x2b
+#define LPS25H_TEMP_OUT_H      0x2c
+
+#define LPS25H_FIFO_CTRL       0x2e
+#define LPS25H_FIFO_STATUS     0x2e
+
+// Control Reg.
+#define PD              (0UL << 7)
+#define ACTIVE          (1UL << 7)
+#define ODR_ONESHOT     (0UL << 4)
+#define ODR_1HZ         (1UL << 4)
+#define ODR_7HZ         (1UL << 4)
+#define ODR_12R5HZ      (2UL << 4)
+#define ODR_25HZ        (3UL << 4)
+#define BDU_SET         (1UL << 2)
+#define CR_STD_SET      (ACTIVE + ODR_7HZ + BDU_SET)
+
+// FIFO Control
+#define FIFO_MEAN_MODE         0xc0
+#define FIFO_SAMPLE_2          0x01
+#define FIFO_SAMPLE_4          0x03
+#define FIFO_SAMPLE_8          0x07
+#define FIFO_SAMPLE_16         0x0f
+#define FIFO_SAMPLE_32         0x1f
+
+/** Interface for STMicronics MEMS pressure sensor
+ *      Chip: LPS25H
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "LPS25H.h"
+ *
+ * // I2C Communication
+ * LPS25H baro(p_sda, p_scl, LPS25H_G_CHIP_ADDR);
+ * // If you connected I2C line not only this device but also other devices,
+ * //     you need to declare following method.
+ * I2C i2c(dp5,dp27);              // SDA, SCL
+ * LPS25H baro(i2c, LPS25H_G_CHIP_ADDR);
+ *
+ * int main() {
+ *   while( trure){
+ *      baro.get();
+ *      printf("Presere: 0x%6.1f, Temperature: 0x%+4.1f\r\n", baro.pressue(), baro.temperature());
+ *      wait(1.0);
+ *   }
+ * }
+ * @endcode
+ */
+
+class LPS25H
+{
+public:
+    /** Configure data pin
+      * @param data SDA and SCL pins
+      * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or LPS25H_V_CHIP_ADDR
+      * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS (Option parameter)
+      */
+    LPS25H(PinName p_sda, PinName p_scl, uint8_t addr);
+    LPS25H(PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode);
+
+    /** Configure data pin (with other devices on I2C line)
+      * @param I2C previous definition
+      * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or LPS25H_V_CHIP_ADDR
+      * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS (Option parameter)
+      */
+    LPS25H(I2C& p_i2c, uint8_t addr);
+    LPS25H(I2C& p_i2c, uint8_t addr, uint8_t mode);
+
+    /** Start convertion & data save
+      * @param none
+      * @return none
+      */
+    void get(void);
+
+    /** Read pressure data
+      * @param none
+      * @return humidity
+      */
+    float pressure(void);
+
+    /** Read temperature data
+      * @param none
+      * @return temperature
+      */
+    float temperature(void);
+
+    /** Read a ID number
+      * @param none
+      * @return if STM MEMS LPS25H, it should be I_AM_ LPS25H
+      */
+    uint8_t read_id(void);
+
+    /** Read Data Ready flag
+      * @param none
+      * @return 1 = Ready
+      */
+    uint8_t data_ready(void);
+
+    /** Set I2C clock frequency
+      * @param freq.
+      * @return none
+      */
+    void frequency(int hz);
+
+    /** Read register (general purpose)
+      * @param register's address
+      * @return register data
+      */
+    uint8_t read_reg(uint8_t addr);
+
+    /** Write register (general purpose)
+      * @param register's address
+      * @param data
+      * @return none
+      */
+    void write_reg(uint8_t addr, uint8_t data);
+
+protected:
+    I2C _i2c;
+
+    void init(void);
+
+private:
+    char dt[6];            // working buffer
+    uint8_t LPS25H_addr;   // Sensor address
+    uint8_t LPS25H_id;     // ID
+    uint8_t LPS25H_ready;  // Device is on I2C line = 1, not = 0
+    uint8_t LPS25H_mode;   // Operation mode
+    uint32_t press;        // pressure raw data
+    int16_t temp;          // temperature raw data
+};
+
+#endif      // LPS25H_H