MPL3115A2 driver

Dependents:   lmic_NAmote_GPS_tjm lmic_NAmote_GPS_tjm Senet NAMote scpi_sx127x ... more

Revision:
2:0eb8b0ad292b
Parent:
1:3cd1f21925e8
--- a/mpl3115a2.cpp	Fri May 08 01:32:04 2015 +0000
+++ b/mpl3115a2.cpp	Mon Aug 31 21:37:41 2015 +0000
@@ -13,46 +13,59 @@
 
 void MPL3115A2::init()
 {
-    uint8_t regVal;
-
     //MPL3115Reset( );
-    write(CTRL_REG1, 4);
+    ctrl_reg1.octet = 0;
+    ctrl_reg1.bits.RST = 1;
+    write(CTRL_REG1, /*4*/ ctrl_reg1.octet);
     wait(0.05);
     
     do
     {   // Wait for the RST bit to clear 
-        regVal = read( CTRL_REG1);
-        //printf("ctrl_reg1:%02x\n", regVal);
-    } while( regVal );
+        wait(0.01);
+        ctrl_reg1.octet = read(CTRL_REG1);
+    } while (ctrl_reg1.octet);
    
     write( PT_DATA_CFG_REG, 0x07 ); // Enable data flags 
     write( CTRL_REG3, 0x11 );       // Open drain, active low interrupts 
     write( CTRL_REG4, 0x80 );       // Enable DRDY interrupt 
     write( CTRL_REG5, 0x00 );       // DRDY interrupt routed to INT2 - PTD3 
-    write( CTRL_REG1, 0xA9 );       // Active altitude mode, OSR = 32    
-                                               
-    write( OFF_H_REG, 0xB0 );       // Altitude data offset
+    
+    ctrl_reg1.bits.ALT = 1; // altitude mode
+    ctrl_reg1.bits.OS = 5;  // OSR = 32
+    ctrl_reg1.bits.SBYB = 1; // Active
+    write(CTRL_REG1, ctrl_reg1.octet);       
     
     SetModeActive( );
 }
 
+void MPL3115A2::setOSR(uint8_t osr)
+{
+    ctrl_reg1.bits.OS = osr;
+    write(CTRL_REG1, ctrl_reg1.octet);
+}
+
+uint8_t MPL3115A2::getOSR(void)
+{
+    ctrl_reg1.octet = read(CTRL_REG1);
+    return ctrl_reg1.bits.OS;
+}
+
 bool MPL3115A2::GetModeActive( )
 {
-    return read(CTRL_REG1) & 1;
+    ctrl_reg1.octet = read(CTRL_REG1);
+    return ctrl_reg1.bits.SBYB;
 }
 
 void MPL3115A2::SetModeActive( )
 {
-    uint8_t val = read(CTRL_REG1);
-    val |= 1;   // set SBYB
-    write(CTRL_REG1, val);
+    ctrl_reg1.bits.SBYB = 1;
+    write(CTRL_REG1, ctrl_reg1.octet); 
 }
 
 void MPL3115A2::SetModeStandby( )
 {
-    uint8_t val = read(CTRL_REG1);
-    val &= ~1;   // clear SBYB
-    write(CTRL_REG1, val);
+    ctrl_reg1.bits.SBYB = 0;
+    write(CTRL_REG1, ctrl_reg1.octet);     
 }
 
 void MPL3115A2::write(uint8_t a, uint8_t d)
@@ -85,6 +98,29 @@
     return cmd[0];
 }
 
+float MPL3115A2::ReadBarometer(void)
+{
+    uint32_t pasc;
+    volatile uint8_t stat;
+
+    SetModeBarometer();
+    ToggleOneShot( );
+       
+    stat = read(STATUS_REG);       
+    while( (stat & 0x04) != 0x04 ) {
+        wait(0.01);   
+        stat = read(STATUS_REG);
+    }
+    
+    pasc = read(OUT_P_MSB_REG);
+    pasc <<= 8;
+    pasc |= read(OUT_P_CSB_REG);
+    pasc <<= 8;
+    pasc |= read(OUT_P_LSB_REG);
+    
+    return pasc / 64.0;
+}
+
 float MPL3115A2::ReadAltitude( void )
 {
     uint8_t counter = 0;
@@ -142,30 +178,33 @@
 
 void MPL3115A2::SetModeAltimeter( void )
 {
-    uint8_t val;
-
     SetModeStandby( );
 
-    val = read( CTRL_REG1);
-    val |= 0x80;                //Set ALT bit
-    write( CTRL_REG1, val );
+    ctrl_reg1.bits.ALT = 1;
+    write(CTRL_REG1, ctrl_reg1.octet); 
+    
+    SetModeActive( );
+}
 
-    SetModeActive( );
+void MPL3115A2::SetModeBarometer(void)
+{
+    SetModeStandby( );
+
+    ctrl_reg1.bits.ALT = 0;
+    write(CTRL_REG1, ctrl_reg1.octet); 
+    
+    SetModeActive( );    
 }
 
 void MPL3115A2::ToggleOneShot( void )
 {
-    uint8_t val;
-
     SetModeStandby( );
-
-    val = read( CTRL_REG1);
-    val &= ~(0x02);         //Clear OST bit
-    write( CTRL_REG1, val );
-
-    val = read( CTRL_REG1);
-    val |= 0x02;            //Set OST bit
-    write( CTRL_REG1, val );
+    
+    ctrl_reg1.bits.OST = 0;
+    write(CTRL_REG1, ctrl_reg1.octet); 
+    
+    ctrl_reg1.bits.OST = 1;
+    write(CTRL_REG1, ctrl_reg1.octet); 
 
     SetModeActive( );
 }