MSS / MPL3115A2

Dependents:   test_MPL3115A2 test_MPL3115A2 testSensor Lab9-1 ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPL3115A2.cpp Source File

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 }