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.
Dependents: test_MPL3115A2 test_MPL3115A2 testSensor Lab9-1 ... more
MPL3115A2.cpp
00001 /* 00002 * File description here 00003 */ 00004 #include "MPL3115A2.h" 00005 00006 /* some definitions here */ 00007 #define MPL_STATUS 0x00 00008 #define MPL_OUT_P_MSB 0x01 00009 #define MPL_OUT_P_CSB 0x02 00010 #define MPL_OUT_P_LSB 0x03 00011 #define MPL_OUT_T_MSB 0x04 00012 #define MPL_OUT_T_LSB 0x05 00013 #define MPL_DR_STATUS 0x06 00014 #define MPL_OUT_P_DELTA_MSB 0x07 00015 #define MPL_OUT_P_DELTA_CSB 0x08 00016 #define MPL_OUT_P_DELTA_LSB 0x09 00017 #define MPL_OUT_T_DELTA_MSB 0x0A 00018 #define MPL_OUT_T_DELTA_LSB 0x0B 00019 #define MPL_WHO_AM_I 0x0C 00020 #define MPL_F_STATUS 0x0D 00021 #define MPL_F_DATA 0x0E 00022 #define MPL_F_SETUP 0x0F 00023 #define MPL_TIME_DLY 0x10 00024 #define MPL_SYSMOD 0x11 00025 #define MPL_INT_SOURCE 0x12 00026 #define MPL_PT_DATA_CFG 0x13 00027 #define MPL_BAR_IN_MSB 0x14 00028 #define MPL_BAR_IN_LSB 0x15 00029 #define MPL_P_TGT_MSB 0x16 00030 #define MPL_P_TGT_LSB 0x17 00031 #define MPL_T_TGT 0x18 00032 #define MPL_P_WND_MSB 0x19 00033 #define MPL_P_WND_LSB 0x1A 00034 #define MPL_T_WND 0x1B 00035 #define MPL_P_MIN_MSB 0x1C 00036 #define MPL_P_MIN_CSB 0x1D 00037 #define MPL_P_MIN_LSB 0x1E 00038 #define MPL_T_MIN_MSB 0x1F 00039 #define MPL_T_MIN_LSB 0x20 00040 #define MPL_P_MAX_MSB 0x21 00041 #define MPL_P_MAX_CSB 0x22 00042 #define MPL_P_MAX_LSB 0x23 00043 #define MPL_T_MAX_MSB 0x24 00044 #define MPL_T_MAX_LSB 0x25 00045 #define MPL_CTRL_REG1 0x26 00046 #define MPL_CTRL_REG2 0x27 00047 #define MPL_CTRL_REG3 0x28 00048 #define MPL_CTRL_REG4 0x29 00049 #define MPL_CTRL_REG5 0x2A 00050 #define MPL_OFF_P 0x2B 00051 #define MPL_OFF_T 0x2C 00052 #define MPL_OFF_H 0x2D 00053 /* 00054 * If F_MODE = 0, FIFO is disabled 00055 * 00056 * 0x00/0x06 Sensor Status Register (DR_STATUS) 00057 * 0x01 Pressure Data Out MSB (OUT_P_MSB) 00058 * 0x02 Pressure Data Out CSB (OUT_P_CSB) 00059 * 0x03 Pressure Data Out LSB (OUT_P_LSB) 00060 * 0x04 Temperature Data Out MSB (OUT_T_MSB) 00061 * 0x05 Temperature Data out LSB (OUT_T_LSB) 00062 * 00063 * If F_Mode > 0, FIFO is circular buffer or full stop mode 00064 * 00065 * 0x00/0x0D Sensor Status Register (F_STATUS) 00066 * 0x01 FIFO 8-bit Data Access (F_DATA) 00067 * 0x02 Read to Reserved Area returns 00 00068 * 0x03 Read to Reserved Area returns 00 00069 * 0x04 Read to Reserved Area returns 00 00070 * 0x05 Read to Reserved Area returns 00 00071 * 00072 * F_MODE = 00, FIFO is disabled 00073 * F_MODE = 01, FIFO is circulated buffer 00074 * F_MODE = 10, FIFO is full stop mode 00075 */ 00076 00077 00078 MPL3115A2::MPL3115A2(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { 00079 // activate the peripheral 00080 standby() ; 00081 setCTRL_REG1( 0x38 ) ; /* oversample 32 */ 00082 activate() ; 00083 } 00084 00085 MPL3115A2::~MPL3115A2() { } 00086 00087 void MPL3115A2::readRegs(int addr, uint8_t * data, int len) { 00088 char t[1] = {addr} ; 00089 m_i2c.write(m_addr, t, 1, true) ; 00090 m_i2c.read(m_addr, (char*)data, len) ; 00091 } 00092 00093 void MPL3115A2::writeRegs(uint8_t * data, int len) { 00094 m_i2c.write(m_addr, (char *)data, len) ; 00095 } 00096 00097 uint8_t MPL3115A2::getStatus(void) { 00098 uint8_t data[1] ; 00099 readRegs(MPL_DR_STATUS, data, 1) ; 00100 return( data[0] ) ; 00101 } 00102 00103 /* 00104 * getAltitude returns the altitude in meters times 65536 00105 */ 00106 double MPL3115A2::getAltitude(void) 00107 { 00108 uint8_t tmp[3] ; 00109 uint16_t sample_time ; 00110 int32_t data ; 00111 00112 standby() ; 00113 modeAlt() ; 00114 sample_time = getSampleTime() ; 00115 activate() ; 00116 oneShot() ; 00117 wait_ms(sample_time) ; 00118 readRegs(MPL_OUT_P_MSB, tmp, 3) ; 00119 data = (tmp[0]<<24)|(tmp[1]<<16)|(tmp[2]<<8) ; 00120 return( ((double)data)/65536.0 ) ; 00121 } 00122 00123 /* 00124 * getPressure returns the pressure in Pascals times 64 00125 */ 00126 double MPL3115A2::getPressure(void) 00127 { 00128 uint8_t tmp[3] ; 00129 uint32_t data ; 00130 uint16_t sample_time ; 00131 00132 standby() ; 00133 modeBar() ; 00134 sample_time = getSampleTime() ; 00135 activate() ; 00136 oneShot() ; 00137 wait_ms(sample_time) ; 00138 readRegs(MPL_OUT_P_MSB, tmp, 3) ; 00139 data = ((tmp[0]<<16)|(tmp[1]<<8)|(tmp[2])) >> 6 ; 00140 return(((double)data) / 100.0 ) ; 00141 } 00142 00143 /* 00144 * getTemperature returns the temperature in c-degree times 256 00145 */ 00146 double MPL3115A2::getTemperature(void) 00147 { 00148 uint8_t tmp[2] ; 00149 uint16_t data ; 00150 00151 readRegs(MPL_OUT_T_MSB, tmp, 2) ; 00152 data = (tmp[0]<<8)|(tmp[1]) ; 00153 return( ((double)data)/256.0 ) ; 00154 } 00155 00156 /* 00157 * getAltDelta returns delta of alt in meters times 65536 00158 */ 00159 int32_t MPL3115A2::getAltDelta(void) 00160 { 00161 uint8_t tmp[3] ; 00162 int32_t data ; 00163 00164 readRegs(MPL_OUT_P_DELTA_MSB, tmp, 3) ; 00165 data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; 00166 return( data ) ; 00167 } 00168 00169 /* 00170 * getPrsDelta returns delta of pressure in Pascal times 16 00171 */ 00172 int32_t MPL3115A2::getPrsDelta(void) 00173 { 00174 uint8_t tmp[3] ; 00175 int32_t data ; 00176 00177 readRegs(MPL_OUT_P_DELTA_MSB, tmp, 3) ; 00178 data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; 00179 return( data ) ; 00180 } 00181 00182 /* 00183 * getTempDelta returns delta of temperature in c-degree times 16 00184 */ 00185 int16_t MPL3115A2::getTempDelta(void) 00186 { 00187 uint8_t tmp[2] ; 00188 int16_t data ; 00189 00190 readRegs(MPL_OUT_T_DELTA_MSB, tmp, 2) ; 00191 data = (tmp[0]<<8) | (tmp[1]&0xF0) ; 00192 return( data ) ; 00193 } 00194 00195 uint8_t MPL3115A2::getID(void) 00196 { 00197 uint8_t tmp[1] ; 00198 readRegs(MPL_WHO_AM_I, tmp, 1) ; 00199 return( tmp[0] ) ; 00200 } 00201 00202 uint8_t MPL3115A2::getFstatus(void) 00203 { 00204 uint8_t tmp[1] ; 00205 readRegs(MPL_F_STATUS, tmp, 1) ; 00206 return(tmp[0]) ; 00207 } 00208 00209 uint8_t MPL3115A2::getFdata(void) 00210 { 00211 uint8_t tmp[1] ; 00212 readRegs(MPL_F_DATA, tmp, 1) ; 00213 return(tmp[0]) ; 00214 } 00215 00216 uint8_t MPL3115A2::getFsetup(void) 00217 { 00218 uint8_t tmp[1] ; 00219 readRegs(MPL_F_SETUP, tmp, 1) ; 00220 return(tmp[0]) ; 00221 } 00222 00223 void MPL3115A2::setFsetup(uint8_t data) 00224 { 00225 uint8_t tmp[2] ; 00226 tmp[0] = MPL_F_SETUP ; 00227 tmp[1] = data ; 00228 writeRegs(tmp, 2) ; 00229 } 00230 00231 uint8_t MPL3115A2::getTimeDelay(void) 00232 { 00233 uint8_t tmp[1] ; 00234 readRegs(MPL_TIME_DLY, tmp, 1) ; 00235 return( tmp[0] ) ; 00236 } 00237 00238 uint8_t MPL3115A2::getSysMod(void) 00239 { 00240 uint8_t tmp[1] ; 00241 readRegs(MPL_SYSMOD, tmp, 1) ; 00242 return( tmp[0] ) ; 00243 } 00244 00245 uint8_t MPL3115A2::getIntSource(void) 00246 { 00247 uint8_t tmp[1] ; 00248 readRegs(MPL_INT_SOURCE, tmp, 1) ; 00249 return( tmp[0] ) ; 00250 } 00251 00252 uint8_t MPL3115A2::getPtDataConfig(void) 00253 { 00254 uint8_t tmp[1] ; 00255 readRegs(MPL_PT_DATA_CFG, tmp, 1) ; 00256 return( tmp[0] ) ; 00257 } 00258 00259 void MPL3115A2::setPtDataConfig(uint8_t data) 00260 { 00261 uint8_t tmp[2] ; 00262 tmp[0] = MPL_PT_DATA_CFG ; 00263 tmp[1] = data ; 00264 writeRegs(tmp, 2) ; 00265 } 00266 00267 uint16_t MPL3115A2::getBarIn(void) 00268 { 00269 uint8_t tmp[2] ; 00270 readRegs(MPL_BAR_IN_MSB, tmp, 2) ; 00271 return( (uint16_t)tmp[0] ) ; 00272 } 00273 00274 void MPL3115A2::setBarIn(uint16_t data) 00275 { 00276 uint8_t tmp[3] ; 00277 tmp[0] = MPL_BAR_IN_MSB ; 00278 tmp[1] = (data >> 8)&0xFF ; 00279 tmp[2] = data & 0xFF ; 00280 writeRegs(tmp, 3) ; 00281 } 00282 00283 int16_t MPL3115A2::getP_TGT(void) 00284 { 00285 uint8_t tmp[2] ; 00286 int16_t data ; 00287 readRegs(MPL_P_TGT_MSB, tmp, 2) ; 00288 data = (tmp[0] << 8) | tmp[1] ; 00289 return( data ) ; 00290 } 00291 00292 void MPL3115A2::setP_TGT(int16_t data) 00293 { 00294 uint8_t tmp[3] ; 00295 tmp[0] = MPL_P_TGT_MSB ; 00296 tmp[1] = (data >> 8) & 0xFF ; 00297 tmp[2] = data & 0xFF ; 00298 writeRegs(tmp, 3) ; 00299 } 00300 00301 int8_t MPL3115A2::getT_TGT(void) 00302 { 00303 uint8_t tmp[1] ; 00304 readRegs(MPL_T_TGT, tmp, 1) ; 00305 return( (int8_t)tmp[0] ) ; 00306 } 00307 00308 void MPL3115A2::setT_TGT(int8_t data) 00309 { 00310 uint8_t tmp[2] ; 00311 tmp[0] = MPL_PT_DATA_CFG ; 00312 tmp[1] = data ; 00313 writeRegs(tmp, 2) ; 00314 } 00315 00316 uint16_t MPL3115A2::getP_WND(void) 00317 { 00318 uint8_t tmp[2] ; 00319 uint16_t data ; 00320 readRegs(MPL_P_WND_MSB, tmp, 2) ; 00321 data = (tmp[0]<<8) | tmp[1] ; 00322 return(data) ; 00323 } 00324 00325 void MPL3115A2::setP_WND(uint16_t data) 00326 { 00327 uint8_t tmp[3] ; 00328 tmp[0] = MPL_P_WND_MSB ; 00329 tmp[1] = (data >> 8)&0xFF ; 00330 tmp[2] = data & 0xFF ; 00331 writeRegs(tmp, 3) ; 00332 } 00333 00334 uint8_t MPL3115A2::getT_WND(void) 00335 { 00336 uint8_t tmp[1] ; 00337 readRegs(MPL_T_WND, tmp, 1) ; 00338 return(tmp[0]) ; 00339 } 00340 00341 void MPL3115A2::setT_WND(uint8_t data) 00342 { 00343 uint8_t tmp[2] ; 00344 tmp[0] = MPL_T_WND ; 00345 tmp[1] = data ; 00346 writeRegs(tmp, 2) ; 00347 } 00348 00349 int32_t MPL3115A2::getP_MIN(void) 00350 { 00351 uint8_t tmp[3] ; 00352 int32_t data ; 00353 readRegs(MPL_P_MIN_MSB, tmp, 3) ; 00354 data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; 00355 return( data ) ; 00356 } 00357 00358 void MPL3115A2::setT_MIN(int32_t data) 00359 { 00360 uint8_t tmp[4] ; 00361 tmp[0] = MPL_P_MIN_MSB ; 00362 tmp[1] = (data >> 24) & 0xFF ; 00363 tmp[2] = (data >> 16) & 0xFF ; 00364 tmp[3] = (data >> 8) & 0xF0 ; 00365 writeRegs(tmp, 4) ; 00366 } 00367 00368 int32_t MPL3115A2::getP_MAX(void) 00369 { 00370 uint8_t tmp[3] ; 00371 int32_t data ; 00372 readRegs(MPL_P_MAX_MSB, tmp, 3) ; 00373 data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; 00374 return( data ) ; 00375 } 00376 00377 void MPL3115A2::setP_MAX(int32_t data) 00378 { 00379 uint8_t tmp[4] ; 00380 tmp[0] = MPL_P_MAX_MSB ; 00381 tmp[1] = (data >> 24) & 0xFF ; 00382 tmp[2] = (data >> 16) & 0xFF ; 00383 tmp[3] = (data >> 8) & 0xF0 ; 00384 writeRegs(tmp, 4) ; 00385 } 00386 00387 int16_t MPL3115A2::getT_MIN(void) 00388 { 00389 uint8_t tmp[2] ; 00390 uint16_t data ; 00391 readRegs(MPL_T_MIN_MSB, tmp, 2) ; 00392 data = (tmp[0]<<8) | tmp[1] ; 00393 return(data) ; 00394 } 00395 00396 void MPL3115A2::setT_MIN(int16_t data) 00397 { 00398 uint8_t tmp[3] ; 00399 tmp[0] = MPL_T_MIN_MSB ; 00400 tmp[1] = (data >> 8) & 0xFF ; 00401 tmp[2] = data & 0xFF ; 00402 writeRegs(tmp, 3) ; 00403 } 00404 00405 int16_t MPL3115A2::getT_MAX(void) 00406 { 00407 uint8_t tmp[2] ; 00408 uint16_t data ; 00409 readRegs(MPL_T_MAX_MSB, tmp, 2) ; 00410 data = (tmp[0]<<8) | tmp[1] ; 00411 return( data ) ; 00412 } 00413 00414 void MPL3115A2::setT_MAX(int16_t data) 00415 { 00416 uint8_t tmp[3] ; 00417 tmp[0] = MPL_T_MAX_MSB ; 00418 tmp[1] = (data >> 8) & 0xFF ; 00419 tmp[2] = data & 0xFF ; 00420 writeRegs(tmp, 3) ; 00421 } 00422 00423 uint8_t MPL3115A2::getCTRL_REG1(void) 00424 { 00425 uint8_t tmp[1] ; 00426 readRegs(MPL_CTRL_REG1, tmp, 1) ; 00427 return( tmp[0] ) ; 00428 } 00429 00430 void MPL3115A2::setCTRL_REG1(uint8_t data) 00431 { 00432 uint8_t tmp[2] ; 00433 tmp[0] = MPL_CTRL_REG1 ; 00434 tmp[1] = data ; 00435 writeRegs(tmp, 2) ; 00436 } 00437 00438 uint8_t MPL3115A2::getCTRL_REG2(void) 00439 { 00440 uint8_t tmp[1] ; 00441 readRegs(MPL_CTRL_REG2, tmp, 1) ; 00442 return( tmp[0] ) ; 00443 } 00444 00445 void MPL3115A2::setCTRL_REG2(uint8_t data) 00446 { 00447 uint8_t tmp[2] ; 00448 tmp[0] = MPL_CTRL_REG2 ; 00449 tmp[1] = data ; 00450 writeRegs(tmp, 2) ; 00451 } 00452 00453 uint8_t MPL3115A2::getCTRL_REG3(void) 00454 { 00455 uint8_t tmp[1] ; 00456 readRegs(MPL_CTRL_REG3, tmp, 1) ; 00457 return( tmp[0] ) ; 00458 } 00459 00460 void MPL3115A2::setCTRL_REG3(uint8_t data) 00461 { 00462 uint8_t tmp[2] ; 00463 tmp[0] = MPL_CTRL_REG3 ; 00464 tmp[1] = data ; 00465 writeRegs(tmp, 2) ; 00466 } 00467 00468 uint8_t MPL3115A2::getCTRL_REG4(void) 00469 { 00470 uint8_t tmp[1] ; 00471 readRegs(MPL_CTRL_REG4, tmp, 1) ; 00472 return( tmp[0] ) ; 00473 } 00474 00475 void MPL3115A2::setCTRL_REG4(uint8_t data) 00476 { 00477 uint8_t tmp[2] ; 00478 tmp[0] = MPL_CTRL_REG4 ; 00479 tmp[1] = data ; 00480 writeRegs(tmp, 2) ; 00481 } 00482 00483 uint8_t MPL3115A2::getCTRL_REG5(void) 00484 { 00485 uint8_t tmp[1] ; 00486 readRegs(MPL_CTRL_REG5, tmp, 1) ; 00487 return( tmp[0] ) ; 00488 } 00489 00490 void MPL3115A2::setCTRL_REG5(uint8_t data) 00491 { 00492 uint8_t tmp[2] ; 00493 tmp[0] = MPL_CTRL_REG5 ; 00494 tmp[1] = data ; 00495 writeRegs(tmp, 2) ; 00496 } 00497 00498 void MPL3115A2::oneShot(void) 00499 { 00500 uint8_t tmp[2] ; 00501 tmp[0] = MPL_CTRL_REG1 ; 00502 readRegs(tmp[0], &tmp[1], 1) ; 00503 tmp[1] &= 0xFD ; /* clear OST */ 00504 writeRegs(tmp, 2) ; 00505 tmp[1] |= 0x02 ; /* set OST */ 00506 writeRegs(tmp, 2) ; 00507 } 00508 00509 uint16_t MPL3115A2::getSampleTime(void) 00510 { 00511 uint8_t tmp[2] ; 00512 uint16_t sample_time = 6 ; 00513 tmp[0] = MPL_CTRL_REG1 ; 00514 readRegs(tmp[0], &tmp[1], 1) ; 00515 tmp[1] |= 0x02 ; 00516 writeRegs(tmp, 2) ; 00517 switch((tmp[1]>>3)&0x07) { 00518 case 0: sample_time = 6 ; break ; 00519 case 1: sample_time = 10 ; break ; 00520 case 2: sample_time = 18 ; break ; 00521 case 3: sample_time = 34 ; break ; 00522 case 4: sample_time = 66 ; break ; 00523 case 5: sample_time = 130 ; break ; 00524 case 6: sample_time = 258 ; break ; 00525 case 7: sample_time = 512 ; break ; 00526 default: sample_time = 6 ; break ; 00527 } 00528 return( sample_time ) ; 00529 } 00530 00531 void MPL3115A2::standby(void) 00532 { 00533 uint8_t tmp[2] ; 00534 tmp[0] = MPL_CTRL_REG1 ; 00535 readRegs(tmp[0], &tmp[1], 1) ; 00536 tmp[1] &= 0xFE ; 00537 writeRegs(tmp, 2) ; 00538 } 00539 00540 void MPL3115A2::activate(void) 00541 { 00542 uint8_t tmp[2] ; 00543 tmp[0] = MPL_CTRL_REG1 ; 00544 readRegs(tmp[0], &tmp[1], 1) ; 00545 tmp[1] |= 0x01 ; 00546 writeRegs(tmp, 2) ; 00547 } 00548 00549 void MPL3115A2::modeAlt(void) 00550 { 00551 uint8_t tmp[2] ; 00552 tmp[0] = MPL_CTRL_REG1 ; 00553 readRegs(tmp[0], &tmp[1], 1) ; 00554 tmp[1] |= 0x80 ; 00555 writeRegs(tmp, 2) ; 00556 } 00557 00558 void MPL3115A2::modeBar(void) 00559 { 00560 uint8_t tmp[2] ; 00561 tmp[0] = MPL_CTRL_REG1 ; 00562 readRegs(tmp[0], &tmp[1], 1) ; 00563 tmp[1] &= 0x7F ; 00564 writeRegs(tmp, 2) ; 00565 }
Generated on Wed Jul 13 2022 01:04:15 by
1.7.2