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

Committer:
martinsimpson
Date:
Wed Mar 29 10:25:38 2017 +0000
Revision:
1:54e65e221cae
Parent:
0:8fc511bd51af
Line 118 added 'f' single precision number to double

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 0:8fc511bd51af 7 * Copyright (c) 2015 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 0:8fc511bd51af 11 * Revised: Feburary 22nd, 2015
kenjiArai 0:8fc511bd51af 12 *
kenjiArai 0:8fc511bd51af 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:8fc511bd51af 14 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:8fc511bd51af 15 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:8fc511bd51af 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:8fc511bd51af 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:8fc511bd51af 18 */
kenjiArai 0:8fc511bd51af 19 /*
kenjiArai 0:8fc511bd51af 20 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 0:8fc511bd51af 21 * Original Information
kenjiArai 0:8fc511bd51af 22 * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM89/SC1316/PF255230
kenjiArai 0:8fc511bd51af 23 * AN4450 Application Note (as follows)
kenjiArai 0:8fc511bd51af 24 * http://www.st.com/st-web-ui/static/active/jp/
kenjiArai 0:8fc511bd51af 25 * resource/technical/document/application_note/DM00108837.pdf
kenjiArai 0:8fc511bd51af 26 * Device kit
kenjiArai 0:8fc511bd51af 27 * http://akizukidenshi.com/catalog/g/gK-08338/
kenjiArai 0:8fc511bd51af 28 */
kenjiArai 0:8fc511bd51af 29
kenjiArai 0:8fc511bd51af 30 #ifndef LPS25H_H
kenjiArai 0:8fc511bd51af 31 #define LPS25H_H
kenjiArai 0:8fc511bd51af 32
kenjiArai 0:8fc511bd51af 33 #include "mbed.h"
kenjiArai 0:8fc511bd51af 34
kenjiArai 0:8fc511bd51af 35 // LPS25H Address
kenjiArai 0:8fc511bd51af 36 // 7bit address = 0b101110x(0x5c or 0x5d depends on SA0/SDO)
kenjiArai 0:8fc511bd51af 37 #define LPS25H_G_CHIP_ADDR (0x5c << 1) // SA0(=SDO pin) = Ground
kenjiArai 0:8fc511bd51af 38 #define LPS25H_V_CHIP_ADDR (0x5d << 1) // SA0(=SDO pin) = Vdd
kenjiArai 0:8fc511bd51af 39
kenjiArai 0:8fc511bd51af 40 // MODE Selection
kenjiArai 0:8fc511bd51af 41 #define FIFO_HW_FILTER 1
kenjiArai 0:8fc511bd51af 42 #define FIFO_BYPASS 0
kenjiArai 0:8fc511bd51af 43
kenjiArai 0:8fc511bd51af 44 // LPS25H ID
kenjiArai 0:8fc511bd51af 45 #define I_AM_LPS25H 0xbd
kenjiArai 0:8fc511bd51af 46
kenjiArai 0:8fc511bd51af 47 // Register's definition
kenjiArai 0:8fc511bd51af 48 #define LPS25H_WHO_AM_I 0x0f
kenjiArai 0:8fc511bd51af 49 #define LPS25H_RES_CONF 0x10
kenjiArai 0:8fc511bd51af 50
kenjiArai 0:8fc511bd51af 51 #define LPS25H_CTRL_REG1 0x20
kenjiArai 0:8fc511bd51af 52 #define LPS25H_CTRL_REG2 0x21
kenjiArai 0:8fc511bd51af 53 #define LPS25H_CTRL_REG3 0x22
kenjiArai 0:8fc511bd51af 54 #define LPS25H_CTRL_REG4 0x23
kenjiArai 0:8fc511bd51af 55
kenjiArai 0:8fc511bd51af 56 #define LPS25H_STATUS_REG 0x27
kenjiArai 0:8fc511bd51af 57 #define LPS25H_PRESS_POUT_XL 0x28
kenjiArai 0:8fc511bd51af 58 #define LPS25H_PRESS_OUT_L 0x29
kenjiArai 0:8fc511bd51af 59 #define LPS25H_PRESS_OUT_H 0x2a
kenjiArai 0:8fc511bd51af 60 #define LPS25H_TEMP_OUT_L 0x2b
kenjiArai 0:8fc511bd51af 61 #define LPS25H_TEMP_OUT_H 0x2c
kenjiArai 0:8fc511bd51af 62
kenjiArai 0:8fc511bd51af 63 #define LPS25H_FIFO_CTRL 0x2e
kenjiArai 0:8fc511bd51af 64 #define LPS25H_FIFO_STATUS 0x2e
kenjiArai 0:8fc511bd51af 65
kenjiArai 0:8fc511bd51af 66 // Control Reg.
kenjiArai 0:8fc511bd51af 67 #define PD (0UL << 7)
kenjiArai 0:8fc511bd51af 68 #define ACTIVE (1UL << 7)
kenjiArai 0:8fc511bd51af 69 #define ODR_ONESHOT (0UL << 4)
kenjiArai 0:8fc511bd51af 70 #define ODR_1HZ (1UL << 4)
kenjiArai 0:8fc511bd51af 71 #define ODR_7HZ (1UL << 4)
kenjiArai 0:8fc511bd51af 72 #define ODR_12R5HZ (2UL << 4)
kenjiArai 0:8fc511bd51af 73 #define ODR_25HZ (3UL << 4)
kenjiArai 0:8fc511bd51af 74 #define BDU_SET (1UL << 2)
kenjiArai 0:8fc511bd51af 75 #define CR_STD_SET (ACTIVE + ODR_7HZ + BDU_SET)
kenjiArai 0:8fc511bd51af 76
kenjiArai 0:8fc511bd51af 77 // FIFO Control
kenjiArai 0:8fc511bd51af 78 #define FIFO_MEAN_MODE 0xc0
kenjiArai 0:8fc511bd51af 79 #define FIFO_SAMPLE_2 0x01
kenjiArai 0:8fc511bd51af 80 #define FIFO_SAMPLE_4 0x03
kenjiArai 0:8fc511bd51af 81 #define FIFO_SAMPLE_8 0x07
kenjiArai 0:8fc511bd51af 82 #define FIFO_SAMPLE_16 0x0f
kenjiArai 0:8fc511bd51af 83 #define FIFO_SAMPLE_32 0x1f
kenjiArai 0:8fc511bd51af 84
kenjiArai 0:8fc511bd51af 85 /** Interface for STMicronics MEMS pressure sensor
kenjiArai 0:8fc511bd51af 86 * Chip: LPS25H
kenjiArai 0:8fc511bd51af 87 *
kenjiArai 0:8fc511bd51af 88 * @code
kenjiArai 0:8fc511bd51af 89 * #include "mbed.h"
kenjiArai 0:8fc511bd51af 90 * #include "LPS25H.h"
kenjiArai 0:8fc511bd51af 91 *
kenjiArai 0:8fc511bd51af 92 * // I2C Communication
kenjiArai 0:8fc511bd51af 93 * LPS25H baro(p_sda, p_scl, LPS25H_G_CHIP_ADDR);
kenjiArai 0:8fc511bd51af 94 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:8fc511bd51af 95 * // you need to declare following method.
kenjiArai 0:8fc511bd51af 96 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:8fc511bd51af 97 * LPS25H baro(i2c, LPS25H_G_CHIP_ADDR);
kenjiArai 0:8fc511bd51af 98 *
kenjiArai 0:8fc511bd51af 99 * int main() {
kenjiArai 0:8fc511bd51af 100 * while( trure){
kenjiArai 0:8fc511bd51af 101 * baro.get();
kenjiArai 0:8fc511bd51af 102 * printf("Presere: 0x%6.1f, Temperature: 0x%+4.1f\r\n", baro.pressue(), baro.temperature());
kenjiArai 0:8fc511bd51af 103 * wait(1.0);
kenjiArai 0:8fc511bd51af 104 * }
kenjiArai 0:8fc511bd51af 105 * }
kenjiArai 0:8fc511bd51af 106 * @endcode
kenjiArai 0:8fc511bd51af 107 */
kenjiArai 0:8fc511bd51af 108
kenjiArai 0:8fc511bd51af 109 class LPS25H
kenjiArai 0:8fc511bd51af 110 {
kenjiArai 0:8fc511bd51af 111 public:
kenjiArai 0:8fc511bd51af 112 /** Configure data pin
kenjiArai 0:8fc511bd51af 113 * @param data SDA and SCL pins
kenjiArai 0:8fc511bd51af 114 * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or LPS25H_V_CHIP_ADDR
kenjiArai 0:8fc511bd51af 115 * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS (Option parameter)
kenjiArai 0:8fc511bd51af 116 */
kenjiArai 0:8fc511bd51af 117 LPS25H(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:8fc511bd51af 118 LPS25H(PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode);
kenjiArai 0:8fc511bd51af 119
kenjiArai 0:8fc511bd51af 120 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:8fc511bd51af 121 * @param I2C previous definition
kenjiArai 0:8fc511bd51af 122 * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or LPS25H_V_CHIP_ADDR
kenjiArai 0:8fc511bd51af 123 * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS (Option parameter)
kenjiArai 0:8fc511bd51af 124 */
kenjiArai 0:8fc511bd51af 125 LPS25H(I2C& p_i2c, uint8_t addr);
kenjiArai 0:8fc511bd51af 126 LPS25H(I2C& p_i2c, uint8_t addr, uint8_t mode);
kenjiArai 0:8fc511bd51af 127
kenjiArai 0:8fc511bd51af 128 /** Start convertion & data save
kenjiArai 0:8fc511bd51af 129 * @param none
kenjiArai 0:8fc511bd51af 130 * @return none
kenjiArai 0:8fc511bd51af 131 */
kenjiArai 0:8fc511bd51af 132 void get(void);
kenjiArai 0:8fc511bd51af 133
kenjiArai 0:8fc511bd51af 134 /** Read pressure data
kenjiArai 0:8fc511bd51af 135 * @param none
kenjiArai 0:8fc511bd51af 136 * @return humidity
kenjiArai 0:8fc511bd51af 137 */
kenjiArai 0:8fc511bd51af 138 float pressure(void);
kenjiArai 0:8fc511bd51af 139
kenjiArai 0:8fc511bd51af 140 /** Read temperature data
kenjiArai 0:8fc511bd51af 141 * @param none
kenjiArai 0:8fc511bd51af 142 * @return temperature
kenjiArai 0:8fc511bd51af 143 */
kenjiArai 0:8fc511bd51af 144 float temperature(void);
kenjiArai 0:8fc511bd51af 145
kenjiArai 0:8fc511bd51af 146 /** Read a ID number
kenjiArai 0:8fc511bd51af 147 * @param none
kenjiArai 0:8fc511bd51af 148 * @return if STM MEMS LPS25H, it should be I_AM_ LPS25H
kenjiArai 0:8fc511bd51af 149 */
kenjiArai 0:8fc511bd51af 150 uint8_t read_id(void);
kenjiArai 0:8fc511bd51af 151
kenjiArai 0:8fc511bd51af 152 /** Read Data Ready flag
kenjiArai 0:8fc511bd51af 153 * @param none
kenjiArai 0:8fc511bd51af 154 * @return 1 = Ready
kenjiArai 0:8fc511bd51af 155 */
kenjiArai 0:8fc511bd51af 156 uint8_t data_ready(void);
kenjiArai 0:8fc511bd51af 157
kenjiArai 0:8fc511bd51af 158 /** Set I2C clock frequency
kenjiArai 0:8fc511bd51af 159 * @param freq.
kenjiArai 0:8fc511bd51af 160 * @return none
kenjiArai 0:8fc511bd51af 161 */
kenjiArai 0:8fc511bd51af 162 void frequency(int hz);
kenjiArai 0:8fc511bd51af 163
kenjiArai 0:8fc511bd51af 164 /** Read register (general purpose)
kenjiArai 0:8fc511bd51af 165 * @param register's address
kenjiArai 0:8fc511bd51af 166 * @return register data
kenjiArai 0:8fc511bd51af 167 */
kenjiArai 0:8fc511bd51af 168 uint8_t read_reg(uint8_t addr);
kenjiArai 0:8fc511bd51af 169
kenjiArai 0:8fc511bd51af 170 /** Write register (general purpose)
kenjiArai 0:8fc511bd51af 171 * @param register's address
kenjiArai 0:8fc511bd51af 172 * @param data
kenjiArai 0:8fc511bd51af 173 * @return none
kenjiArai 0:8fc511bd51af 174 */
kenjiArai 0:8fc511bd51af 175 void write_reg(uint8_t addr, uint8_t data);
kenjiArai 0:8fc511bd51af 176
kenjiArai 0:8fc511bd51af 177 protected:
kenjiArai 0:8fc511bd51af 178 I2C _i2c;
kenjiArai 0:8fc511bd51af 179
kenjiArai 0:8fc511bd51af 180 void init(void);
kenjiArai 0:8fc511bd51af 181
kenjiArai 0:8fc511bd51af 182 private:
kenjiArai 0:8fc511bd51af 183 char dt[6]; // working buffer
kenjiArai 0:8fc511bd51af 184 uint8_t LPS25H_addr; // Sensor address
kenjiArai 0:8fc511bd51af 185 uint8_t LPS25H_id; // ID
kenjiArai 0:8fc511bd51af 186 uint8_t LPS25H_ready; // Device is on I2C line = 1, not = 0
kenjiArai 0:8fc511bd51af 187 uint8_t LPS25H_mode; // Operation mode
kenjiArai 0:8fc511bd51af 188 uint32_t press; // pressure raw data
kenjiArai 0:8fc511bd51af 189 int16_t temp; // temperature raw data
kenjiArai 0:8fc511bd51af 190 };
kenjiArai 0:8fc511bd51af 191
kenjiArai 0:8fc511bd51af 192 #endif // LPS25H_H