Commented debug printfs
Dependents: LoRaWAN-NAMote72-Application-Demo_IoTium LoRaWAN-NAMote72-BVS-confirmed-tester-0-7v1_copy LoRaWAN-NAMote72-Application-Demo-good LoRaWAN-NAMote72-Application-Demo
Fork of lib_mpl3115a2 by
mpl3115a2.cpp@1:3cd1f21925e8, 2015-05-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |