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

Dependents:   Altimu10v4

Committer:
kenjiArai
Date:
Tue Aug 22 10:18:07 2017 +0000
Revision:
1:9db35e42ddbc
Parent:
0:8fc511bd51af
countermeasure for  NonCopyable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:8fc511bd51af 1 /*
kenjiArai 0:8fc511bd51af 2 * mbed library program
kenjiArai 0:8fc511bd51af 3 * LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
kenjiArai 0:8fc511bd51af 4 * made by STMicroelectronics
kenjiArai 0:8fc511bd51af 5 * http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230
kenjiArai 0:8fc511bd51af 6 *
kenjiArai 1:9db35e42ddbc 7 * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
kenjiArai 0:8fc511bd51af 8 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:8fc511bd51af 9 * http://mbed.org/users/kenjiArai/
kenjiArai 0:8fc511bd51af 10 * Created: Feburary 21st, 2015
kenjiArai 1:9db35e42ddbc 11 * Revised: August 21st, 2017
kenjiArai 0:8fc511bd51af 12 */
kenjiArai 0:8fc511bd51af 13 /*
kenjiArai 1:9db35e42ddbc 14 *---------------- REFERENCE ---------------------------------------------------
kenjiArai 0:8fc511bd51af 15 * Original Information
kenjiArai 1:9db35e42ddbc 16 * http://www.st.com/content/st_com/ja/products/
kenjiArai 1:9db35e42ddbc 17 * mems-and-sensors/pressure-sensors/lps25h.html
kenjiArai 0:8fc511bd51af 18 * AN4450 Application Note (as follows)
kenjiArai 1:9db35e42ddbc 19 * en.DM00108837.pdf
kenjiArai 1:9db35e42ddbc 20 * Device kit (not avairable)
kenjiArai 0:8fc511bd51af 21 * http://akizukidenshi.com/catalog/g/gK-08338/
kenjiArai 0:8fc511bd51af 22 */
kenjiArai 0:8fc511bd51af 23
kenjiArai 0:8fc511bd51af 24 #ifndef LPS25H_H
kenjiArai 0:8fc511bd51af 25 #define LPS25H_H
kenjiArai 0:8fc511bd51af 26
kenjiArai 0:8fc511bd51af 27 #include "mbed.h"
kenjiArai 0:8fc511bd51af 28
kenjiArai 0:8fc511bd51af 29 // LPS25H Address
kenjiArai 0:8fc511bd51af 30 // 7bit address = 0b101110x(0x5c or 0x5d depends on SA0/SDO)
kenjiArai 0:8fc511bd51af 31 #define LPS25H_G_CHIP_ADDR (0x5c << 1) // SA0(=SDO pin) = Ground
kenjiArai 0:8fc511bd51af 32 #define LPS25H_V_CHIP_ADDR (0x5d << 1) // SA0(=SDO pin) = Vdd
kenjiArai 0:8fc511bd51af 33
kenjiArai 0:8fc511bd51af 34 // MODE Selection
kenjiArai 0:8fc511bd51af 35 #define FIFO_HW_FILTER 1
kenjiArai 0:8fc511bd51af 36 #define FIFO_BYPASS 0
kenjiArai 0:8fc511bd51af 37
kenjiArai 0:8fc511bd51af 38 // LPS25H ID
kenjiArai 0:8fc511bd51af 39 #define I_AM_LPS25H 0xbd
kenjiArai 0:8fc511bd51af 40
kenjiArai 0:8fc511bd51af 41 // Register's definition
kenjiArai 0:8fc511bd51af 42 #define LPS25H_WHO_AM_I 0x0f
kenjiArai 0:8fc511bd51af 43 #define LPS25H_RES_CONF 0x10
kenjiArai 0:8fc511bd51af 44
kenjiArai 0:8fc511bd51af 45 #define LPS25H_CTRL_REG1 0x20
kenjiArai 0:8fc511bd51af 46 #define LPS25H_CTRL_REG2 0x21
kenjiArai 0:8fc511bd51af 47 #define LPS25H_CTRL_REG3 0x22
kenjiArai 0:8fc511bd51af 48 #define LPS25H_CTRL_REG4 0x23
kenjiArai 0:8fc511bd51af 49
kenjiArai 0:8fc511bd51af 50 #define LPS25H_STATUS_REG 0x27
kenjiArai 0:8fc511bd51af 51 #define LPS25H_PRESS_POUT_XL 0x28
kenjiArai 0:8fc511bd51af 52 #define LPS25H_PRESS_OUT_L 0x29
kenjiArai 0:8fc511bd51af 53 #define LPS25H_PRESS_OUT_H 0x2a
kenjiArai 0:8fc511bd51af 54 #define LPS25H_TEMP_OUT_L 0x2b
kenjiArai 0:8fc511bd51af 55 #define LPS25H_TEMP_OUT_H 0x2c
kenjiArai 0:8fc511bd51af 56
kenjiArai 0:8fc511bd51af 57 #define LPS25H_FIFO_CTRL 0x2e
kenjiArai 0:8fc511bd51af 58 #define LPS25H_FIFO_STATUS 0x2e
kenjiArai 0:8fc511bd51af 59
kenjiArai 0:8fc511bd51af 60 // Control Reg.
kenjiArai 0:8fc511bd51af 61 #define PD (0UL << 7)
kenjiArai 0:8fc511bd51af 62 #define ACTIVE (1UL << 7)
kenjiArai 0:8fc511bd51af 63 #define ODR_ONESHOT (0UL << 4)
kenjiArai 0:8fc511bd51af 64 #define ODR_1HZ (1UL << 4)
kenjiArai 0:8fc511bd51af 65 #define ODR_7HZ (1UL << 4)
kenjiArai 0:8fc511bd51af 66 #define ODR_12R5HZ (2UL << 4)
kenjiArai 0:8fc511bd51af 67 #define ODR_25HZ (3UL << 4)
kenjiArai 0:8fc511bd51af 68 #define BDU_SET (1UL << 2)
kenjiArai 0:8fc511bd51af 69 #define CR_STD_SET (ACTIVE + ODR_7HZ + BDU_SET)
kenjiArai 0:8fc511bd51af 70
kenjiArai 0:8fc511bd51af 71 // FIFO Control
kenjiArai 0:8fc511bd51af 72 #define FIFO_MEAN_MODE 0xc0
kenjiArai 0:8fc511bd51af 73 #define FIFO_SAMPLE_2 0x01
kenjiArai 0:8fc511bd51af 74 #define FIFO_SAMPLE_4 0x03
kenjiArai 0:8fc511bd51af 75 #define FIFO_SAMPLE_8 0x07
kenjiArai 0:8fc511bd51af 76 #define FIFO_SAMPLE_16 0x0f
kenjiArai 0:8fc511bd51af 77 #define FIFO_SAMPLE_32 0x1f
kenjiArai 0:8fc511bd51af 78
kenjiArai 0:8fc511bd51af 79 /** Interface for STMicronics MEMS pressure sensor
kenjiArai 0:8fc511bd51af 80 * Chip: LPS25H
kenjiArai 0:8fc511bd51af 81 *
kenjiArai 0:8fc511bd51af 82 * @code
kenjiArai 0:8fc511bd51af 83 * #include "mbed.h"
kenjiArai 0:8fc511bd51af 84 * #include "LPS25H.h"
kenjiArai 0:8fc511bd51af 85 *
kenjiArai 0:8fc511bd51af 86 * // I2C Communication
kenjiArai 0:8fc511bd51af 87 * LPS25H baro(p_sda, p_scl, LPS25H_G_CHIP_ADDR);
kenjiArai 0:8fc511bd51af 88 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:8fc511bd51af 89 * // you need to declare following method.
kenjiArai 0:8fc511bd51af 90 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:8fc511bd51af 91 * LPS25H baro(i2c, LPS25H_G_CHIP_ADDR);
kenjiArai 0:8fc511bd51af 92 *
kenjiArai 0:8fc511bd51af 93 * int main() {
kenjiArai 0:8fc511bd51af 94 * while( trure){
kenjiArai 0:8fc511bd51af 95 * baro.get();
kenjiArai 1:9db35e42ddbc 96 * printf("Presere: 0x%6.1f, Temperature: 0x%+4.1f\r\n",
kenjiArai 1:9db35e42ddbc 97 * baro.pressue(), baro.temperature());
kenjiArai 0:8fc511bd51af 98 * wait(1.0);
kenjiArai 0:8fc511bd51af 99 * }
kenjiArai 0:8fc511bd51af 100 * }
kenjiArai 0:8fc511bd51af 101 * @endcode
kenjiArai 0:8fc511bd51af 102 */
kenjiArai 0:8fc511bd51af 103
kenjiArai 0:8fc511bd51af 104 class LPS25H
kenjiArai 0:8fc511bd51af 105 {
kenjiArai 0:8fc511bd51af 106 public:
kenjiArai 0:8fc511bd51af 107 /** Configure data pin
kenjiArai 0:8fc511bd51af 108 * @param data SDA and SCL pins
kenjiArai 1:9db35e42ddbc 109 * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or _V_
kenjiArai 1:9db35e42ddbc 110 * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS
kenjiArai 0:8fc511bd51af 111 */
kenjiArai 0:8fc511bd51af 112 LPS25H(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:8fc511bd51af 113 LPS25H(PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode);
kenjiArai 0:8fc511bd51af 114
kenjiArai 0:8fc511bd51af 115 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:8fc511bd51af 116 * @param I2C previous definition
kenjiArai 1:9db35e42ddbc 117 * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or _V_
kenjiArai 1:9db35e42ddbc 118 * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS
kenjiArai 0:8fc511bd51af 119 */
kenjiArai 0:8fc511bd51af 120 LPS25H(I2C& p_i2c, uint8_t addr);
kenjiArai 0:8fc511bd51af 121 LPS25H(I2C& p_i2c, uint8_t addr, uint8_t mode);
kenjiArai 0:8fc511bd51af 122
kenjiArai 0:8fc511bd51af 123 /** Start convertion & data save
kenjiArai 0:8fc511bd51af 124 * @param none
kenjiArai 0:8fc511bd51af 125 * @return none
kenjiArai 0:8fc511bd51af 126 */
kenjiArai 0:8fc511bd51af 127 void get(void);
kenjiArai 0:8fc511bd51af 128
kenjiArai 0:8fc511bd51af 129 /** Read pressure data
kenjiArai 0:8fc511bd51af 130 * @param none
kenjiArai 0:8fc511bd51af 131 * @return humidity
kenjiArai 0:8fc511bd51af 132 */
kenjiArai 0:8fc511bd51af 133 float pressure(void);
kenjiArai 0:8fc511bd51af 134
kenjiArai 0:8fc511bd51af 135 /** Read temperature data
kenjiArai 0:8fc511bd51af 136 * @param none
kenjiArai 0:8fc511bd51af 137 * @return temperature
kenjiArai 0:8fc511bd51af 138 */
kenjiArai 0:8fc511bd51af 139 float temperature(void);
kenjiArai 0:8fc511bd51af 140
kenjiArai 0:8fc511bd51af 141 /** Read a ID number
kenjiArai 0:8fc511bd51af 142 * @param none
kenjiArai 0:8fc511bd51af 143 * @return if STM MEMS LPS25H, it should be I_AM_ LPS25H
kenjiArai 0:8fc511bd51af 144 */
kenjiArai 0:8fc511bd51af 145 uint8_t read_id(void);
kenjiArai 0:8fc511bd51af 146
kenjiArai 0:8fc511bd51af 147 /** Read Data Ready flag
kenjiArai 0:8fc511bd51af 148 * @param none
kenjiArai 0:8fc511bd51af 149 * @return 1 = Ready
kenjiArai 0:8fc511bd51af 150 */
kenjiArai 0:8fc511bd51af 151 uint8_t data_ready(void);
kenjiArai 0:8fc511bd51af 152
kenjiArai 0:8fc511bd51af 153 /** Set I2C clock frequency
kenjiArai 0:8fc511bd51af 154 * @param freq.
kenjiArai 0:8fc511bd51af 155 * @return none
kenjiArai 0:8fc511bd51af 156 */
kenjiArai 0:8fc511bd51af 157 void frequency(int hz);
kenjiArai 0:8fc511bd51af 158
kenjiArai 0:8fc511bd51af 159 /** Read register (general purpose)
kenjiArai 0:8fc511bd51af 160 * @param register's address
kenjiArai 0:8fc511bd51af 161 * @return register data
kenjiArai 0:8fc511bd51af 162 */
kenjiArai 0:8fc511bd51af 163 uint8_t read_reg(uint8_t addr);
kenjiArai 0:8fc511bd51af 164
kenjiArai 0:8fc511bd51af 165 /** Write register (general purpose)
kenjiArai 0:8fc511bd51af 166 * @param register's address
kenjiArai 0:8fc511bd51af 167 * @param data
kenjiArai 0:8fc511bd51af 168 * @return none
kenjiArai 0:8fc511bd51af 169 */
kenjiArai 0:8fc511bd51af 170 void write_reg(uint8_t addr, uint8_t data);
kenjiArai 0:8fc511bd51af 171
kenjiArai 0:8fc511bd51af 172 protected:
kenjiArai 1:9db35e42ddbc 173 I2C *_i2c_p;
kenjiArai 1:9db35e42ddbc 174 I2C &_i2c;
kenjiArai 0:8fc511bd51af 175
kenjiArai 0:8fc511bd51af 176 void init(void);
kenjiArai 0:8fc511bd51af 177
kenjiArai 0:8fc511bd51af 178 private:
kenjiArai 0:8fc511bd51af 179 char dt[6]; // working buffer
kenjiArai 0:8fc511bd51af 180 uint8_t LPS25H_addr; // Sensor address
kenjiArai 0:8fc511bd51af 181 uint8_t LPS25H_id; // ID
kenjiArai 0:8fc511bd51af 182 uint8_t LPS25H_ready; // Device is on I2C line = 1, not = 0
kenjiArai 0:8fc511bd51af 183 uint8_t LPS25H_mode; // Operation mode
kenjiArai 0:8fc511bd51af 184 uint32_t press; // pressure raw data
kenjiArai 0:8fc511bd51af 185 int16_t temp; // temperature raw data
kenjiArai 0:8fc511bd51af 186 };
kenjiArai 0:8fc511bd51af 187
kenjiArai 0:8fc511bd51af 188 #endif // LPS25H_H