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.
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