MPL3115A2 20 to 110kPa, Absolute Digital Pressure Sensor

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

MPL3115A2.cpp

Committer:
Rhyme
Date:
2017-08-23
Revision:
2:12223b4c88b1
Parent:
1:6fdcf150410e

File content as of revision 2:12223b4c88b1:

/*
 * File description here
 */
#include "MPL3115A2.h"

/* some definitions here */
#define MPL_STATUS          0x00
#define MPL_OUT_P_MSB       0x01
#define MPL_OUT_P_CSB       0x02
#define MPL_OUT_P_LSB       0x03
#define MPL_OUT_T_MSB       0x04
#define MPL_OUT_T_LSB       0x05
#define MPL_DR_STATUS       0x06
#define MPL_OUT_P_DELTA_MSB 0x07
#define MPL_OUT_P_DELTA_CSB 0x08
#define MPL_OUT_P_DELTA_LSB 0x09
#define MPL_OUT_T_DELTA_MSB 0x0A
#define MPL_OUT_T_DELTA_LSB 0x0B
#define MPL_WHO_AM_I        0x0C
#define MPL_F_STATUS        0x0D
#define MPL_F_DATA          0x0E
#define MPL_F_SETUP         0x0F
#define MPL_TIME_DLY        0x10
#define MPL_SYSMOD          0x11
#define MPL_INT_SOURCE      0x12
#define MPL_PT_DATA_CFG     0x13
#define MPL_BAR_IN_MSB      0x14
#define MPL_BAR_IN_LSB      0x15
#define MPL_P_TGT_MSB       0x16
#define MPL_P_TGT_LSB       0x17
#define MPL_T_TGT           0x18
#define MPL_P_WND_MSB       0x19
#define MPL_P_WND_LSB       0x1A
#define MPL_T_WND           0x1B
#define MPL_P_MIN_MSB       0x1C
#define MPL_P_MIN_CSB       0x1D
#define MPL_P_MIN_LSB       0x1E
#define MPL_T_MIN_MSB       0x1F
#define MPL_T_MIN_LSB       0x20
#define MPL_P_MAX_MSB       0x21
#define MPL_P_MAX_CSB       0x22
#define MPL_P_MAX_LSB       0x23
#define MPL_T_MAX_MSB       0x24
#define MPL_T_MAX_LSB       0x25
#define MPL_CTRL_REG1       0x26
#define MPL_CTRL_REG2       0x27
#define MPL_CTRL_REG3       0x28
#define MPL_CTRL_REG4       0x29
#define MPL_CTRL_REG5       0x2A
#define MPL_OFF_P           0x2B
#define MPL_OFF_T           0x2C
#define MPL_OFF_H           0x2D
/*
 * If F_MODE = 0, FIFO is disabled
 *
 * 0x00/0x06 Sensor Status Register (DR_STATUS)
 * 0x01 Pressure Data Out MSB (OUT_P_MSB)
 * 0x02 Pressure Data Out CSB (OUT_P_CSB)
 * 0x03 Pressure Data Out LSB (OUT_P_LSB)
 * 0x04 Temperature Data Out MSB (OUT_T_MSB)
 * 0x05 Temperature Data out LSB (OUT_T_LSB)
 *
 * If F_Mode > 0, FIFO is circular buffer or full stop mode
 *
 * 0x00/0x0D Sensor Status Register (F_STATUS)
 * 0x01 FIFO 8-bit Data Access (F_DATA)
 * 0x02 Read to Reserved Area returns 00
 * 0x03 Read to Reserved Area returns 00
 * 0x04 Read to Reserved Area returns 00
 * 0x05 Read to Reserved Area returns 00
 *
 * F_MODE = 00, FIFO is disabled
 * F_MODE = 01, FIFO is circulated buffer
 * F_MODE = 10, FIFO is full stop mode
 */

    
MPL3115A2::MPL3115A2(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
    // activate the peripheral
    standby() ;
    setCTRL_REG1( 0x38 ) ; /* oversample 32 */
    activate() ;
}

MPL3115A2::~MPL3115A2() { }

void MPL3115A2::readRegs(int addr, uint8_t * data, int len) {
    char t[1] = {addr} ;
    m_i2c.write(m_addr, t, 1, true) ;
    m_i2c.read(m_addr, (char*)data, len) ;
}

