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
Revision 0:8fc511bd51af, committed 2015-02-22
- 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
