Llibrary for the WiGo MPL3115A2, I2C Precision Altimeter sensor.

Dependents:   KL25Z_Batt_Test WIGO_MPL3115A2 Multi-Sensor SPACEmk2 ... more

30/05/2013 Added and tested the data acquisition using Interrupt. Added code for Altimeter trigger Interrupt but not yet tested.

Very basic library. Under development. Need to add in order: 1. IRQ configuration. 2. FIFO mode configuration.

Committer:
clemente
Date:
Thu May 23 06:42:15 2013 +0000
Revision:
0:cfecfabc5e23
Child:
2:a2fcfb7ff611
First version. Under development.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:cfecfabc5e23 1 #include "MPL3115A2.h"
clemente 0:cfecfabc5e23 2
clemente 0:cfecfabc5e23 3 #define REG_WHO_AM_I 0x0C // 0xC4 by default
clemente 0:cfecfabc5e23 4 #define REG_STATUS 0x00
clemente 0:cfecfabc5e23 5 #define REG_CTRL_REG_1 0x26
clemente 0:cfecfabc5e23 6 #define REG_PRESSURE_MSB 0x01 // 3 byte pressure data
clemente 0:cfecfabc5e23 7 #define REG_ALTIMETER_MSB 0x01 // 3 byte altimeter data
clemente 0:cfecfabc5e23 8 #define REG_TEMP_MSB 0x04 // 2 byte temperature data
clemente 0:cfecfabc5e23 9 #define REG_PT_DATA_CFG 0x13
clemente 0:cfecfabc5e23 10
clemente 0:cfecfabc5e23 11 #define UINT14_MAX 16383
clemente 0:cfecfabc5e23 12
clemente 0:cfecfabc5e23 13 MPL3115A2::MPL3115A2(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
clemente 0:cfecfabc5e23 14 MPL3115A2_mode = BAROMETRIC_MODE;
clemente 0:cfecfabc5e23 15 MPL3115A2_oversampling = OVERSAMPLE_RATIO_1;
clemente 0:cfecfabc5e23 16 }
clemente 0:cfecfabc5e23 17
clemente 0:cfecfabc5e23 18 void MPL3115A2::Barometric_Mode( void)
clemente 0:cfecfabc5e23 19 {
clemente 0:cfecfabc5e23 20 unsigned char t;
clemente 0:cfecfabc5e23 21
clemente 0:cfecfabc5e23 22 Standby();
clemente 0:cfecfabc5e23 23 readRegs( REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 24
clemente 0:cfecfabc5e23 25 // soft reset...
clemente 0:cfecfabc5e23 26 unsigned char data[2] = { REG_CTRL_REG_1, t|0x04};
clemente 0:cfecfabc5e23 27 writeRegs(data, 2);
clemente 0:cfecfabc5e23 28 wait( 0.2);
clemente 0:cfecfabc5e23 29
clemente 0:cfecfabc5e23 30 Standby();
clemente 0:cfecfabc5e23 31 readRegs( REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 32
clemente 0:cfecfabc5e23 33 data[0] = REG_CTRL_REG_1;
clemente 0:cfecfabc5e23 34 data[1] = t&0x7F;
clemente 0:cfecfabc5e23 35 writeRegs(data, 2);
clemente 0:cfecfabc5e23 36
clemente 0:cfecfabc5e23 37 data[0] = REG_PT_DATA_CFG;
clemente 0:cfecfabc5e23 38 data[1] = 0x07;
clemente 0:cfecfabc5e23 39 writeRegs(data, 2);
clemente 0:cfecfabc5e23 40
clemente 0:cfecfabc5e23 41 Oversample_Ratio( MPL3115A2_oversampling);
clemente 0:cfecfabc5e23 42
clemente 0:cfecfabc5e23 43 Active();
clemente 0:cfecfabc5e23 44
clemente 0:cfecfabc5e23 45 MPL3115A2_mode = BAROMETRIC_MODE;
clemente 0:cfecfabc5e23 46 }
clemente 0:cfecfabc5e23 47
clemente 0:cfecfabc5e23 48 void MPL3115A2::Altimeter_Mode( void)
clemente 0:cfecfabc5e23 49 {
clemente 0:cfecfabc5e23 50 unsigned char t;
clemente 0:cfecfabc5e23 51
clemente 0:cfecfabc5e23 52 Standby();
clemente 0:cfecfabc5e23 53 readRegs( REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 54
clemente 0:cfecfabc5e23 55 // soft reset...
clemente 0:cfecfabc5e23 56 unsigned char data[2] = { REG_CTRL_REG_1, t|0x04};
clemente 0:cfecfabc5e23 57 writeRegs(data, 2);
clemente 0:cfecfabc5e23 58 wait( 0.2);
clemente 0:cfecfabc5e23 59
clemente 0:cfecfabc5e23 60 Standby();
clemente 0:cfecfabc5e23 61 readRegs( REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 62
clemente 0:cfecfabc5e23 63 data[0] = REG_CTRL_REG_1;
clemente 0:cfecfabc5e23 64 data[1] = t|0x80;
clemente 0:cfecfabc5e23 65 writeRegs(data, 2);
clemente 0:cfecfabc5e23 66
clemente 0:cfecfabc5e23 67 data[0] = REG_PT_DATA_CFG;
clemente 0:cfecfabc5e23 68 data[1] = 0x07;
clemente 0:cfecfabc5e23 69 writeRegs(data, 2);
clemente 0:cfecfabc5e23 70
clemente 0:cfecfabc5e23 71 Oversample_Ratio( MPL3115A2_oversampling);
clemente 0:cfecfabc5e23 72
clemente 0:cfecfabc5e23 73 Active();
clemente 0:cfecfabc5e23 74
clemente 0:cfecfabc5e23 75 MPL3115A2_mode = ALTIMETER_MODE;
clemente 0:cfecfabc5e23 76 }
clemente 0:cfecfabc5e23 77
clemente 0:cfecfabc5e23 78 void MPL3115A2::Oversample_Ratio( unsigned int ratio)
clemente 0:cfecfabc5e23 79 {
clemente 0:cfecfabc5e23 80 unsigned char t;
clemente 0:cfecfabc5e23 81
clemente 0:cfecfabc5e23 82 Standby();
clemente 0:cfecfabc5e23 83 readRegs( REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 84
clemente 0:cfecfabc5e23 85 t = t & 0xE7;
clemente 0:cfecfabc5e23 86 t = t | ( ratio<<3);
clemente 0:cfecfabc5e23 87
clemente 0:cfecfabc5e23 88 unsigned char data[2] = { REG_CTRL_REG_1, t};
clemente 0:cfecfabc5e23 89 writeRegs(data, 2);
clemente 0:cfecfabc5e23 90
clemente 0:cfecfabc5e23 91 Active();
clemente 0:cfecfabc5e23 92
clemente 0:cfecfabc5e23 93 MPL3115A2_oversampling = ratio;
clemente 0:cfecfabc5e23 94 }
clemente 0:cfecfabc5e23 95
clemente 0:cfecfabc5e23 96
clemente 0:cfecfabc5e23 97 void MPL3115A2::Active( void)
clemente 0:cfecfabc5e23 98 {
clemente 0:cfecfabc5e23 99 unsigned char t;
clemente 0:cfecfabc5e23 100
clemente 0:cfecfabc5e23 101 // Activate the peripheral
clemente 0:cfecfabc5e23 102 readRegs(REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 103 unsigned char data[2] = {REG_CTRL_REG_1, t|0x01};
clemente 0:cfecfabc5e23 104 writeRegs(data, 2);
clemente 0:cfecfabc5e23 105 }
clemente 0:cfecfabc5e23 106
clemente 0:cfecfabc5e23 107 void MPL3115A2::Standby( void)
clemente 0:cfecfabc5e23 108 {
clemente 0:cfecfabc5e23 109 unsigned char t;
clemente 0:cfecfabc5e23 110
clemente 0:cfecfabc5e23 111 // Standby
clemente 0:cfecfabc5e23 112 readRegs(REG_CTRL_REG_1, &t, 1);
clemente 0:cfecfabc5e23 113 unsigned char data[2] = {REG_CTRL_REG_1, t&0xFE};
clemente 0:cfecfabc5e23 114 writeRegs(data, 2);
clemente 0:cfecfabc5e23 115 }
clemente 0:cfecfabc5e23 116
clemente 0:cfecfabc5e23 117 unsigned char MPL3115A2::getDeviceID() {
clemente 0:cfecfabc5e23 118 unsigned char device_id = 0;
clemente 0:cfecfabc5e23 119 readRegs(REG_WHO_AM_I, &device_id, 1);
clemente 0:cfecfabc5e23 120 return device_id;
clemente 0:cfecfabc5e23 121 }
clemente 0:cfecfabc5e23 122
clemente 0:cfecfabc5e23 123 unsigned int MPL3115A2::isDataAvailable( void)
clemente 0:cfecfabc5e23 124 {
clemente 0:cfecfabc5e23 125 unsigned char status;
clemente 0:cfecfabc5e23 126
clemente 0:cfecfabc5e23 127 readRegs( REG_STATUS, &status, 1);
clemente 0:cfecfabc5e23 128
clemente 0:cfecfabc5e23 129 if ( status & 0x08) {
clemente 0:cfecfabc5e23 130 return 1;
clemente 0:cfecfabc5e23 131 } else {
clemente 0:cfecfabc5e23 132 return 0;
clemente 0:cfecfabc5e23 133 }
clemente 0:cfecfabc5e23 134
clemente 0:cfecfabc5e23 135 }
clemente 0:cfecfabc5e23 136
clemente 0:cfecfabc5e23 137 unsigned char MPL3115A2::getStatus( void)
clemente 0:cfecfabc5e23 138 {
clemente 0:cfecfabc5e23 139 unsigned char status;
clemente 0:cfecfabc5e23 140
clemente 0:cfecfabc5e23 141 readRegs( REG_STATUS, &status, 1);
clemente 0:cfecfabc5e23 142 return status;
clemente 0:cfecfabc5e23 143 }
clemente 0:cfecfabc5e23 144
clemente 0:cfecfabc5e23 145 void MPL3115A2::getAllData( float *f)
clemente 0:cfecfabc5e23 146 {
clemente 0:cfecfabc5e23 147 if ( MPL3115A2_mode == ALTIMETER_MODE) {
clemente 0:cfecfabc5e23 148 f[0] = getAltimeter();
clemente 0:cfecfabc5e23 149 } else {
clemente 0:cfecfabc5e23 150 f[0] = getPressure();
clemente 0:cfecfabc5e23 151 }
clemente 0:cfecfabc5e23 152
clemente 0:cfecfabc5e23 153 f[1] = getTemperature();
clemente 0:cfecfabc5e23 154 }
clemente 0:cfecfabc5e23 155
clemente 0:cfecfabc5e23 156 float MPL3115A2::getAltimeter( void)
clemente 0:cfecfabc5e23 157 {
clemente 0:cfecfabc5e23 158 unsigned char dt[3];
clemente 0:cfecfabc5e23 159 unsigned short altm;
clemente 0:cfecfabc5e23 160 float faltm;
clemente 0:cfecfabc5e23 161
clemente 0:cfecfabc5e23 162 /*
clemente 0:cfecfabc5e23 163 * dt[0] = Bits 12-19 of 20-bit real-time Pressure sample. (b7-b0)
clemente 0:cfecfabc5e23 164 * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0)
clemente 0:cfecfabc5e23 165 * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4)
clemente 0:cfecfabc5e23 166 */
clemente 0:cfecfabc5e23 167 readRegs( REG_ALTIMETER_MSB, &dt[0], 3);
clemente 0:cfecfabc5e23 168 altm = (dt[0]<<8) | dt[1];
clemente 0:cfecfabc5e23 169 //
clemente 0:cfecfabc5e23 170 if ( dt[0] > 0x7F) {
clemente 0:cfecfabc5e23 171 altm = ~altm + 1;
clemente 0:cfecfabc5e23 172 faltm = (float)altm * -1.0f;
clemente 0:cfecfabc5e23 173 } else {
clemente 0:cfecfabc5e23 174 faltm = (float)altm * 1.0f;
clemente 0:cfecfabc5e23 175 }
clemente 0:cfecfabc5e23 176 //
clemente 0:cfecfabc5e23 177 faltm = faltm+((float)(dt[2]>>4) * 0.0625f);
clemente 0:cfecfabc5e23 178 return faltm;
clemente 0:cfecfabc5e23 179 }
clemente 0:cfecfabc5e23 180
clemente 0:cfecfabc5e23 181 float MPL3115A2::getPressure( void)
clemente 0:cfecfabc5e23 182 {
clemente 0:cfecfabc5e23 183 unsigned char dt[3];
clemente 0:cfecfabc5e23 184 unsigned int prs;
clemente 0:cfecfabc5e23 185 float fprs;
clemente 0:cfecfabc5e23 186
clemente 0:cfecfabc5e23 187 /*
clemente 0:cfecfabc5e23 188 * dt[0] = Bits 12-19 of 20-bit real-time Pressure sample. (b7-b0)
clemente 0:cfecfabc5e23 189 * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0)
clemente 0:cfecfabc5e23 190 * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4)
clemente 0:cfecfabc5e23 191 */
clemente 0:cfecfabc5e23 192 readRegs( REG_PRESSURE_MSB, &dt[0], 3);
clemente 0:cfecfabc5e23 193 prs = (dt[0]<<10) | (dt[1]<<2) | (dt[2]>>6);
clemente 0:cfecfabc5e23 194 //
clemente 0:cfecfabc5e23 195 fprs = (float)prs * 1.0f;
clemente 0:cfecfabc5e23 196
clemente 0:cfecfabc5e23 197 if ( dt[2] & 0x20)
clemente 0:cfecfabc5e23 198 fprs += 0.25f;
clemente 0:cfecfabc5e23 199 if ( dt[2] & 0x10)
clemente 0:cfecfabc5e23 200 fprs += 0.5f;
clemente 0:cfecfabc5e23 201
clemente 0:cfecfabc5e23 202 return fprs;
clemente 0:cfecfabc5e23 203 }
clemente 0:cfecfabc5e23 204
clemente 0:cfecfabc5e23 205
clemente 0:cfecfabc5e23 206 float MPL3115A2::getTemperature( void)
clemente 0:cfecfabc5e23 207 {
clemente 0:cfecfabc5e23 208 unsigned char dt[2];
clemente 0:cfecfabc5e23 209 unsigned short temp;
clemente 0:cfecfabc5e23 210 float ftemp;
clemente 0:cfecfabc5e23 211
clemente 0:cfecfabc5e23 212 /*
clemente 0:cfecfabc5e23 213 * dt[0] = Bits 4-11 of 16-bit real-time temperature sample. (b7-b0)
clemente 0:cfecfabc5e23 214 * dt[1] = Bits 0-3 of 16-bit real-time temperature sample. (b7-b4)
clemente 0:cfecfabc5e23 215 */
clemente 0:cfecfabc5e23 216 readRegs( REG_TEMP_MSB, &dt[0], 2);
clemente 0:cfecfabc5e23 217 temp = dt[0];
clemente 0:cfecfabc5e23 218 //
clemente 0:cfecfabc5e23 219 if ( dt[0] > 0x7F) {
clemente 0:cfecfabc5e23 220 temp = ~temp + 1;
clemente 0:cfecfabc5e23 221 ftemp = (float)temp * -1.0f;
clemente 0:cfecfabc5e23 222 } else {
clemente 0:cfecfabc5e23 223 ftemp = (float)temp * 1.0f;
clemente 0:cfecfabc5e23 224 }
clemente 0:cfecfabc5e23 225 //
clemente 0:cfecfabc5e23 226 ftemp = ftemp+((float)(dt[1]>>4) * 0.0625f);
clemente 0:cfecfabc5e23 227 return ftemp;
clemente 0:cfecfabc5e23 228
clemente 0:cfecfabc5e23 229 }
clemente 0:cfecfabc5e23 230
clemente 0:cfecfabc5e23 231 void MPL3115A2::readRegs(int addr, uint8_t * data, int len) {
clemente 0:cfecfabc5e23 232 char t[1] = {addr};
clemente 0:cfecfabc5e23 233 m_i2c.write(m_addr, t, 1, true);
clemente 0:cfecfabc5e23 234 m_i2c.read(m_addr, (char *)data, len);
clemente 0:cfecfabc5e23 235 }
clemente 0:cfecfabc5e23 236
clemente 0:cfecfabc5e23 237 void MPL3115A2::writeRegs(uint8_t * data, int len) {
clemente 0:cfecfabc5e23 238 m_i2c.write(m_addr, (char *)data, len);
clemente 0:cfecfabc5e23 239 }