void MPL3115A2::writeRegs(uint8_t * data, int len) {
   m_i2c.write(m_addr, (char *)data, len) ;
}

uint8_t MPL3115A2::getStatus(void) {
    uint8_t data[1] ;
    readRegs(MPL_DR_STATUS, data, 1) ;
    return( data[0] ) ;
}

/*
 * getAltitude returns the altitude in meters times 65536
 */
double MPL3115A2::getAltitude(void)
{
    uint8_t tmp[3] ;
    uint16_t sample_time ;
    int32_t data ;
 
    standby() ;
    modeAlt() ;
    sample_time = getSampleTime() ;
    activate() ;
    oneShot() ;
    wait_ms(sample_time) ;
    readRegs(MPL_OUT_P_MSB, tmp, 3) ;
    data = (tmp[0]<<24)|(tmp[1]<<16)|(tmp[2]<<8) ;
    return( ((double)data)/65536.0 ) ;
}

/*
 * getPressure returns the pressure in Pascals times 64
 */
double MPL3115A2::getPressure(void)
{
    uint8_t tmp[3] ;
    uint32_t data ;
    uint16_t sample_time ;

    standby() ;
    modeBar() ;
    sample_time = getSampleTime() ;
    activate() ;
    oneShot() ;
    wait_ms(sample_time) ;
    readRegs(MPL_OUT_P_MSB, tmp, 3) ;
    data = ((tmp[0]<<16)|(tmp[1]<<8)|(tmp[2])) >> 6  ;
    return(((double)data) / 100.0 ) ;
} 

/*
 * getTemperature returns the temperature in c-degree times 256
 */
double MPL3115A2::getTemperature(void)
{
    uint8_t tmp[2] ;
    uint16_t data ;
    
    readRegs(MPL_OUT_T_MSB, tmp, 2) ;
    data = (tmp[0]<<8)|(tmp[1]) ;
    return( ((double)data)/256.0  ) ;
}

/*
 * getAltDelta returns delta of alt in meters times 65536
 */
int32_t MPL3115A2::getAltDelta(void)
{
    uint8_t tmp[3] ;
    int32_t data ;
    
    readRegs(MPL_OUT_P_DELTA_MSB, tmp, 3) ;
    data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ;
    return( data ) ;
}

/*
 * getPrsDelta returns delta of pressure in Pascal times 16
 */
int32_t MPL3115A2::getPrsDelta(void)
{
    uint8_t tmp[3] ;
    int32_t data ;
    
    readRegs(MPL_OUT_P_DELTA_MSB, tmp, 3) ;
    data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ;
    return( data ) ;
}

/*
 * getTempDelta returns delta of temperature in c-degree times 16
 */
int16_t MPL3115A2::getTempDelta(void)
{
    uint8_t tmp[2] ;
    int16_t data ;
    
    readRegs(MPL_OUT_T_DELTA_MSB, tmp, 2) ;
    data = (tmp[0]<<8) | (tmp[1]&0xF0) ;
    return( data ) ;
}

uint8_t MPL3115A2::getID(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_WHO_AM_I, tmp, 1) ;
    return( tmp[0] ) ;
}

uint8_t MPL3115A2::getFstatus(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_F_STATUS, tmp, 1) ;
    return(tmp[0]) ;
}

uint8_t MPL3115A2::getFdata(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_F_DATA, tmp, 1) ;
    return(tmp[0]) ;
}

uint8_t MPL3115A2::getFsetup(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_F_SETUP, tmp, 1) ;
    return(tmp[0]) ;
}

void MPL3115A2::setFsetup(uint8_t data)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_F_SETUP ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint8_t MPL3115A2::getTimeDelay(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_TIME_DLY, tmp, 1) ;
    return( tmp[0] ) ;
}

uint8_t MPL3115A2::getSysMod(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_SYSMOD, tmp, 1) ;
    return( tmp[0] ) ;
}

uint8_t MPL3115A2::getIntSource(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_INT_SOURCE, tmp, 1) ;
    return( tmp[0] ) ;
}

uint8_t MPL3115A2::getPtDataConfig(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_PT_DATA_CFG, tmp, 1) ;
    return( tmp[0] ) ;
}

