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) ;
}