MPL3115A2 driver

Dependents:   lmic_NAmote_GPS_tjm lmic_NAmote_GPS_tjm Senet NAMote scpi_sx127x ... more

Committer:
dudmuck
Date:
Wed Mar 18 01:00:53 2015 +0000
Revision:
0:6bba2efea51e
Child:
1:3cd1f21925e8
MPL3115A2 driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:6bba2efea51e 1 #include "mpl3115a2.h"
dudmuck 0:6bba2efea51e 2
dudmuck 0:6bba2efea51e 3 #define MPL3115A_I2C_ADDRESS 0xc0 //0x60
dudmuck 0:6bba2efea51e 4
dudmuck 0:6bba2efea51e 5
dudmuck 0:6bba2efea51e 6 MPL3115A2::MPL3115A2(I2C& r) : m_i2c(r)
dudmuck 0:6bba2efea51e 7 {
dudmuck 0:6bba2efea51e 8 }
dudmuck 0:6bba2efea51e 9
dudmuck 0:6bba2efea51e 10 MPL3115A2::~MPL3115A2()
dudmuck 0:6bba2efea51e 11 {
dudmuck 0:6bba2efea51e 12 }
dudmuck 0:6bba2efea51e 13
dudmuck 0:6bba2efea51e 14 void MPL3115A2::init()
dudmuck 0:6bba2efea51e 15 {
dudmuck 0:6bba2efea51e 16 uint8_t regVal;
dudmuck 0:6bba2efea51e 17
dudmuck 0:6bba2efea51e 18 //MPL3115Reset( );
dudmuck 0:6bba2efea51e 19 write(CTRL_REG1, 4);
dudmuck 0:6bba2efea51e 20 wait(0.05);
dudmuck 0:6bba2efea51e 21
dudmuck 0:6bba2efea51e 22 do
dudmuck 0:6bba2efea51e 23 { // Wait for the RST bit to clear
dudmuck 0:6bba2efea51e 24 regVal = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 25 //printf("ctrl_reg1:%02x\n", regVal);
dudmuck 0:6bba2efea51e 26 } while( regVal );
dudmuck 0:6bba2efea51e 27
dudmuck 0:6bba2efea51e 28 write( PT_DATA_CFG_REG, 0x07 ); // Enable data flags
dudmuck 0:6bba2efea51e 29 write( CTRL_REG3, 0x11 ); // Open drain, active low interrupts
dudmuck 0:6bba2efea51e 30 write( CTRL_REG4, 0x80 ); // Enable DRDY interrupt
dudmuck 0:6bba2efea51e 31 write( CTRL_REG5, 0x00 ); // DRDY interrupt routed to INT2 - PTD3
dudmuck 0:6bba2efea51e 32 write( CTRL_REG1, 0xA9 ); // Active altitude mode, OSR = 32
dudmuck 0:6bba2efea51e 33
dudmuck 0:6bba2efea51e 34 write( OFF_H_REG, 0xB0 ); // Altitude data offset
dudmuck 0:6bba2efea51e 35
dudmuck 0:6bba2efea51e 36 SetModeActive( );
dudmuck 0:6bba2efea51e 37 }
dudmuck 0:6bba2efea51e 38
dudmuck 0:6bba2efea51e 39 void MPL3115A2::SetModeActive( )
dudmuck 0:6bba2efea51e 40 {
dudmuck 0:6bba2efea51e 41 uint8_t val = read(CTRL_REG1);
dudmuck 0:6bba2efea51e 42 val |= 1; // set SBYB
dudmuck 0:6bba2efea51e 43 write(CTRL_REG1, val);
dudmuck 0:6bba2efea51e 44 }
dudmuck 0:6bba2efea51e 45
dudmuck 0:6bba2efea51e 46 void MPL3115A2::SetModeStandby( )
dudmuck 0:6bba2efea51e 47 {
dudmuck 0:6bba2efea51e 48 uint8_t val = read(CTRL_REG1);
dudmuck 0:6bba2efea51e 49 val &= ~1; // clear SBYB
dudmuck 0:6bba2efea51e 50 write(CTRL_REG1, val);
dudmuck 0:6bba2efea51e 51 }
dudmuck 0:6bba2efea51e 52
dudmuck 0:6bba2efea51e 53 void MPL3115A2::write(uint8_t a, uint8_t d)
dudmuck 0:6bba2efea51e 54 {
dudmuck 0:6bba2efea51e 55 char cmd[2];
dudmuck 0:6bba2efea51e 56
dudmuck 0:6bba2efea51e 57 cmd[0] = a;
dudmuck 0:6bba2efea51e 58 cmd[1] = d;
dudmuck 0:6bba2efea51e 59
dudmuck 0:6bba2efea51e 60 if (m_i2c.write(MPL3115A_I2C_ADDRESS, cmd, 2))
dudmuck 0:6bba2efea51e 61 printf("write-fail %02x %02x\n", cmd[0], cmd[1]);
dudmuck 0:6bba2efea51e 62 }
dudmuck 0:6bba2efea51e 63
dudmuck 0:6bba2efea51e 64 uint8_t MPL3115A2::read(uint8_t a)
dudmuck 0:6bba2efea51e 65 {
dudmuck 0:6bba2efea51e 66 char cmd[2];
dudmuck 0:6bba2efea51e 67
dudmuck 0:6bba2efea51e 68 cmd[0] = a;
dudmuck 0:6bba2efea51e 69 if (m_i2c.write(MPL3115A_I2C_ADDRESS, cmd, 1, true))
dudmuck 0:6bba2efea51e 70 printf("write-fail %02x\n", cmd[0]);
dudmuck 0:6bba2efea51e 71 if (m_i2c.read(MPL3115A_I2C_ADDRESS, cmd, 1))
dudmuck 0:6bba2efea51e 72 printf("read-fail\n");
dudmuck 0:6bba2efea51e 73 //printf("MPL3115::try_read: %x\n", cmd[0]);
dudmuck 0:6bba2efea51e 74 return cmd[0];
dudmuck 0:6bba2efea51e 75 }
dudmuck 0:6bba2efea51e 76
dudmuck 0:6bba2efea51e 77 /*void MPL3115A2::try_read()
dudmuck 0:6bba2efea51e 78 {
dudmuck 0:6bba2efea51e 79 char cmd[2];
dudmuck 0:6bba2efea51e 80
dudmuck 0:6bba2efea51e 81 cmd[0] = MPL3115_ID;
dudmuck 0:6bba2efea51e 82 if (m_i2c.write(MPL3115A_I2C_ADDRESS, cmd, 1, true))
dudmuck 0:6bba2efea51e 83 printf("write-fail try_read\n");
dudmuck 0:6bba2efea51e 84 if (m_i2c.read(MPL3115A_I2C_ADDRESS, cmd, 1))
dudmuck 0:6bba2efea51e 85 printf("read-fail\n");
dudmuck 0:6bba2efea51e 86 printf("MPL3115::try_read: %x\n", cmd[0]);
dudmuck 0:6bba2efea51e 87 }*/
dudmuck 0:6bba2efea51e 88
dudmuck 0:6bba2efea51e 89 float MPL3115A2::ReadAltitude( void )
dudmuck 0:6bba2efea51e 90 {
dudmuck 0:6bba2efea51e 91 uint8_t counter = 0;
dudmuck 0:6bba2efea51e 92 uint8_t val = 0;
dudmuck 0:6bba2efea51e 93 uint8_t msb = 0, csb = 0, lsb = 0;
dudmuck 0:6bba2efea51e 94 float decimal = 0;
dudmuck 0:6bba2efea51e 95
dudmuck 0:6bba2efea51e 96 /*if( MPL3115Initialized == false )
dudmuck 0:6bba2efea51e 97 {
dudmuck 0:6bba2efea51e 98 return 0;
dudmuck 0:6bba2efea51e 99 }*/
dudmuck 0:6bba2efea51e 100
dudmuck 0:6bba2efea51e 101 SetModeAltimeter( );
dudmuck 0:6bba2efea51e 102 ToggleOneShot( );
dudmuck 0:6bba2efea51e 103
dudmuck 0:6bba2efea51e 104 while( ( val & 0x04 ) != 0x04 )
dudmuck 0:6bba2efea51e 105 {
dudmuck 0:6bba2efea51e 106 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 107 wait(0.01); //DelayMs( 10 );
dudmuck 0:6bba2efea51e 108 counter++;
dudmuck 0:6bba2efea51e 109
dudmuck 0:6bba2efea51e 110 if( counter > 20 )
dudmuck 0:6bba2efea51e 111 {
dudmuck 0:6bba2efea51e 112 //MPL3115Initialized = false;
dudmuck 0:6bba2efea51e 113 init( );
dudmuck 0:6bba2efea51e 114 SetModeAltimeter( );
dudmuck 0:6bba2efea51e 115 ToggleOneShot( );
dudmuck 0:6bba2efea51e 116 counter = 0;
dudmuck 0:6bba2efea51e 117 while( ( val & 0x04 ) != 0x04 )
dudmuck 0:6bba2efea51e 118 {
dudmuck 0:6bba2efea51e 119 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 120 wait(0.01); //DelayMs( 10 );
dudmuck 0:6bba2efea51e 121 counter++;
dudmuck 0:6bba2efea51e 122 if( counter > 20 )
dudmuck 0:6bba2efea51e 123 {
dudmuck 0:6bba2efea51e 124 return( 0 ); //Error out after max of 512ms for a read
dudmuck 0:6bba2efea51e 125 }
dudmuck 0:6bba2efea51e 126 }
dudmuck 0:6bba2efea51e 127 }
dudmuck 0:6bba2efea51e 128 }
dudmuck 0:6bba2efea51e 129
dudmuck 0:6bba2efea51e 130 msb = read( OUT_P_MSB_REG); // High byte of integer part of altitude,
dudmuck 0:6bba2efea51e 131 csb = read( OUT_P_CSB_REG); // Low byte of integer part of altitude
dudmuck 0:6bba2efea51e 132 lsb = read( OUT_P_LSB_REG); // Decimal part of altitude in bits 7-4
dudmuck 0:6bba2efea51e 133
dudmuck 0:6bba2efea51e 134 decimal = ( ( float )( lsb >> 4 ) ) / 16.0;
dudmuck 0:6bba2efea51e 135 //Altitude = ( float )( ( msb << 8 ) | csb ) + decimal;
dudmuck 0:6bba2efea51e 136 Altitude = ( float )( ( int16_t )( ( msb << 8 ) | csb ) ) + decimal;
dudmuck 0:6bba2efea51e 137
dudmuck 0:6bba2efea51e 138 return( Altitude );
dudmuck 0:6bba2efea51e 139 }
dudmuck 0:6bba2efea51e 140
dudmuck 0:6bba2efea51e 141 void MPL3115A2::SetModeAltimeter( void )
dudmuck 0:6bba2efea51e 142 {
dudmuck 0:6bba2efea51e 143 uint8_t val;
dudmuck 0:6bba2efea51e 144
dudmuck 0:6bba2efea51e 145 SetModeStandby( );
dudmuck 0:6bba2efea51e 146
dudmuck 0:6bba2efea51e 147 val = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 148 val |= 0x80; //Set ALT bit
dudmuck 0:6bba2efea51e 149 write( CTRL_REG1, val );
dudmuck 0:6bba2efea51e 150
dudmuck 0:6bba2efea51e 151 SetModeActive( );
dudmuck 0:6bba2efea51e 152 }
dudmuck 0:6bba2efea51e 153
dudmuck 0:6bba2efea51e 154 void MPL3115A2::ToggleOneShot( void )
dudmuck 0:6bba2efea51e 155 {
dudmuck 0:6bba2efea51e 156 uint8_t val;
dudmuck 0:6bba2efea51e 157
dudmuck 0:6bba2efea51e 158 SetModeStandby( );
dudmuck 0:6bba2efea51e 159
dudmuck 0:6bba2efea51e 160 val = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 161 val &= ~(0x02); //Clear OST bit
dudmuck 0:6bba2efea51e 162 write( CTRL_REG1, val );
dudmuck 0:6bba2efea51e 163
dudmuck 0:6bba2efea51e 164 val = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 165 val |= 0x02; //Set OST bit
dudmuck 0:6bba2efea51e 166 write( CTRL_REG1, val );
dudmuck 0:6bba2efea51e 167
dudmuck 0:6bba2efea51e 168 SetModeActive( );
dudmuck 0:6bba2efea51e 169 }
dudmuck 0:6bba2efea51e 170
dudmuck 0:6bba2efea51e 171 float MPL3115A2::ReadTemperature( void )
dudmuck 0:6bba2efea51e 172 {
dudmuck 0:6bba2efea51e 173 uint8_t counter = 0;
dudmuck 0:6bba2efea51e 174 bool negSign = false;
dudmuck 0:6bba2efea51e 175 uint8_t val = 0;
dudmuck 0:6bba2efea51e 176 uint8_t msb = 0, lsb = 0;
dudmuck 0:6bba2efea51e 177
dudmuck 0:6bba2efea51e 178 /*if( MPL3115Initialized == false )
dudmuck 0:6bba2efea51e 179 {
dudmuck 0:6bba2efea51e 180 return 0;
dudmuck 0:6bba2efea51e 181 }*/
dudmuck 0:6bba2efea51e 182
dudmuck 0:6bba2efea51e 183 ToggleOneShot( );
dudmuck 0:6bba2efea51e 184
dudmuck 0:6bba2efea51e 185 while( ( val & 0x02 ) != 0x02 )
dudmuck 0:6bba2efea51e 186 {
dudmuck 0:6bba2efea51e 187 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 188 wait(0.01);
dudmuck 0:6bba2efea51e 189 counter++;
dudmuck 0:6bba2efea51e 190
dudmuck 0:6bba2efea51e 191 if( counter > 20 )
dudmuck 0:6bba2efea51e 192 {
dudmuck 0:6bba2efea51e 193 //MPL3115Initialized = false;
dudmuck 0:6bba2efea51e 194 init( );
dudmuck 0:6bba2efea51e 195 ToggleOneShot( );
dudmuck 0:6bba2efea51e 196 counter = 0;
dudmuck 0:6bba2efea51e 197 while( ( val & 0x02 ) != 0x02 )
dudmuck 0:6bba2efea51e 198 {
dudmuck 0:6bba2efea51e 199 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 200 wait(0.01);
dudmuck 0:6bba2efea51e 201 counter++;
dudmuck 0:6bba2efea51e 202
dudmuck 0:6bba2efea51e 203 if( counter > 20 )
dudmuck 0:6bba2efea51e 204 {
dudmuck 0:6bba2efea51e 205 return( 0 ); //Error out after max of 512ms for a read
dudmuck 0:6bba2efea51e 206 }
dudmuck 0:6bba2efea51e 207 }
dudmuck 0:6bba2efea51e 208
dudmuck 0:6bba2efea51e 209 }
dudmuck 0:6bba2efea51e 210 }
dudmuck 0:6bba2efea51e 211
dudmuck 0:6bba2efea51e 212 msb = read( OUT_T_MSB_REG); // Integer part of temperature
dudmuck 0:6bba2efea51e 213 lsb = read( OUT_T_LSB_REG); // Decimal part of temperature in bits 7-4
dudmuck 0:6bba2efea51e 214
dudmuck 0:6bba2efea51e 215 if( msb > 0x7F )
dudmuck 0:6bba2efea51e 216 {
dudmuck 0:6bba2efea51e 217 val = ~( ( msb << 8 ) + lsb ) + 1; //2?s complement
dudmuck 0:6bba2efea51e 218 msb = val >> 8;
dudmuck 0:6bba2efea51e 219 lsb = val & 0x00F0;
dudmuck 0:6bba2efea51e 220 negSign = true;
dudmuck 0:6bba2efea51e 221 }
dudmuck 0:6bba2efea51e 222
dudmuck 0:6bba2efea51e 223 if( negSign == true )
dudmuck 0:6bba2efea51e 224 {
dudmuck 0:6bba2efea51e 225 Temperature = 0 - ( msb + ( float )( ( lsb >> 4 ) / 16.0 ) );
dudmuck 0:6bba2efea51e 226 }
dudmuck 0:6bba2efea51e 227 else
dudmuck 0:6bba2efea51e 228 {
dudmuck 0:6bba2efea51e 229 Temperature = msb + ( float )( ( lsb >> 4 ) / 16.0 );
dudmuck 0:6bba2efea51e 230 }
dudmuck 0:6bba2efea51e 231
dudmuck 0:6bba2efea51e 232 ToggleOneShot( );
dudmuck 0:6bba2efea51e 233
dudmuck 0:6bba2efea51e 234 return( Temperature );
dudmuck 0:6bba2efea51e 235 }
dudmuck 0:6bba2efea51e 236
dudmuck 0:6bba2efea51e 237