void MPL3115A2::setPtDataConfig(uint8_t data)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_PT_DATA_CFG ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint16_t MPL3115A2::getBarIn(void)
{
    uint8_t tmp[2] ;
    readRegs(MPL_BAR_IN_MSB, tmp, 2) ;
    return( (uint16_t)tmp[0] ) ;
}

void MPL3115A2::setBarIn(uint16_t data)
{
    uint8_t tmp[3] ;
    tmp[0] = MPL_BAR_IN_MSB ;
    tmp[1] = (data >> 8)&0xFF ;
    tmp[2] = data & 0xFF ;
    writeRegs(tmp, 3) ;
}

int16_t MPL3115A2::getP_TGT(void)
{
    uint8_t tmp[2] ;
    int16_t data ;
    readRegs(MPL_P_TGT_MSB, tmp, 2) ;
    data = (tmp[0] << 8) | tmp[1] ;
    return( data ) ;
}

void MPL3115A2::setP_TGT(int16_t data)
{
    uint8_t tmp[3] ;
    tmp[0] = MPL_P_TGT_MSB ;
    tmp[1] = (data >> 8) & 0xFF ;
    tmp[2] = data & 0xFF ;
    writeRegs(tmp, 3) ;
}

int8_t MPL3115A2::getT_TGT(void)
{
    uint8_t tmp[1] ;
    readRegs(MPL_T_TGT, tmp, 1) ;
    return( (int8_t)tmp[0] ) ;
}

void MPL3115A2::setT_TGT(int8_t data)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_PT_DATA_CFG ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint16_t MPL3115A2::getP_WND(void) 
{
    uint8_t tmp[2] ;
    uint16_t data ;
    readRegs(MPL_P_WND_MSB, tmp, 2) ;
    data = (tmp[0]<<8) | tmp[1] ;
    return(data) ;
}

void     MPL3115A2::setP_WND(uint16_t data) 
{
    uint8_t tmp[3] ;
    tmp[0] = MPL_P_WND_MSB ;
    tmp[1] = (data >> 8)&0xFF ;
    tmp[2] = data & 0xFF ;
    writeRegs(tmp, 3) ;
}

uint8_t  MPL3115A2::getT_WND(void) 
{
    uint8_t tmp[1] ;
    readRegs(MPL_T_WND, tmp, 1) ;
    return(tmp[0]) ;
}

void     MPL3115A2::setT_WND(uint8_t data) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_T_WND ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

int32_t  MPL3115A2::getP_MIN(void) 
{
    uint8_t tmp[3] ;
    int32_t data ;
    readRegs(MPL_P_MIN_MSB, tmp, 3) ;
    data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ;
    return( data ) ;
}

void     MPL3115A2::setT_MIN(int32_t data) 
{
    uint8_t tmp[4] ;
    tmp[0] = MPL_P_MIN_MSB ;
    tmp[1] = (data >> 24) & 0xFF ;
    tmp[2] = (data >> 16) & 0xFF ;
    tmp[3] = (data >>  8) & 0xF0 ;
    writeRegs(tmp, 4) ;
}

int32_t  MPL3115A2::getP_MAX(void) 
{
    uint8_t tmp[3] ;
    int32_t data ;
    readRegs(MPL_P_MAX_MSB, tmp, 3) ;
    data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ;
    return( data ) ;
}

void     MPL3115A2::setP_MAX(int32_t data) 
{
    uint8_t tmp[4] ;
    tmp[0] = MPL_P_MAX_MSB ;
    tmp[1] = (data >> 24) & 0xFF ;
    tmp[2] = (data >> 16) & 0xFF ;
    tmp[3] = (data >>  8) & 0xF0 ;
    writeRegs(tmp, 4) ;    
}

int16_t  MPL3115A2::getT_MIN(void) 
{
    uint8_t tmp[2] ;
    uint16_t data ;
    readRegs(MPL_T_MIN_MSB, tmp, 2) ;
    data = (tmp[0]<<8) | tmp[1] ;
    return(data) ;
}

void     MPL3115A2::setT_MIN(int16_t data) 
{
    uint8_t tmp[3] ;
    tmp[0] = MPL_T_MIN_MSB ;
    tmp[1] = (data >> 8) & 0xFF ;
    tmp[2] = data & 0xFF ;
    writeRegs(tmp, 3) ;
}

