MPL3115A2 driver

Dependents:   lmic_NAmote_GPS_tjm lmic_NAmote_GPS_tjm Senet NAMote scpi_sx127x ... more

Committer:
dudmuck
Date:
Fri May 08 01:32:04 2015 +0000
Revision:
1:3cd1f21925e8
Parent:
0:6bba2efea51e
Child:
2:0eb8b0ad292b
set INT pin to open-drain

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 1:3cd1f21925e8 5 MPL3115A2::MPL3115A2(I2C& r, DigitalIn& int_pin) : m_i2c(r), m_int_pin(int_pin)
dudmuck 0:6bba2efea51e 6 {
dudmuck 1:3cd1f21925e8 7 write(CTRL_REG3, 0x10); // PP_OD1: INT1 to open-drain
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 1:3cd1f21925e8 39 bool MPL3115A2::GetModeActive( )
dudmuck 1:3cd1f21925e8 40 {
dudmuck 1:3cd1f21925e8 41 return read(CTRL_REG1) & 1;
dudmuck 1:3cd1f21925e8 42 }
dudmuck 1:3cd1f21925e8 43
dudmuck 0:6bba2efea51e 44 void MPL3115A2::SetModeActive( )
dudmuck 0:6bba2efea51e 45 {
dudmuck 0:6bba2efea51e 46 uint8_t val = read(CTRL_REG1);
dudmuck 0:6bba2efea51e 47 val |= 1; // set SBYB
dudmuck 0:6bba2efea51e 48 write(CTRL_REG1, val);
dudmuck 0:6bba2efea51e 49 }
dudmuck 0:6bba2efea51e 50
dudmuck 0:6bba2efea51e 51 void MPL3115A2::SetModeStandby( )
dudmuck 0:6bba2efea51e 52 {
dudmuck 0:6bba2efea51e 53 uint8_t val = read(CTRL_REG1);
dudmuck 0:6bba2efea51e 54 val &= ~1; // clear SBYB
dudmuck 0:6bba2efea51e 55 write(CTRL_REG1, val);
dudmuck 0:6bba2efea51e 56 }
dudmuck 0:6bba2efea51e 57
dudmuck 0:6bba2efea51e 58 void MPL3115A2::write(uint8_t a, uint8_t d)
dudmuck 0:6bba2efea51e 59 {
dudmuck 0:6bba2efea51e 60 char cmd[2];
dudmuck 0:6bba2efea51e 61
dudmuck 0:6bba2efea51e 62 cmd[0] = a;
dudmuck 0:6bba2efea51e 63 cmd[1] = d;
dudmuck 0:6bba2efea51e 64
dudmuck 0:6bba2efea51e 65 if (m_i2c.write(MPL3115A_I2C_ADDRESS, cmd, 2))
dudmuck 1:3cd1f21925e8 66 printf("MPL write-fail %02x %02x\n", cmd[0], cmd[1]);
dudmuck 1:3cd1f21925e8 67
dudmuck 1:3cd1f21925e8 68 if (a == CTRL_REG4)
dudmuck 1:3cd1f21925e8 69 ctrl_reg4 = d;
dudmuck 0:6bba2efea51e 70 }
dudmuck 0:6bba2efea51e 71
dudmuck 0:6bba2efea51e 72 uint8_t MPL3115A2::read(uint8_t a)
dudmuck 0:6bba2efea51e 73 {
dudmuck 0:6bba2efea51e 74 char cmd[2];
dudmuck 0:6bba2efea51e 75
dudmuck 0:6bba2efea51e 76 cmd[0] = a;
dudmuck 0:6bba2efea51e 77 if (m_i2c.write(MPL3115A_I2C_ADDRESS, cmd, 1, true))
dudmuck 1:3cd1f21925e8 78 printf("MPL write-fail %02x\n", cmd[0]);
dudmuck 0:6bba2efea51e 79 if (m_i2c.read(MPL3115A_I2C_ADDRESS, cmd, 1))
dudmuck 1:3cd1f21925e8 80 printf("MPL read-fail\n");
dudmuck 1:3cd1f21925e8 81
dudmuck 1:3cd1f21925e8 82 if (a == CTRL_REG4)
dudmuck 1:3cd1f21925e8 83 ctrl_reg4 = cmd[0];
dudmuck 1:3cd1f21925e8 84
dudmuck 0:6bba2efea51e 85 return cmd[0];
dudmuck 0:6bba2efea51e 86 }
dudmuck 0:6bba2efea51e 87
dudmuck 0:6bba2efea51e 88 float MPL3115A2::ReadAltitude( void )
dudmuck 0:6bba2efea51e 89 {
dudmuck 0:6bba2efea51e 90 uint8_t counter = 0;
dudmuck 0:6bba2efea51e 91 uint8_t val = 0;
dudmuck 0:6bba2efea51e 92 uint8_t msb = 0, csb = 0, lsb = 0;
dudmuck 0:6bba2efea51e 93 float decimal = 0;
dudmuck 0:6bba2efea51e 94
dudmuck 0:6bba2efea51e 95 /*if( MPL3115Initialized == false )
dudmuck 0:6bba2efea51e 96 {
dudmuck 0:6bba2efea51e 97 return 0;
dudmuck 0:6bba2efea51e 98 }*/
dudmuck 0:6bba2efea51e 99
dudmuck 0:6bba2efea51e 100 SetModeAltimeter( );
dudmuck 0:6bba2efea51e 101 ToggleOneShot( );
dudmuck 0:6bba2efea51e 102
dudmuck 0:6bba2efea51e 103 while( ( val & 0x04 ) != 0x04 )
dudmuck 0:6bba2efea51e 104 {
dudmuck 0:6bba2efea51e 105 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 106 wait(0.01); //DelayMs( 10 );
dudmuck 0:6bba2efea51e 107 counter++;
dudmuck 0:6bba2efea51e 108
dudmuck 0:6bba2efea51e 109 if( counter > 20 )
dudmuck 0:6bba2efea51e 110 {
dudmuck 0:6bba2efea51e 111 //MPL3115Initialized = false;
dudmuck 0:6bba2efea51e 112 init( );
dudmuck 0:6bba2efea51e 113 SetModeAltimeter( );
dudmuck 0:6bba2efea51e 114 ToggleOneShot( );
dudmuck 0:6bba2efea51e 115 counter = 0;
dudmuck 0:6bba2efea51e 116 while( ( val & 0x04 ) != 0x04 )
dudmuck 0:6bba2efea51e 117 {
dudmuck 0:6bba2efea51e 118 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 119 wait(0.01); //DelayMs( 10 );
dudmuck 0:6bba2efea51e 120 counter++;
dudmuck 0:6bba2efea51e 121 if( counter > 20 )
dudmuck 0:6bba2efea51e 122 {
dudmuck 1:3cd1f21925e8 123 write( CTRL_REG4, 0x00 );
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 1:3cd1f21925e8 137
dudmuck 1:3cd1f21925e8 138 write( CTRL_REG4, 0x00 );
dudmuck 0:6bba2efea51e 139
dudmuck 0:6bba2efea51e 140 return( Altitude );
dudmuck 0:6bba2efea51e 141 }
dudmuck 0:6bba2efea51e 142
dudmuck 0:6bba2efea51e 143 void MPL3115A2::SetModeAltimeter( void )
dudmuck 0:6bba2efea51e 144 {
dudmuck 0:6bba2efea51e 145 uint8_t val;
dudmuck 0:6bba2efea51e 146
dudmuck 0:6bba2efea51e 147 SetModeStandby( );
dudmuck 0:6bba2efea51e 148
dudmuck 0:6bba2efea51e 149 val = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 150 val |= 0x80; //Set ALT bit
dudmuck 0:6bba2efea51e 151 write( CTRL_REG1, val );
dudmuck 0:6bba2efea51e 152
dudmuck 0:6bba2efea51e 153 SetModeActive( );
dudmuck 0:6bba2efea51e 154 }
dudmuck 0:6bba2efea51e 155
dudmuck 0:6bba2efea51e 156 void MPL3115A2::ToggleOneShot( void )
dudmuck 0:6bba2efea51e 157 {
dudmuck 0:6bba2efea51e 158 uint8_t val;
dudmuck 0:6bba2efea51e 159
dudmuck 0:6bba2efea51e 160 SetModeStandby( );
dudmuck 0:6bba2efea51e 161
dudmuck 0:6bba2efea51e 162 val = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 163 val &= ~(0x02); //Clear OST bit
dudmuck 0:6bba2efea51e 164 write( CTRL_REG1, val );
dudmuck 0:6bba2efea51e 165
dudmuck 0:6bba2efea51e 166 val = read( CTRL_REG1);
dudmuck 0:6bba2efea51e 167 val |= 0x02; //Set OST bit
dudmuck 0:6bba2efea51e 168 write( CTRL_REG1, val );
dudmuck 0:6bba2efea51e 169
dudmuck 0:6bba2efea51e 170 SetModeActive( );
dudmuck 0:6bba2efea51e 171 }
dudmuck 0:6bba2efea51e 172
dudmuck 0:6bba2efea51e 173 float MPL3115A2::ReadTemperature( void )
dudmuck 0:6bba2efea51e 174 {
dudmuck 0:6bba2efea51e 175 uint8_t counter = 0;
dudmuck 0:6bba2efea51e 176 bool negSign = false;
dudmuck 0:6bba2efea51e 177 uint8_t val = 0;
dudmuck 0:6bba2efea51e 178 uint8_t msb = 0, lsb = 0;
dudmuck 0:6bba2efea51e 179
dudmuck 0:6bba2efea51e 180 /*if( MPL3115Initialized == false )
dudmuck 0:6bba2efea51e 181 {
dudmuck 0:6bba2efea51e 182 return 0;
dudmuck 0:6bba2efea51e 183 }*/
dudmuck 0:6bba2efea51e 184
dudmuck 0:6bba2efea51e 185 ToggleOneShot( );
dudmuck 0:6bba2efea51e 186
dudmuck 0:6bba2efea51e 187 while( ( val & 0x02 ) != 0x02 )
dudmuck 0:6bba2efea51e 188 {
dudmuck 0:6bba2efea51e 189 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 190 wait(0.01);
dudmuck 0:6bba2efea51e 191 counter++;
dudmuck 0:6bba2efea51e 192
dudmuck 0:6bba2efea51e 193 if( counter > 20 )
dudmuck 0:6bba2efea51e 194 {
dudmuck 0:6bba2efea51e 195 //MPL3115Initialized = false;
dudmuck 0:6bba2efea51e 196 init( );
dudmuck 0:6bba2efea51e 197 ToggleOneShot( );
dudmuck 0:6bba2efea51e 198 counter = 0;
dudmuck 0:6bba2efea51e 199 while( ( val & 0x02 ) != 0x02 )
dudmuck 0:6bba2efea51e 200 {
dudmuck 0:6bba2efea51e 201 val = read( STATUS_REG);
dudmuck 0:6bba2efea51e 202 wait(0.01);
dudmuck 0:6bba2efea51e 203 counter++;
dudmuck 0:6bba2efea51e 204
dudmuck 0:6bba2efea51e 205 if( counter > 20 )
dudmuck 0:6bba2efea51e 206 {
dudmuck 1:3cd1f21925e8 207 write( CTRL_REG4, 0x00 );
dudmuck 0:6bba2efea51e 208 return( 0 ); //Error out after max of 512ms for a read
dudmuck 0:6bba2efea51e 209 }
dudmuck 0:6bba2efea51e 210 }
dudmuck 0:6bba2efea51e 211
dudmuck 0:6bba2efea51e 212 }
dudmuck 0:6bba2efea51e 213 }
dudmuck 0:6bba2efea51e 214
dudmuck 0:6bba2efea51e 215 msb = read( OUT_T_MSB_REG); // Integer part of temperature
dudmuck 0:6bba2efea51e 216 lsb = read( OUT_T_LSB_REG); // Decimal part of temperature in bits 7-4
dudmuck 0:6bba2efea51e 217
dudmuck 0:6bba2efea51e 218 if( msb > 0x7F )
dudmuck 0:6bba2efea51e 219 {
dudmuck 0:6bba2efea51e 220 val = ~( ( msb << 8 ) + lsb ) + 1; //2?s complement
dudmuck 0:6bba2efea51e 221 msb = val >> 8;
dudmuck 0:6bba2efea51e 222 lsb = val & 0x00F0;
dudmuck 0:6bba2efea51e 223 negSign = true;
dudmuck 0:6bba2efea51e 224 }
dudmuck 0:6bba2efea51e 225
dudmuck 0:6bba2efea51e 226 if( negSign == true )
dudmuck 0:6bba2efea51e 227 {
dudmuck 0:6bba2efea51e 228 Temperature = 0 - ( msb + ( float )( ( lsb >> 4 ) / 16.0 ) );
dudmuck 0:6bba2efea51e 229 }
dudmuck 0:6bba2efea51e 230 else
dudmuck 0:6bba2efea51e 231 {
dudmuck 0:6bba2efea51e 232 Temperature = msb + ( float )( ( lsb >> 4 ) / 16.0 );
dudmuck 0:6bba2efea51e 233 }
dudmuck 0:6bba2efea51e 234
dudmuck 0:6bba2efea51e 235 ToggleOneShot( );
dudmuck 0:6bba2efea51e 236
dudmuck 1:3cd1f21925e8 237 write( CTRL_REG4, 0x00 );
dudmuck 1:3cd1f21925e8 238
dudmuck 0:6bba2efea51e 239 return( Temperature );
dudmuck 0:6bba2efea51e 240 }
dudmuck 0:6bba2efea51e 241
dudmuck 1:3cd1f21925e8 242 void MPL3115A2::service()
dudmuck 1:3cd1f21925e8 243 {
dudmuck 1:3cd1f21925e8 244 mpl_int_source_t int_src;
dudmuck 1:3cd1f21925e8 245
dudmuck 1:3cd1f21925e8 246 if ((ctrl_reg4 == 0x00) || m_int_pin) // if no interrupts enabled and no interrupt occuring
dudmuck 1:3cd1f21925e8 247 return;
dudmuck 1:3cd1f21925e8 248
dudmuck 1:3cd1f21925e8 249 int_src.octet = read(INT_SOURCE_REG);
dudmuck 1:3cd1f21925e8 250
dudmuck 1:3cd1f21925e8 251 if (int_src.bits.SRC_TCHG) {
dudmuck 1:3cd1f21925e8 252 }
dudmuck 1:3cd1f21925e8 253 if (int_src.bits.SRC_PCHG) {
dudmuck 1:3cd1f21925e8 254 }
dudmuck 1:3cd1f21925e8 255 if (int_src.bits.SRC_TTH) {
dudmuck 1:3cd1f21925e8 256 }
dudmuck 1:3cd1f21925e8 257 if (int_src.bits.SRC_PTH) {
dudmuck 1:3cd1f21925e8 258 }
dudmuck 1:3cd1f21925e8 259 if (int_src.bits.SRC_TW) {
dudmuck 1:3cd1f21925e8 260 }
dudmuck 1:3cd1f21925e8 261 if (int_src.bits.SRC_PW) {
dudmuck 1:3cd1f21925e8 262 }
dudmuck 1:3cd1f21925e8 263 if (int_src.bits.SRC_FIFO) {
dudmuck 1:3cd1f21925e8 264 read(F_STATUS_REG);
dudmuck 1:3cd1f21925e8 265 }
dudmuck 1:3cd1f21925e8 266 if (int_src.bits.SRC_DRDY) {
dudmuck 1:3cd1f21925e8 267 read(STATUS_REG);
dudmuck 1:3cd1f21925e8 268
dudmuck 1:3cd1f21925e8 269 read( OUT_T_MSB_REG); // Integer part of temperature
dudmuck 1:3cd1f21925e8 270 read( OUT_T_LSB_REG); // Decimal part of temperature in bits 7-4
dudmuck 1:3cd1f21925e8 271
dudmuck 1:3cd1f21925e8 272 read( OUT_P_MSB_REG); // High byte of integer part of altitude,
dudmuck 1:3cd1f21925e8 273 read( OUT_P_CSB_REG); // Low byte of integer part of altitude
dudmuck 1:3cd1f21925e8 274 read( OUT_P_LSB_REG); // Decimal part of altitude in bits 7-4
dudmuck 1:3cd1f21925e8 275 }
dudmuck 1:3cd1f21925e8 276
dudmuck 1:3cd1f21925e8 277 }