CPS-Lab* / MPL3115A2

Fork of MPL3115A2 by MSS

Files at this revision

API Documentation at this revision

Comitter:
Rhyme
Date:
Sun Dec 13 08:57:16 2015 +0000
Child:
1:6fdcf150410e
Commit message:
commit before publishing

Changed in this revision

MPL3115A2.cpp Show annotated file Show diff for this revision Revisions of this file
MPL3115A2.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPL3115A2.cpp	Sun Dec 13 08:57:16 2015 +0000
@@ -0,0 +1,537 @@
+/*
+ * 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
+}
+
+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
+ */
+uint32_t MPL3115A2::getAltitude(void)
+{
+    uint8_t tmp[3] ;
+    uint32_t data ;
+    
+    readRegs(MPL_OUT_P_MSB, tmp, 3) ;
+    data = (tmp[0]<<24)|(tmp[1]<<16)|(tmp[2]<<8) ;
+    return( data ) ;
+}
+
+/*
+ * getPressure returns the pressure in Pascals times 64
+ */
+uint32_t MPL3115A2::getPressure(void)
+{
+    uint8_t tmp[3] ;
+    uint32_t data ;
+    
+    readRegs(MPL_OUT_P_MSB, tmp, 3) ;
+    data = (tmp[0]<<16)|(tmp[1]<<8)|(tmp[2]) ;
+    return( data ) ;
+} 
+
+/*
+ * getTemperature returns the temperature in c-degree times 256
+ */
+uint16_t MPL3115A2::getTemperature(void)
+{
+    uint8_t tmp[2] ;
+    uint16_t data ;
+    
+    readRegs(MPL_OUT_T_MSB, tmp, 2) ;
+    data = (tmp[0]<<8)|(tmp[1]) ;
+    return( data ) ;
+}
+
+/*
+ * 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) ;
+}
+
+uint16_t MPL3115A2::OneShot(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) ;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPL3115A2.h	Sun Dec 13 08:57:16 2015 +0000
@@ -0,0 +1,88 @@
+/*
+ * File description
+ *
+ */
+#ifndef MPL3115A2_H
+#define MPL3115A2_H
+
+#include "mbed.h"
+
+/**
+ * MPL3115A2 I2C Precision Altimeter
+ *
+ */
+
+class MPL3115A2
+{
+public:
+ /**
+  * MPL3115A2
+  *
+  * @param sda SDA pin
+  * @param scl SCL pin
+  * @param addr address of the I2C peripheral
+  */
+MPL3115A2(PinName sda, PinName scl, int addr) ;
+
+~MPL3115A2() ;
+
+/*
+ * some member functions here)
+ */
+uint8_t getStatus(void) ;
+uint32_t getAltitude(void) ; /* x65536 */
+uint32_t getPressure(void) ; /* x64 */
+uint16_t getTemperature(void) ; /* x256 */
+int32_t  getAltDelta(void) ; /* x65536 */
+int32_t  getPrsDelta(void) ; /* x16 */
+int16_t  getTempDelta(void) ; 
+uint8_t  getID(void) ;
+uint8_t  getFstatus(void) ;
+uint8_t  getFdata(void) ;
+uint8_t  getFsetup(void) ;
+void     setFsetup(uint8_t data) ;
+uint8_t  getTimeDelay(void) ;
+uint8_t  getSysMod(void) ;
+uint8_t  getIntSource(void) ;
+uint8_t  getPtDataConfig(void) ;
+void     setPtDataConfig(uint8_t data) ;
+uint16_t getBarIn(void) ;
+void     setBarIn(uint16_t data) ;
+int16_t  getP_TGT(void) ;
+void     setP_TGT(int16_t data) ;
+int8_t   getT_TGT(void) ;
+void     setT_TGT(int8_t data) ;
+uint16_t getP_WND(void) ;
+void     setP_WND(uint16_t data) ;
+uint8_t  getT_WND(void) ;
+void     setT_WND(uint8_t data) ;
+int32_t  getP_MIN(void) ;
+void     setT_MIN(int32_t data) ;
+int32_t  getP_MAX(void) ;
+void     setP_MAX(int32_t data) ;
+int16_t  getT_MIN(void) ;
+void     setT_MIN(int16_t data) ;
+int16_t  getT_MAX(void) ;
+void     setT_MAX(int16_t data) ;
+uint8_t  getCTRL_REG1(void) ;
+void     setCTRL_REG1(uint8_t data) ;
+uint8_t  getCTRL_REG2(void) ;
+void     setCTRL_REG2(uint8_t data) ;
+uint8_t  getCTRL_REG3(void) ;
+void     setCTRL_REG3(uint8_t data) ;
+uint8_t  getCTRL_REG4(void) ;
+void     setCTRL_REG4(uint8_t data) ;
+uint8_t  getCTRL_REG5(void) ;
+void     setCTRL_REG5(uint8_t data) ;
+uint16_t OneShot(void) ;
+void     standby(void) ;
+void     activate(void) ;
+void     modeAlt(void) ;
+void     modeBar(void) ;
+private:
+  I2C m_i2c;
+  int m_addr ;
+  void readRegs(int addr, uint8_t *data, int len) ;
+  void writeRegs(uint8_t *data, int len) ;
+} ;
+#endif /* MPL3115A2_H */