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
Revision 1:41af2b3eefb5, committed 2015-07-06
- Comitter:
- falingtrea
- Date:
- Mon Jul 06 19:53:27 2015 +0000
- Parent:
- 0:9d1e3a344e4f
- Child:
- 2:70df6adad015
- Commit message:
- Added basic setup functions and added RTOS calls. Set data get to poll if interrupt pointers are set to NULL.
Changed in this revision
| MMA845x.cpp | Show annotated file Show diff for this revision Revisions of this file |
| MMA845x.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/MMA845x.cpp Fri Mar 29 21:51:11 2013 +0000
+++ b/MMA845x.cpp Mon Jul 06 19:53:27 2015 +0000
@@ -1,13 +1,13 @@
/**
* @file MMA845x.cpp
- * @brief Device driver - MMA845X 3-axis accelerometer IC
- * @author sam grove
+ * @brief Device driver - MMA845X 3-axis accelerometer IC W/RTOS support
+ * @author Tim Barr
* @version 1.0
* @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
* @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf
* @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf
*
- * Copyright (c) 2013
+ * Copyright (c) 2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,155 +20,318 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
+ *
+ * 5/5/2015 Forked from https://developer.mbed.org/users/sam_grove/code/MMA845x/
+ *
+ * 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, InterruptIn &int1, InterruptIn &int2, MMA845x_SA0 const i2c_addr)
+MMA845x::MMA845x(I2C &i2c, SA0 const i2c_addr, InterruptIn* int1, InterruptIn* int2)
{
_i2c = &i2c;
- _int1 = &int1;
- _int2 = &int2;
-
- _i2c_addr = (0x1c << 2) | (i2c_addr << 0x1);
-
- return;
-}
-
-void MMA845x::init(void) const
-{
- uint8_t reg_val = 0;
-
- _i2c->frequency(400000);
-
- // Reset all registers to POR values
- MMA845x::writeRegister(CTRL_REG2, 0xFF); //REG 0x2B
- do{
- // wait for the reset bit to clear
- reg_val = MMA845x::readRegister(CTRL_REG2) & 0x40;
- }while(reg_val);
-
- // setup the registers that are common among modes
- MMA845x::writeRegister(CTRL_REG1, 0xd8); //REG 0x2A
- MMA845x::writeRegister(CTRL_REG2, 0x00); //REG 0x2B
- MMA845x::writeRegister(CTRL_REG3, 0x00); //REG 0x2C
+ _int1 = int1;
+ _int2 = int2;
- MMA845x::writeRegister(XYZ_DATA_CFG, 0x0); //REG 0xE HPF / scale +/-2,4,8g
- MMA845x::writeRegister(HP_FILTER_CUTOFF, 0x0); //REG 0xF HPF settings
-
- return;
-}
-
-void MMA845x::enableDataReadyMode(void) const
-{
+ _i2c_addr = (0x1c | i2c_addr) << 1;
+
MMA845x::init();
- MMA845x::writeRegister(SYSMOD, 0x1); //REG 0x0B
- MMA845x::writeRegister(INT_SOURCE, 0x1); //REG 0x0C
- // need to finish up these config registers..... 3/8/13
-
-}
-void MMA845x::enableMotionMode(void) const{}
-void MMA845x::enablePulseMode(void) const{}
-
-void MMA845x::enableOrientationMode(void) const
-{
- uint16_t who_am_i = MMA845x::readRegister(WHO_AM_I);
- if(who_am_i != MMA8451)
- {
- error("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
- }
-
return;
}
-void MMA845x::enableTransitMode(void) const{}
-void MMA845x::enableAutoSleepMode(void) const{}
-
-void MMA845x::enableFIFOMode(void) const
+uint8_t MMA845x::init(void)
{
- uint16_t who_am_i = MMA845x::readRegister(WHO_AM_I);
- if(who_am_i != MMA8451)
+ 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){
+
+ 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){
+ 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;
+ }
+
+ if(result != 0)
{
- error("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
+ debug("MMA845x:init failed\n\r");
+ }
+
+
+ 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
+{
+ 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");
+ debug("MMA845x:setCommonParameters failed\n\r");
+ result = 1;
+ return result;
+ }
+
+ result |= MMA845x::readRegister(CTRL_REG1, 1, datain);
+ dataout = (datain[0] & 0xB1) | resolution | lo_noise | data_rate;
+ result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set resolution, Low Noise mode, and data rate
+
+ result |= MMA845x::readRegister(CTRL_REG2,1, datain);
+ dataout = (datain[0] & 0xFB) | os_mode;
+ result |= MMA845x::writeRegister(CTRL_REG2, dataout); // Set Oversample mode
+
+ result |= MMA845x::readRegister(XYZ_DATA_CFG,1, datain);
+ dataout = range | hpf_mode;
+ result |= MMA845x::writeRegister(XYZ_DATA_CFG, dataout); //Set HPF mode and range
+
+// result |= MMA845x::readRegister(HP_FILTER_CUTOFF,1, datain);
+// result |= MMA845x::writeRegister(HP_FILTER_CUTOFF, dataout); //REG 0xF HPF settings
+
+ if(result != 0)
+ {
+ debug("MMA845x:setParameters failed\n\r");
+ }
+
+ return result;
+
+}
+
+uint8_t MMA845x::enableMotionDetect(void) const
+{
+ uint8_t result = 0;
+ return result;
}
- //MMA845x::writeRegister(
+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)
+ {
+ debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
+ result = 1;
+ }
- return;
+ return result;
+}
+
+uint8_t MMA845x::enableTransientDetect(void) const
+{
+ 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)
+ {
+ debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
+ result = 1;
+ }
+
+ return result;
}
-uint16_t MMA845x::getX(void) const
+uint8_t MMA845x::activeMode(void) const
+{
+ uint8_t result = 0;
+ char datain[1];
+ uint8_t dataout;
+
+ result |= MMA845x::readRegister(CTRL_REG1,1, datain);
+ dataout = (datain[0] & 0xFE) | 0x01 ;
+ result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to active mode
+
+ return result;
+ }
+uint8_t MMA845x::standbyMode(void) const
+{
+ uint8_t result = 0;
+ char datain[1];
+ uint8_t dataout;
+
+ result |= MMA845x::readRegister(CTRL_REG1,1, datain);
+ dataout = (datain[0] & 0xFE);
+ result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to standby mode
+
+ return result;
+ }
+
+uint8_t MMA845x::getStatus(void) const
{
- return _data._x;
+ uint8_t result = 0;
+ char datain[1];
+ uint8_t dataout;
+
+ result = MMA845x::readRegister(STATUS,1, datain);
+
+ if (result != 0)
+ dataout = result;
+ else
+ dataout = datain[0];
+
+ return dataout;
+ }
+
+int16_t MMA845x::getX(void)
+{
+ char datain[2];
+
+ 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;
+
}
-uint16_t MMA845x::getY(void) const
+int16_t MMA845x::getY(void)
{
- return _data._y;
+ char datain[2];
+
+ 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;
}
-uint16_t MMA845x::getZ(void) const
+int16_t MMA845x::getZ(void)
{
+ char datain[2];
+
+ 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 */
+ }
+
return _data._z;
}
-MMA845x_DATA MMA845x::getXYZ(void) const
+MMA845x_DATA MMA845x::getXYZ(void)
{
+ char datain[6];
+
+ 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 */
+ _data._y = ((datain[2] << 8) | datain[3]);
+ _data._y /= 4;
+ _data._z = ((datain[4] << 8) | datain[5]);
+ _data._z /= 4;
+ }
+
return _data;
}
-void MMA845x::writeRegister(uint8_t const reg, uint8_t const data) const
+char MMA845x::getWhoAmI(void) const
+{
+ return _who_am_i;
+}
+
+uint8_t MMA845x::writeRegister(uint8_t const reg, uint8_t const data) const
{
char buf[2] = {reg, data};
uint8_t result = 0;
+
+ buf[0] = reg;
+ buf[1] = data;
- __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some deicse
- result = _i2c->write(_i2c_addr, buf, 2);
- __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, buf, 2);
+// __enable_irq(); // Just need to block during the transaction
- if(0 != result)
+ if(result != 0)
{
- error("%s %d: I2c write failed\n", __FILE__, __LINE__);
+ debug("MMA845x:writeRegister failed r-%d\n\r",result);
}
- return;
+ return result;
}
-uint8_t MMA845x::readRegister(uint8_t const reg) const
+uint8_t MMA845x::readRegister(uint8_t const reg, uint8_t count, char* data) const
{
- uint8_t result = 1, data = 0;
+ uint8_t result = 0;
+ char reg_out[1];
- __disable_irq(); // Tickers and other timebase events can jack up the I2C bus
- _i2c->start();
- result &= _i2c->write(_i2c_addr);
- result &= _i2c->write(reg);
- // issue a repeated start...
- _i2c->start();
- result &= _i2c->write(_i2c_addr | 0x01);
- // read with nak
- data = _i2c->read(0);
- _i2c->stop();
- __enable_irq(); // Just need to block during the transaction
-
- if(1 != result)
+ 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
+
+ if(result != 0)
{
- error("%s %d: I2C read failed\n", __FILE__, __LINE__);
+ debug("MMA845x::readRegister failed write r- %d\n\r", result);
+ return result;
}
- return data;
-}
-
-void MMA845x::registerDump(void) const
-{
- uint8_t reg_val = 0;
+ // __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
- for(int i=0; i<0x80; i++)
+ if(result != 0)
{
- reg_val = MMA845x::readRegister(i);
- printf("Reg 0x%02x: 0x%02x \n", i, reg_val);
+ debug("MMA845x::readRegister failed read r-%d\n\r",result);
}
- return;
+ return result;
}
-
--- a/MMA845x.h Fri Mar 29 21:51:11 2013 +0000
+++ b/MMA845x.h Mon Jul 06 19:53:27 2015 +0000
@@ -1,13 +1,13 @@
/**
* @file MMA845x.h
* @brief Device driver - MMA845x 3-axis accelerometer IC
- * @author sam grove
+ * @author Tim Barr
* @version 1.0
* @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
* @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf
* @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf
*
- * Copyright (c) 2013
+ * Copyright (c) 2015
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
+ * Forked from
*/
#ifndef MMA845X_H
@@ -52,16 +53,16 @@
{
public:
- volatile uint16_t _x; /*!< volatile data variable */
- volatile uint16_t _y; /*!< volatile data variable */
- volatile uint16_t _z; /*!< volatile data variable */
+ volatile int16_t _x; /*!< volatile data variable */
+ volatile int16_t _y; /*!< volatile data variable */
+ volatile int16_t _z; /*!< volatile data variable */
/** Create the MMA845x_DATA object initialized to the parameter (or 0 if none)
* @param x - the init value of _x
* @param y - the init value of _y
* @param x - the init value of _z
*/
- MMA845x_DATA(uint16_t x = 0, uint16_t y = 0, uint16_t z = 0) : _x(x), _y(y), _z(z) {}
+ MMA845x_DATA(int16_t x = 0, int16_t y = 0, int16_t z = 0) : _x(x), _y(y), _z(z) {}
/** Overloaded '=' operator to allow shorthand coding, assigning objects to one another
* @param rhs - an object of the same type to assign ourself the same values of
@@ -80,7 +81,7 @@
* @param val - Assign each data member (_x, _y, _z) this value
* @return this
*/
- MMA845x_DATA &operator= (uint16_t const val)
+ MMA845x_DATA &operator= (int16_t const val)
{
_x = _y = _z = val;
@@ -95,55 +96,159 @@
{
return ((_x == rhs._x)&&(_y == rhs._y)&&(_z == rhs._z)) ? 1 : 0;
}
-
};
/**
* @class MMA845x
* @brief API abstraction for the MMA845x 3-axis accelerometer IC
+ * initial version will be polling only. Interrupt service and rtos support will
+ * be added at a later point
*/
class MMA845x
{
public:
/**
- * @enum MMA845x_SA0
+ * @enum SA0
* @brief Possible terminations for the ADDR pin
*/
- enum MMA845x_SA0
+ enum SA0
{
SA0_VSS = 0, /*!< SA0 connected to VSS */
SA0_VDD /*!< SA0 connected to VDD */
};
/**
- * @enum MMA845x_WHO_AM_I
+ * @enum WHO_AM_I_VAL
* @brief Device ID's that this class is compatible with
*/
- enum MMA845x_WHO_AM_I
+ enum WHO_AM_I_VAL
{
MMA8451 = 0x1a, /*!< MMA8451 WHO_AM_I register content */
MMA8452 = 0x2a, /*!< MMA8452 WHO_AM_I register content */
MMA8453 = 0x3a, /*!< MMA8453 WHO_AM_I register content */
};
+
+ /**
+ * @enum SYS_MODE
+ * @brief operating mode of MMA845x
+ */
+ enum SYS_MODE
+ {
+ STANDBY = 0,
+ WAKE, SLEEP
+ };
+
+ /**
+ * @enum STATUS
+ * @brief flags for data overwrite and data ready
+ */
+ enum STATUS
+ {
+ XDR = 0x01,
+ YDR = 0x02,
+ ZDR = 0x04,
+ XYZDR = 0x08,
+ XOW = 0x10,
+ YOW = 0x20,
+ ZOW = 0x40,
+ XYZOW = 0x80
+ };
+
+ /**
+ * @enum RANGE
+ * @brief values for measurement range positive and negative
+ */
+ enum RANGE
+ {
+ RANGE_2g = 0,
+ RANGE_4g, RANGE_8g
+ };
/**
- * @enum MMA845x_REGISTER
+ * @enum RESOLUTION
+ * @brief selections for resolution of data, 8 bit or maximum
+ */
+ enum RESOLUTION
+ {
+ RES_MAX = 0, /* Read back full resolution - normal mode*/
+ RES_8BIT = 2 /* Read back 8 bit values only - fast mode*/
+ };
+
+ /**
+ * @enum LOW_NOISE
+ * @brief Low Noise mode Note: 4g max reading when on
+ */
+ enum LOW_NOISE
+ {
+ LN_OFF = 0x00, /* Low Noise mode off */
+ LN_ON = 0x02 /* Low Noise mode on, 4g max readings */
+ };
+
+ /**
+ * @enum HPF_MODE
+ * @brief High Pass Filter mode
+ */
+ enum HPF_MODE
+ {
+ HPF_OFF = 0x00, /* High Pass Filter mode off */
+ HPF_ON = 0x10 /* High Pass Filter mode on */
+ };
+
+ /**
+ * @enum DATA_RATE
+ * @brief values for normal output data rate in Hz
+ */
+ enum DATA_RATE
+ {
+ DR_800 = 0x00,
+ DR_400 = 0x08,
+ DR_200 = 0x10,
+ DR_100 = 0x18,
+ DR_50 = 0x20,
+ DR_12_5 = 0x28,
+ DR_6_25 = 0x30,
+ DR_1_56 = 0x38
+ };
+ /**
+ * @enum ASLP_DATA_RATE
+ * @brief values for auto_sleep mode data rate in HZ
+ */
+ enum ASLP_DATA_RATE
+ {
+ ASLPDR_50 = 0x00,
+ ALSPDR_12_5 = 0x40,
+ ASLPDR_6_25 = 0x80,
+ ASLPDR_1_56 = 0xB0
+ };
+
+ /**
+ * @enum OVERSAMPLE_MODE
+ * @brief sets the oversample mode, Normal, Low power and noise, High resolution, or low power
+ */
+ enum OVERSAMPLE_MODE
+ {
+ OS_NORMAL = 0,
+ OS_LO_PN, OS_HI_RES, OS_LO_POW
+ };
+
+ /**
+ * @enum REGISTER
* @brief The device register map
*/
- enum MMA845x_REGISTER
+ enum REGISTER
{
- STATUS = 0x0,
+ STATUS = 0x00,
OUT_X_MSB, OUT_X_LSB, OUT_Y_MSB, OUT_Y_LSB, OUT_Z_MSB, OUT_Z_LSB,
- F_SETUP = 0x9, TRIG_CFG, // only available on the MMA8451 variant
+ F_SETUP = 0x09, TRIG_CFG, // only available on the MMA8451 variant
- SYSMOD = 0xb,
+ SYSMOD = 0x0B,
INT_SOURCE, WHO_AM_I, XYZ_DATA_CFG, HP_FILTER_CUTOFF, PL_STATUS,
PL_CFG, PL_COUNT, PL_BF_ZCOMP, P_L_THS_REG, FF_MT_CFG, FF_MT_SRC,
FF_MT_THS, FF_MT_COUNT,
- TRANSIENT_CFG = 0x1d,
+ TRANSIENT_CFG = 0x1D,
TRANSIENT_SRC, TRANSIENT_THS, TRANSIENT_COUNT, PULSE_CFG, PULSE_SRC,
PULSE_THSX, PULSE_THSY, PULSE_THSZ, PULSE_TMLT, PULSE_LTCY, PULSE_WIND,
ASLP_COUNT, CTRL_REG1, CTRL_REG2, CTRL_REG3, CTRL_REG4, CTRL_REG5,
@@ -152,60 +257,104 @@
/** Create the MMA845x object
* @param i2c - A defined I2C object
- * @param int1 - A defined InterruptIn object
- * @param int2 - A defined InterruptIn object
- * @param i2c_addr - Connection of the address line
+ * @param int1 - A defined InterruptIn object pointer. Default NULL for polling mode
+ * @param int2 - A defined InterruptIn object pointer. Default NULL for polling mode
+ * @param i2c_addr - state of pin SA0
+ * TODO - need to add interrupt support
*/
- MMA845x(I2C &i2c, InterruptIn &int1, InterruptIn &int2, MMA845x_SA0 const i2c_addr);
+ MMA845x(I2C &i2c, SA0 const i2c_addr = SA0_VSS, InterruptIn* int1 = NULL, InterruptIn* int2 = NULL);
/** Get the X data
- * @return The last valid reading from the accelerometer
+ * @return The last valid X-axis reading from the accelerometer
*/
- uint16_t getX(void) const;
+ int16_t getX(void);
/** Get the Y data
- * @return The last valid reading from the accelerometer
+ * @return The last valid Y-axis reading from the accelerometer
*/
- uint16_t getY(void) const;
+ int16_t getY(void);
/** Get the Z data
- * @return The last valid reading from the accelerometer
+ * @return The last Z-axis valid reading from the accelerometer
*/
- uint16_t getZ(void) const;
+ int16_t getZ(void);
+
+ /** Get the XYZ data structure
+ * @return The last valid X, Y, and Z-axis readings from the accelerometer
+ */
+ MMA845x_DATA getXYZ(void);
/** Get the XYZ data structure
- * @return The last valid reading from the accelerometer
+ * @return accelerometer ID code. Test versus the WHO_AM_I_VAL enum
+ */
+ char getWhoAmI(void) const;
+
+ /** Setup the MMA845x for standard accelerometer read mode
+ * @range - set the measurement range using RANGE enum
+ * @resolution - set the ADC resolution using the RESOLUTION enum
+ * @lo_noise - Set the Low-Noise mode using the LOW_NOISE enum
+ * @data_rate - set the aquisition rate using the DATA_RATE enum
+ * @os_mode - Set the Over sample mode suing the OVERSAMPLE_MODE enum
+ * @hpf_mode - Set the Hi pass filter mode using the HPF_MOSE enum
+ * @return status of command
+ *
+ * This sets the resolution, range, data rate, oversample
+ * mode, hi and lo pass filter.
+ */
+ uint8_t setCommonParameters(RANGE range, RESOLUTION resolution, LOW_NOISE lo_noise,
+ DATA_RATE data_rate, OVERSAMPLE_MODE os_mode, HPF_MODE hpf_mode ) const;
+
+ /** Ebnable Motion detect mode and interrupt handler
+ * @return status of command
+ * TODO - need to implement function
*/
- MMA845x_DATA getXYZ(void) const;
-
- void enableDataReadyMode(void) const;
- void enableMotionMode(void) const;
- void enablePulseMode(void) const;
- void enableOrientationMode(void) const;
- void enableTransitMode(void) const;
- void enableAutoSleepMode(void) const;
- void enableFIFOMode(void) const;
-
- /** Put the MMA845x in the lowest possible power mode and suspend operation
+ uint8_t enableMotionDetect(void) const;
+
+ /** Enable Pulse Detect mode and interrupt handler
+ * @return status of command
+ * TODO - need to implement function
+ */
+ uint8_t enablePulseDetect(void) const;
+
+ /** Enable Orientation mode and interrupt handler
+ * @return status of command
+ * TODO - need to implement function
*/
- void disable(void);
+ uint8_t enableOrientationDetect(void) const;
+
+ /** Enable Transient detect mode and interrupt handler
+ * @return status of command
+ * TODO - need to implement function
+ */
+ uint8_t enableTransientDetect(void) const;
+
+ /** Enable Autosleep function and interrupt handler
+ * @return status of command
+ * TODO - need to implement function
+ */
+ uint8_t enableAutoSleep(void) const;
+
+ /** Enbale FIFO function and interrupt handler
+ * @return status of command
+ * TODO - need to implement function
+ */
+ uint8_t enableFIFO(void) const;
- /** Write to a register (exposed for debugging reasons)
- * Note: most writes are only valid in stop mode
- * @param reg - The register to be written
- * @param data - The data to be written
+ /** Put the MMA845x in the Standby mode
+ * @return status of command
*/
- void writeRegister(uint8_t const reg, uint8_t const data) const;
+ uint8_t standbyMode(void) const;
+
+ /** Put the MMA845x in the active mode
+ * @return status of command
+ */
+ uint8_t activeMode(void) const;
- /** Read from a register (exposed for debugging reasons)
- * @param reg - The register to read from
- * @return The register contents
- */
- uint8_t readRegister(uint8_t const reg) const;
-
- /** print the register map and values to the console
- */
- void registerDump(void) const;
+ /** Check the MMA845x status register
+ * @return status byte
+ */
+ uint8_t getStatus(void) const;
+
private:
@@ -213,9 +362,26 @@
InterruptIn *_int1;
InterruptIn *_int2;
uint8_t _i2c_addr;
+ char _who_am_i;
MMA845x_DATA _data;
+ bool _polling_mode;
+
+ uint8_t init(void);
- void init(void) const;
+ /** Write to a register (exposed for debugging reasons)
+ * Note: most writes are only valid in stop mode
+ * @param reg - The register to be written
+ * @param data - The data to be written
+ */
+ uint8_t writeRegister(uint8_t const reg, uint8_t const data) const;
+
+ /** Read from a register (exposed for debugging reasons)
+ * @param reg - The register to read from
+ * @return The register contents
+ */
+ uint8_t readRegister(uint8_t const reg, uint8_t count, char* data) const;
+
+
};
#endif
