Llibrary for the WiGo MPL3115A2, I2C Precision Altimeter sensor.

Dependents:   KL25Z_Batt_Test WIGO_MPL3115A2 Multi-Sensor SPACEmk2 ... more

30/05/2013 Added and tested the data acquisition using Interrupt. Added code for Altimeter trigger Interrupt but not yet tested.

Very basic library. Under development. Need to add in order: 1. IRQ configuration. 2. FIFO mode configuration.

Revision:
9:75a5960adf5c
Parent:
8:89ed6aeb5dbb
Child:
10:82ac06669316
diff -r 89ed6aeb5dbb -r 75a5960adf5c MPL3115A2.cpp
--- a/MPL3115A2.cpp	Sun Sep 22 07:04:14 2013 +0000
+++ b/MPL3115A2.cpp	Sun Sep 22 11:17:28 2013 +0000
@@ -12,6 +12,15 @@
 #define REG_PT_DATA_CFG     0x13
 #define REG_P_TGT_MSB       0x16
 #define REG_P_WND_MSB       0x19
+#define REG_OFF_P           0x2b
+#define REG_OFF_T           0x2c
+#define REG_OFF_H           0x2d
+#define REG_PRES_MIN_MSB    0x1c
+#define REG_ALTI_MIN_MSB    0x1c
+#define REG_TEMP_MIN_MSB    0x1f
+#define REG_PRES_MAX_MSB    0x21
+#define REG_ALTI_MAX_MSB    0x21
+#define REG_TEMP_MAX_MSB    0x24
 
 #define UINT14_MAX        16383
 
@@ -40,6 +49,8 @@
 InterruptIn MPL3115A2_Int2( PTA12);      // INT2
 
 MPL3115A2::MPL3115A2(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
+    unsigned char data[6];
+    
     MPL3115A2_mode = BAROMETRIC_MODE;
     MPL3115A2_oversampling = OVERSAMPLE_RATIO_1;
     //
@@ -49,6 +60,10 @@
     MPL3115A2_Int2.fall( NULL);
     
     Reset();
+    
+    data[0]=REG_PRES_MIN_MSB;
+    data[1]=0;data[2]=0;data[3]=0;data[4]=0;data[5]=0;
+    writeRegs( &data[0], 6);
 }
 
 void MPL3115A2::Reset( void)
@@ -298,20 +313,50 @@
 {
     if ( isDataAvailable() & PTDR_STATUS) {
         if ( MPL3115A2_mode == ALTIMETER_MODE) {
-            f[0] = getAltimeter();
+            f[0] = getAltimeter( REG_ALTIMETER_MSB);
         } else {
-            f[0] = getPressure();
+            f[0] = getPressure( REG_PRESSURE_MSB);
         }
         
-        f[1] = getTemperature();
+        f[1] = getTemperature( REG_TEMP_MSB);
         //
         return 1;
     } else
         return 0;
 }
 
+void MPL3115A2::getAllMaximumData( float *f)
+{
+    if ( MPL3115A2_mode == ALTIMETER_MODE) {
+        f[0] = getAltimeter( REG_ALTI_MAX_MSB);
+    } else {
+        f[0] = getPressure( REG_PRES_MAX_MSB);
+    }
+    
+    f[1] = getTemperature( REG_TEMP_MAX_MSB);
+}
+
+void MPL3115A2::getAllMinimumData( float *f)
+{
+    if ( MPL3115A2_mode == ALTIMETER_MODE) {
+        f[0] = getAltimeter( REG_ALTI_MIN_MSB);
+    } else {
+        f[0] = getPressure( REG_PRES_MIN_MSB);
+    }
+    
+    f[1] = getTemperature( REG_TEMP_MIN_MSB);
+}
+
 float MPL3115A2::getAltimeter( void)
 {
+    float a;
+    
+    a = getAltimeter( REG_ALTIMETER_MSB);
+    return a;
+}
+
+float MPL3115A2::getAltimeter( unsigned char reg)
+{
     unsigned char dt[3];
     unsigned short altm;
     float faltm;
@@ -321,7 +366,7 @@
     * dt[1] = Bits 4-11 of 20-bit real-time Altitude sample. (b7-b0)
     * dt[2] = Bits 0-3 of 20-bit real-time Altitude sample (b7-b4)
     */
-    readRegs( REG_ALTIMETER_MSB, &dt[0], 3);
+    readRegs( reg, &dt[0], 3);
     altm = (dt[0]<<8) | dt[1];
     //
     if ( dt[0] > 0x7F) {
@@ -337,6 +382,14 @@
 
 float MPL3115A2::getPressure( void)
 {
+    float a;
+    
+    a = getPressure( REG_PRESSURE_MSB);
+    return a;
+}
+
+float MPL3115A2::getPressure( unsigned char reg)
+{
     unsigned char dt[3];
     unsigned int prs;
     float fprs;
@@ -346,7 +399,7 @@
     * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0)
     * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4)
     */
-    readRegs( REG_PRESSURE_MSB, &dt[0], 3);
+    readRegs( reg, &dt[0], 3);
     prs = (dt[0]<<10) | (dt[1]<<2) | (dt[2]>>6);
     //
     fprs = (float)prs * 1.0f;
@@ -359,8 +412,15 @@
     return fprs;
 }
 
+float MPL3115A2::getTemperature( void)
+{
+    float a;
+    
+    a = getTemperature( REG_TEMP_MSB);
+    return a;
+}
 
-float MPL3115A2::getTemperature( void)
+float MPL3115A2::getTemperature( unsigned char reg)
 {
     unsigned char dt[2];
     unsigned short temp;
@@ -370,7 +430,7 @@
     * dt[0] = Bits 4-11 of 16-bit real-time temperature sample. (b7-b0)
     * dt[1] = Bits 0-3 of 16-bit real-time temperature sample. (b7-b4)
     */
-    readRegs( REG_TEMP_MSB, &dt[0], 2);
+    readRegs( reg, &dt[0], 2);
     temp = dt[0];
     //
     if ( dt[0] > 0x7F) {
@@ -385,6 +445,7 @@
 
 }
 
+
 unsigned int MPL3115A2::getAllDataRaw( unsigned char *dt)
 {
     // Check for Press/Alti and Temp value ready
@@ -456,7 +517,7 @@
 
 void MPL3115A2::SetPressureOffset( char offset)
 {
-    unsigned char data [2] = {0x2b, offset};
+    unsigned char data [2] = {REG_OFF_P, offset};
 
     Standby();
     writeRegs(data,2);
@@ -466,7 +527,7 @@
 
 void MPL3115A2::SetTemperatureOffset( char offset)
 {
-    unsigned char data [2] = {0x2c, offset};
+    unsigned char data [2] = {REG_OFF_T, offset};
 
     Standby();
     writeRegs(data,2);
@@ -476,7 +537,7 @@
 
 void MPL3115A2::SetAltitudeOffset( char offset)
 {
-    unsigned char data [2] = {0x2d, offset};
+    unsigned char data [2] = {REG_OFF_H, offset};
 
     Standby();
     writeRegs(data,2);