Made the following changes from tumblr post.
Fork of MMA8451Q8 by
Diff: MMA8451Q8.cpp
- Revision:
- 8:9a17721c387d
- Parent:
- 7:7812354ef684
diff -r 7812354ef684 -r 9a17721c387d MMA8451Q8.cpp --- a/MMA8451Q8.cpp Wed Feb 22 15:35:47 2017 +0000 +++ b/MMA8451Q8.cpp Wed Mar 08 03:21:38 2017 +0000 @@ -33,7 +33,12 @@ #define MAX_4G 0x01 #define MAX_8G 0x02 +#define NUM_DATA 2 #define GSCALING 1024.0 +#define ADDRESS_INDEX 0 +#define DATA_INDEX 1 + +float gScaling[3] = {4095.0, 2048.0, 1024.0}; // scaling for acceleration of gravity values MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) { // activate the peripheral @@ -43,21 +48,50 @@ MMA8451Q::~MMA8451Q() { } +void MMA8451Q::setStandbyMode() { + #define ACTIVEMASK 0x01 + uint8_t registerData[1]; + uint8_t data[NUM_DATA] = {REG_CTRL_REG_1, 0x00}; + + readRegs(REG_CTRL_REG_1, registerData, 1); + data[1] = registerData[0] & ~ACTIVEMASK; + writeRegs(data, NUM_DATA); // put in stanby +} + +void MMA8451Q::setActiveMode() { + #define ACTIVEMASK 0x01 + uint8_t registerData[1]; + uint8_t data[NUM_DATA] = {REG_CTRL_REG_1, 0x00}; + + readRegs(REG_CTRL_REG_1, registerData, 1); + data[1] = registerData[0] | ACTIVEMASK; + writeRegs(data, NUM_DATA); //put in standby +} + +void MMA8451Q::setGLimit(int gSelect) { + uint8_t data[NUM_DATA] = {REG_CTRL_REG_1, 0x00}; + gChosen = gSelect; + setStandbyMode(); + data[ADDRESS_INDEX ] = XYZ_DATA_CFG; + data[DATA_INDEX] = gChosen; + writeRegs(data, 2); // change g limit + setActiveMode(); // make active +} uint8_t MMA8451Q::getWhoAmI() { uint8_t who_am_i = 0; readRegs(REG_WHO_AM_I, &who_am_i, 1); return who_am_i; } -void MMA8451Q::setGLimit() { - uint8_t data[2] = {REG_CTRL_REG_1, 0x00}; - writeRegs(data, 2); // put in standby - data[0] = XYZ_DATA_CFG; - data[1] = MAX_8G; - writeRegs(data, 2);// change g limit - data[0] = REG_CTRL_REG_1; - data[1] = 0x01; - writeRegs(data, 2); // make active -} +//void MMA8451Q::setGLimit(int) { +// uint8_t data[2] = {REG_CTRL_REG_1, 0x00}; +// writeRegs(data, 2); // put in standby +// data[0] = XYZ_DATA_CFG; +// data[1] = MAX_8G; +// writeRegs(data, 2);// change g limit +// data[0] = REG_CTRL_REG_1; +// data[1] = 0x01; +// writeRegs(data, 2); // make active +//} float MMA8451Q::getAccX() { return (float(getAccAxis(REG_OUT_X_MSB))/GSCALING);