Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MPL3115A2 by
MPL3115A2.cpp@0:cfecfabc5e23, 2013-05-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |