Class Module for MMA845x I2C Accelerometer.
Dependents: mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more
Fork of MMA845x by
Diff: MMA845x.cpp
- Revision:
- 2:70df6adad015
- Parent:
- 1:41af2b3eefb5
- Child:
- 3:7c2fbf79f607
diff -r 41af2b3eefb5 -r 70df6adad015 MMA845x.cpp --- a/MMA845x.cpp Mon Jul 06 19:53:27 2015 +0000 +++ b/MMA845x.cpp Wed Oct 28 17:48:15 2015 +0000 @@ -26,19 +26,19 @@ * 6/20/2015 TAB Added setup functions and polling data capability. Also added RTOS calls * TODO Still need to add interrupt support for other Accelerometer mode support */ - + #include "MMA845x.h" #include "mbed_debug.h" #include "rtos.h" - + MMA845x::MMA845x(I2C &i2c, SA0 const i2c_addr, InterruptIn* int1, InterruptIn* int2) { _i2c = &i2c; _int1 = int1; _int2 = int2; - + _i2c_addr = (0x1c | i2c_addr) << 1; - + MMA845x::init(); return; @@ -49,61 +49,60 @@ uint8_t result = 0; uint8_t i = 0; char reg_val[1]; - + _i2c->frequency(100000); _who_am_i = 0x00; - + // Reset all registers to POR values result = MMA845x::writeRegister(CTRL_REG2, 0xFF); //REG 0x2B - if (result == 0){ + if (result == 0) { - do{ - // wait for the reset bit to clear. readRegister may error out so we re-try 10 times - osDelay(200); - reg_val[0] = 0x40; - result = MMA845x::readRegister(CTRL_REG2,1,reg_val); - reg_val[0] = reg_val[0] & 0x40; - i++; - }while(((reg_val[0] != 0)||( result != 0)) && (i<=10)); + do { + // wait for the reset bit to clear. readRegister may error out so we re-try 10 times + osDelay(200); + reg_val[0] = 0x40; + result = MMA845x::readRegister(CTRL_REG2,1,reg_val); + reg_val[0] = reg_val[0] & 0x40; + i++; + } while(((reg_val[0] != 0)||( result != 0)) && (i<=10)); } - if (result == 0){ + if (result == 0) { result = MMA845x::readRegister(WHO_AM_I,1,reg_val); } - switch (reg_val[0]){ - case MMA8451: - case MMA8452: - case MMA8453: - _who_am_i= reg_val[0]; - if ((_int1 == NULL) && (_int2 == NULL)) - _polling_mode = true; - else _polling_mode = false; - break; - default: - debug ("Device not supported by this library!\n\r"); - result = 1; + switch (reg_val[0]) { + case MMA8451: + case MMA8452: + case MMA8453: + _who_am_i= reg_val[0]; + if ((_int1 == NULL) && (_int2 == NULL)) + _polling_mode = true; + else _polling_mode = false; + break; + default: + debug ("Device not supported by this library!\n\r"); + result = 1; } - if(result != 0) - { + if(result != 0) { debug("MMA845x:init failed\n\r"); } - + - return result; + return result; } uint8_t MMA845x::setCommonParameters(RANGE range, RESOLUTION resolution, LOW_NOISE lo_noise, - DATA_RATE data_rate, OVERSAMPLE_MODE os_mode, HPF_MODE hpf_mode) const + DATA_RATE data_rate, OVERSAMPLE_MODE os_mode, HPF_MODE hpf_mode) const { uint8_t result = 0; char datain[1]; uint8_t dataout = 0; result |= MMA845x::readRegister(SYSMOD,1,datain); // Make sure MMA845x is in Stand-By mode - if ((datain[0] & 0x03) != 0 ){ - debug ("MMA845x not in STAND BY mode\n\f"); + if ((datain[0] & 0x03) != 0 ) { + debug ("MMA845x not in STAND BY mode\n\f"); debug("MMA845x:setCommonParameters failed\n\r"); result = 1; return result; @@ -124,37 +123,35 @@ // result |= MMA845x::readRegister(HP_FILTER_CUTOFF,1, datain); // result |= MMA845x::writeRegister(HP_FILTER_CUTOFF, dataout); //REG 0xF HPF settings - if(result != 0) - { + if(result != 0) { debug("MMA845x:setParameters failed\n\r"); } - - return result; - + + return result; + } uint8_t MMA845x::enableMotionDetect(void) const { uint8_t result = 0; return result; - } - +} + uint8_t MMA845x::enablePulseDetect(void) const { uint8_t result = 0; return result; - } +} uint8_t MMA845x::enableOrientationDetect(void) const { uint8_t result = 0; - if(_who_am_i != MMA8451) - { + if(_who_am_i != MMA8451) { debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__); result = 1; } - + return result; } @@ -162,24 +159,23 @@ { uint8_t result = 0; return result; - } - +} + uint8_t MMA845x::enableAutoSleep(void) const { uint8_t result = 0; return result; - } +} uint8_t MMA845x::enableFIFO(void) const { uint8_t result = 0; - if(_who_am_i != MMA8451) - { + if(_who_am_i != MMA8451) { debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__); result = 1; } - + return result; } @@ -194,7 +190,7 @@ result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to active mode return result; - } +} uint8_t MMA845x::standbyMode(void) const { uint8_t result = 0; @@ -206,7 +202,7 @@ result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to standby mode return result; - } +} uint8_t MMA845x::getStatus(void) const { @@ -217,46 +213,43 @@ result = MMA845x::readRegister(STATUS,1, datain); if (result != 0) - dataout = result; + dataout = result; else - dataout = datain[0]; + dataout = datain[0]; return dataout; - } +} int16_t MMA845x::getX(void) { char datain[2]; - if (_polling_mode) - { + if (_polling_mode) { MMA845x::readRegister(OUT_X_MSB,2, datain); _data._x = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */ _data._x /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */ } - return _data._x; + return _data._x; } - + int16_t MMA845x::getY(void) { char datain[2]; - if (_polling_mode) - { + if (_polling_mode) { MMA845x::readRegister(OUT_Y_MSB,2, datain); _data._y = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */ _data._y /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */ } - return _data._y; + return _data._y; } int16_t MMA845x::getZ(void) { char datain[2]; - if (_polling_mode) - { + if (_polling_mode) { MMA845x::readRegister(OUT_Z_MSB,2, datain); _data._z = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */ _data._z /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */ @@ -264,13 +257,12 @@ return _data._z; } - + MMA845x_DATA MMA845x::getXYZ(void) { char datain[6]; - if (_polling_mode) - { + if (_polling_mode) { MMA845x::readRegister(OUT_X_MSB,6, datain); /* data is 14 bit signed with 2 LSB = 0 */ _data._x = ((datain[0] << 8) | datain[1]); /* need to shift first to preserve sign */ _data._x /= 4; /* then /4 to remove LSBs */ @@ -295,16 +287,15 @@ buf[0] = reg; buf[1] = data; - + // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices result |= _i2c->write(_i2c_addr, buf, 2); // __enable_irq(); // Just need to block during the transaction - - if(result != 0) - { + + if(result != 0) { debug("MMA845x:writeRegister failed r-%d\n\r",result); } - + return result; } @@ -312,26 +303,24 @@ { uint8_t result = 0; char reg_out[1]; - + reg_out[0] = reg; - // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices - result |= _i2c->write(_i2c_addr,reg_out,1,true); - // __enable_irq(); // Just need to block during the transaction +// __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices + result |= _i2c->write(_i2c_addr,reg_out,1,true); +// __enable_irq(); // Just need to block during the transaction - if(result != 0) - { + if(result != 0) { debug("MMA845x::readRegister failed write r- %d\n\r", result); return result; } - - // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices - result |= _i2c->read(_i2c_addr,data,count,false); + +// __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices + result |= _i2c->read(_i2c_addr,data,count,false); // __enable_irq(); // Just need to block during the transaction - - if(result != 0) - { + + if(result != 0) { debug("MMA845x::readRegister failed read r-%d\n\r",result); } - + return result; }