int16_t  MPL3115A2::getT_MAX(void) 
{
    uint8_t tmp[2] ;
    uint16_t data ;
    readRegs(MPL_T_MAX_MSB, tmp, 2) ;
    data = (tmp[0]<<8) | tmp[1] ;
    return( data ) ;
}

void     MPL3115A2::setT_MAX(int16_t data) 
{
    uint8_t tmp[3] ;
    tmp[0] = MPL_T_MAX_MSB ;
    tmp[1] = (data >> 8) & 0xFF ;
    tmp[2] = data & 0xFF ;
    writeRegs(tmp, 3) ;
}

uint8_t  MPL3115A2::getCTRL_REG1(void) 
{
    uint8_t tmp[1] ;
    readRegs(MPL_CTRL_REG1, tmp, 1) ;
    return( tmp[0] ) ;
}

void     MPL3115A2::setCTRL_REG1(uint8_t data) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG1 ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint8_t  MPL3115A2::getCTRL_REG2(void) 
{
    uint8_t tmp[1] ;
    readRegs(MPL_CTRL_REG2, tmp, 1) ;
    return( tmp[0] ) ;
}

void     MPL3115A2::setCTRL_REG2(uint8_t data) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG2 ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint8_t  MPL3115A2::getCTRL_REG3(void) 
{
    uint8_t tmp[1] ;
    readRegs(MPL_CTRL_REG3, tmp, 1) ;
    return( tmp[0] ) ;
}

void     MPL3115A2::setCTRL_REG3(uint8_t data) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG3 ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint8_t  MPL3115A2::getCTRL_REG4(void) 
{
    uint8_t tmp[1] ;
    readRegs(MPL_CTRL_REG4, tmp, 1) ;
    return( tmp[0] ) ;
}

void     MPL3115A2::setCTRL_REG4(uint8_t data) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG4 ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

uint8_t  MPL3115A2::getCTRL_REG5(void) 
{
    uint8_t tmp[1] ;
    readRegs(MPL_CTRL_REG5, tmp, 1) ;
    return( tmp[0] ) ;
}

void     MPL3115A2::setCTRL_REG5(uint8_t data) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG5 ;
    tmp[1] = data ;
    writeRegs(tmp, 2) ;
}

void MPL3115A2::oneShot(void)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG1 ;
    readRegs(tmp[0], &tmp[1], 1) ;
    tmp[1] &= 0xFD ; /* clear OST */
    writeRegs(tmp, 2) ;
    tmp[1] |= 0x02 ; /* set OST */
    writeRegs(tmp, 2) ;
}

uint16_t MPL3115A2::getSampleTime(void) 
{
    uint8_t tmp[2] ;
    uint16_t sample_time = 6 ;
    tmp[0] = MPL_CTRL_REG1 ;
    readRegs(tmp[0], &tmp[1], 1) ;
    tmp[1] |= 0x02 ;
    writeRegs(tmp, 2) ;
    switch((tmp[1]>>3)&0x07) {
    case 0: sample_time = 6 ; break ;
    case 1: sample_time = 10 ; break ;
    case 2: sample_time = 18 ; break ;
    case 3: sample_time = 34 ; break ;
    case 4: sample_time = 66 ; break ;
    case 5: sample_time = 130 ; break ;
    case 6: sample_time = 258 ; break ;
    case 7: sample_time = 512 ; break ;
    default: sample_time = 6 ; break ;
    }
    return( sample_time ) ;
}

void MPL3115A2::standby(void)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG1 ;
    readRegs(tmp[0], &tmp[1], 1) ;
    tmp[1] &= 0xFE ;
    writeRegs(tmp, 2) ;
}

void MPL3115A2::activate(void)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG1 ;
    readRegs(tmp[0], &tmp[1], 1) ;
    tmp[1] |= 0x01 ;
    writeRegs(tmp, 2) ;
}

void MPL3115A2::modeAlt(void) 
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG1 ;
    readRegs(tmp[0], &tmp[1], 1) ;
    tmp[1] |= 0x80 ;
    writeRegs(tmp, 2) ;
}

void MPL3115A2::modeBar(void)
{
    uint8_t tmp[2] ;
    tmp[0] = MPL_CTRL_REG1 ;
    readRegs(tmp[0], &tmp[1], 1) ;
    tmp[1] &= 0x7F ;
    writeRegs(tmp, 2) ;
}