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
Diff: MPL3115A2.cpp
- Revision:
- 2:a2fcfb7ff611
- Parent:
- 0:cfecfabc5e23
- Child:
- 3:a2f1752add9a
--- a/MPL3115A2.cpp Thu May 23 12:42:45 2013 +0000 +++ b/MPL3115A2.cpp Wed May 29 05:57:15 2013 +0000 @@ -1,8 +1,10 @@ #include "MPL3115A2.h" -#define REG_WHO_AM_I 0x0C // 0xC4 by default +#define REG_WHO_AM_I 0x0C // return 0xC4 by default #define REG_STATUS 0x00 #define REG_CTRL_REG_1 0x26 +#define REG_CTRL_REG_4 0x29 +#define REG_CTRL_REG_5 0x2A #define REG_PRESSURE_MSB 0x01 // 3 byte pressure data #define REG_ALTIMETER_MSB 0x01 // 3 byte altimeter data #define REG_TEMP_MSB 0x04 // 2 byte temperature data @@ -10,26 +12,94 @@ #define UINT14_MAX 16383 +void (*user2_fptr)(void); // Pointers to user function called after +void (*user1_fptr)(void); // IRQ assertion. + +// +InterruptIn MPL3115A2_Int1( PTD4); // INT1 +InterruptIn MPL3115A2_Int2( PTA12); // INT2 + MPL3115A2::MPL3115A2(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) { MPL3115A2_mode = BAROMETRIC_MODE; MPL3115A2_oversampling = OVERSAMPLE_RATIO_1; } +void MPL3115A2::Reset( void) +{ + unsigned char t; + + // soft reset... + readRegs( REG_CTRL_REG_1, &t, 1); + unsigned char data[2] = { REG_CTRL_REG_1, t|0x04}; + writeRegs(data, 2); + wait( 0.1); + +} + +void MPL3115A2::DataReady( void(*fptr)(void), unsigned char OS) +{ + unsigned char dt[5]; + unsigned char data[2]; + + Reset(); + + /* + ** Read contents of CTRL_REG_1 + ** Clear SBYB mask while holding all other values of CTRL_REG_1. + ** To put part into Standby mode + */ + Standby(); + + /* + ** Clear all interrupts by reading the output registers. + ** Activate sensor in Altimeter mode. + */ + readRegs( REG_ALTIMETER_MSB, &dt[0], 5); + getStatus(); + // Enable Interrupt fot data ready + data[0] = REG_CTRL_REG_4; + data[1] = 0x80; + writeRegs(data, 2); + // Configure Interrupt route to INT2 + data[0] = REG_CTRL_REG_5; + data[1] = 0x00; + writeRegs(data, 2); + + /* + ** Write a 1 to the ALT and SBYB bits to go into Active Altimeter mode + */ + // Configure the OverSampling rate, Altimeter mode and set the sensor Active + data[0] = REG_CTRL_REG_1; + data[1] = 0x81 | (OS<<3); + writeRegs(data, 2); + + user2_fptr = fptr; + MPL3115A2_Int2.fall( this, &MPL3115A2::DataReady_IRQ); + +} + +void MPL3115A2::DataReady_IRQ( void) +{ + // Clear the IRQ flag + getStatus(); + // Run the user supplied function + user2_fptr(); +} + void MPL3115A2::Barometric_Mode( void) { unsigned char t; + unsigned char data[2]; Standby(); - readRegs( REG_CTRL_REG_1, &t, 1); // soft reset... - unsigned char data[2] = { REG_CTRL_REG_1, t|0x04}; - writeRegs(data, 2); - wait( 0.2); - + Reset(); + Standby(); readRegs( REG_CTRL_REG_1, &t, 1); + // Set the Barometric mode data[0] = REG_CTRL_REG_1; data[1] = t&0x7F; writeRegs(data, 2); @@ -48,14 +118,12 @@ void MPL3115A2::Altimeter_Mode( void) { unsigned char t; - + unsigned char data[2]; + Standby(); - readRegs( REG_CTRL_REG_1, &t, 1); // soft reset... - unsigned char data[2] = { REG_CTRL_REG_1, t|0x04}; - writeRegs(data, 2); - wait( 0.2); + Reset(); Standby(); readRegs( REG_CTRL_REG_1, &t, 1);