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@0:6bba2efea51e, 2015-03-18 (annotated)
- 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?
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 | 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 |