Kenji Arai / LPS22HB
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LPS22HB.cpp Source File

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 }