MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.
Embed:
(wiki syntax)
Show/hide line numbers
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 00006 * 00007 * Copyright (c) 2015,'17 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: August 21st, 2017 00012 */ 00013 00014 #include "LPS25H.h" 00015 00016 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr) : 00017 _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) 00018 { 00019 LPS25H_addr = addr; 00020 LPS25H_mode = FIFO_HW_FILTER; 00021 init(); 00022 } 00023 00024 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) : 00025 _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) 00026 { 00027 LPS25H_addr = addr; 00028 LPS25H_mode = mode; 00029 init(); 00030 } 00031 00032 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c) 00033 { 00034 LPS25H_addr = addr; 00035 LPS25H_mode = FIFO_HW_FILTER; 00036 init(); 00037 } 00038 00039 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr, uint8_t mode) : _i2c(p_i2c) 00040 { 00041 LPS25H_addr = addr; 00042 LPS25H_mode = mode; 00043 init(); 00044 } 00045 00046 /////////////// Initialize //////////////////////////////// 00047 void LPS25H::init(void) 00048 { 00049 _i2c.frequency(100000); 00050 // Check acc is available of not 00051 dt[0] = LPS25H_WHO_AM_I; 00052 _i2c.write(LPS25H_addr, dt, 1, true); 00053 _i2c.read(LPS25H_addr, dt, 1, false); 00054 if (dt[0] == I_AM_LPS25H) { 00055 LPS25H_id = I_AM_LPS25H; 00056 LPS25H_ready = 1; 00057 } else { 00058 LPS25H_id = 0; 00059 LPS25H_ready = 0; 00060 return; // acc chip is NOT on I2C line then terminate 00061 } 00062 if (LPS25H_mode == FIFO_HW_FILTER){ 00063 // Hardware digital filter 00064 // AN4450 April 2014 Rev1 P20/26, 00065 // Filter enabling and suggested configuration 00066 dt[0] = LPS25H_RES_CONF; 00067 dt[1] = 0x05; 00068 _i2c.write(LPS25H_addr, dt, 2, false); 00069 dt[0] = LPS25H_FIFO_CTRL; 00070 dt[1] = 0xdf; 00071 _i2c.write(LPS25H_addr, dt, 2, false); 00072 dt[0] = LPS25H_CTRL_REG2; 00073 dt[1] = 0x40; 00074 _i2c.write(LPS25H_addr, dt, 2, false); 00075 dt[0] = LPS25H_CTRL_REG1; 00076 dt[1] = 0x90; 00077 _i2c.write(LPS25H_addr, dt, 2, false); 00078 } else { 00079 dt[0] = LPS25H_CTRL_REG2; 00080 dt[1] = 0x0; 00081 _i2c.write(LPS25H_addr, dt, 2, false); 00082 dt[0] = LPS25H_CTRL_REG1; 00083 dt[1] = CR_STD_SET; 00084 _i2c.write(LPS25H_addr, dt, 2, false); 00085 } 00086 } 00087 00088 /////////////// Start conv. and gwt all data ////////////// 00089 void LPS25H::get(void) 00090 { 00091 if (LPS25H_ready == 0) { 00092 press = 0; 00093 temp = 0; 00094 return; 00095 } 00096 dt[0] = LPS25H_PRESS_POUT_XL | 0x80; 00097 _i2c.write(LPS25H_addr, dt, 1, true); 00098 _i2c.read(LPS25H_addr, dt, 3, false); 00099 press = dt[2] << 16 | dt[1] << 8 | dt[0]; 00100 dt[0] = LPS25H_TEMP_OUT_L | 0x80; 00101 _i2c.write(LPS25H_addr, dt, 1, true); 00102 _i2c.read(LPS25H_addr, dt, 2, false); 00103 temp = dt[1] << 8 | dt[0]; 00104 } 00105 00106 /////////////// Read data from sensor ///////////////////// 00107 float LPS25H::pressure() 00108 { 00109 return (float)press / 4096; 00110 } 00111 00112 /////////////// Read data from sensor ///////////////////// 00113 float LPS25H::temperature() 00114 { 00115 return (float)temp / 480 + 42.5; 00116 } 00117 00118 /////////////// ID //////////////////////////////////////// 00119 uint8_t LPS25H::read_id() 00120 { 00121 dt[0] = LPS25H_WHO_AM_I; 00122 _i2c.write(LPS25H_addr, dt, 1, true); 00123 _i2c.read(LPS25H_addr, dt, 1, false); 00124 return (uint8_t)dt[0]; 00125 } 00126 00127 /////////////// I2C Freq. ///////////////////////////////// 00128 void LPS25H::frequency(int hz) 00129 { 00130 _i2c.frequency(hz); 00131 } 00132 00133 /////////////// General purpose R/W /////////////////////// 00134 uint8_t LPS25H::read_reg(uint8_t addr) 00135 { 00136 if (LPS25H_ready == 1) { 00137 dt[0] = addr; 00138 _i2c.write(LPS25H_addr, dt, 1, true); 00139 _i2c.read(LPS25H_addr, dt, 1, false); 00140 } else { 00141 dt[0] = 0xff; 00142 } 00143 return (uint8_t)dt[0]; 00144 } 00145 00146 void LPS25H::write_reg(uint8_t addr, uint8_t data) 00147 { 00148 if (LPS25H_ready == 1) { 00149 dt[0] = addr; 00150 dt[1] = data; 00151 _i2c.write(LPS25H_addr, dt, 2, false); 00152 } 00153 }
Generated on Tue Jul 12 2022 19:06:11 by 1.7.2