Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
LPS22HB.cpp
00001 /* 00002 * mbed library program 00003 * LPS22HB MEMS pressure sensor: 260-1260 hPa absolute digital output barometer 00004 * made by STMicroelectronics 00005 * http://www.st.com/ja/mems-and-sensors/lps22hb.html 00006 * 00007 * Modified for LPS22HB by Taro Watanabe 00008 * http://mbed.org/users/feunoir/ 00009 * 00010 * Copyright (c) 2015 Kenji Arai / JH1PJL 00011 * http://www.page.sannet.ne.jp/kenjia/index.html 00012 * http://mbed.org/users/kenjiArai/ 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 00015 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 00016 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00017 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00018 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00019 */ 00020 00021 #include "LPS22HB.h" 00022 00023 LPS22HB::LPS22HB (PinName p_sda, PinName p_scl, uint8_t addr) 00024 : 00025 i2c_p(new I2C(p_sda, p_scl)), 00026 _i2c(*i2c_p) 00027 { 00028 LPS22HB_addr = addr; 00029 init(); 00030 } 00031 00032 LPS22HB::LPS22HB (I2C& p_i2c, uint8_t addr) 00033 : 00034 i2c_p(NULL), 00035 _i2c(p_i2c) 00036 { 00037 LPS22HB_addr = addr; 00038 init(); 00039 } 00040 00041 LPS22HB::~LPS22HB() 00042 { 00043 if( NULL != i2c_p ) 00044 delete i2c_p; 00045 } 00046 00047 /////////////// Initialize //////////////////////////////// 00048 void LPS22HB::init(void) 00049 { 00050 _i2c.frequency(400000); 00051 // Check acc is available of not 00052 dt[0] = LPS22HB_WHO_AM_I; 00053 _i2c.write(LPS22HB_addr, dt, 1, true); 00054 _i2c.read(LPS22HB_addr, dt, 1, false); 00055 if (dt[0] == I_AM_LPS22HB) { 00056 LPS22HB_id = I_AM_LPS22HB; 00057 LPS22HB_ready = 1; 00058 } else { 00059 LPS22HB_id = 0; 00060 LPS22HB_ready = 0; 00061 return; // acc chip is NOT on I2C line then terminate 00062 } 00063 00064 set_odr(LPS22HB_ODR_1HZ); 00065 } 00066 00067 /////////////// Start conv. and gwt all data ////////////// 00068 void LPS22HB::get(void) 00069 { 00070 if (LPS22HB_ready == 0) { 00071 press = 0; 00072 temp = 0; 00073 return; 00074 } 00075 dt[0] = LPS22HB_PRESS_POUT_XL | 0x80; 00076 _i2c.write(LPS22HB_addr, dt, 1, true); 00077 _i2c.read(LPS22HB_addr, dt, 3, false); 00078 press = dt[2] << 16 | dt[1] << 8 | dt[0]; 00079 dt[0] = LPS22HB_TEMP_OUT_L | 0x80; 00080 _i2c.write(LPS22HB_addr, dt, 1, true); 00081 _i2c.read(LPS22HB_addr, dt, 2, false); 00082 temp = dt[1] << 8 | dt[0]; 00083 } 00084 00085 /////////////// Read data from sensor ///////////////////// 00086 float LPS22HB::pressure() 00087 { 00088 return (float)press / 4096.0f; 00089 } 00090 00091 /////////////// Read raw data from sensor ///////////////// 00092 uint32_t LPS22HB::pressure_raw() 00093 { 00094 return press; 00095 } 00096 00097 /////////////// Read data from sensor ///////////////////// 00098 float LPS22HB::temperature() 00099 { 00100 return (float)temp / 100.0f; 00101 } 00102 00103 /////////////// Read raw data from sensor ///////////////// 00104 int16_t LPS22HB::temperature_raw() 00105 { 00106 return temp; 00107 } 00108 00109 /////////////// Check data ready ////////////////////////// 00110 uint8_t LPS22HB::data_ready() 00111 { 00112 dt[0] = LPS22HB_STATUS_REG; 00113 _i2c.write(LPS22HB_addr, dt, 1, true); 00114 _i2c.read(LPS22HB_addr, dt, 1, false); 00115 if (dt[0]) { 00116 return 1; 00117 } else { 00118 return 0; 00119 } 00120 } 00121 00122 /////////////// ID //////////////////////////////////////// 00123 uint8_t LPS22HB::read_id() 00124 { 00125 dt[0] = LPS22HB_WHO_AM_I; 00126 _i2c.write(LPS22HB_addr, dt, 1, true); 00127 _i2c.read(LPS22HB_addr, dt, 1, false); 00128 return (uint8_t)dt[0]; 00129 } 00130 00131 /////////////// I2C Freq. ///////////////////////////////// 00132 void LPS22HB::frequency(int hz) 00133 { 00134 _i2c.frequency(hz); 00135 } 00136 00137 /////////////// General purpose R/W /////////////////////// 00138 uint8_t LPS22HB::read_reg(uint8_t addr) 00139 { 00140 if (LPS22HB_ready == 1) { 00141 dt[0] = addr; 00142 _i2c.write(LPS22HB_addr, dt, 1, true); 00143 _i2c.read(LPS22HB_addr, dt, 1, false); 00144 } else { 00145 dt[0] = 0xff; 00146 } 00147 return (uint8_t)dt[0]; 00148 } 00149 00150 void LPS22HB::write_reg(uint8_t addr, uint8_t data) 00151 { 00152 if (LPS22HB_ready == 1) { 00153 dt[0] = addr; 00154 dt[1] = data; 00155 _i2c.write(LPS22HB_addr, dt, 2, false); 00156 } 00157 } 00158 00159 /////////////// ODR /////////////////////////////////////// 00160 void LPS22HB::set_odr(lps22hb_odr odrcfg) 00161 { 00162 uint8_t temp = read_reg(LPS22HB_CTRL_REG1); 00163 temp &= 0xff ^ 0x70; 00164 temp |= odrcfg; 00165 write_reg(LPS22HB_CTRL_REG1, temp); 00166 } 00167 00168 /////////////// LPF /////////////////////////////////////// 00169 void LPS22HB::set_lpf(lps22hb_lpf lpfcfg) 00170 { 00171 uint8_t temp = read_reg(LPS22HB_CTRL_REG1); 00172 temp &= 0xff ^ 0x0c; 00173 temp |= lpfcfg; 00174 write_reg(LPS22HB_CTRL_REG1, temp); 00175 } 00176 00177 /////////////// DRDY ////////////////////////////////////// 00178 void LPS22HB::drdy(lps22hb_drdy drdycfg) 00179 { 00180 uint8_t temp = read_reg(LPS22HB_CTRL_REG3); 00181 temp &= 0xff ^ 0x04; 00182 temp |= drdycfg; 00183 write_reg(LPS22HB_CTRL_REG3, temp); 00184 }
Generated on Sat Jul 16 2022 04:09:25 by
