Added function to retrieve raw data from sensor

Dependencies:   MotionSensor

Dependents:   KL46_eCompass KL46_eCompass_TiltCompensed_Acel-Mag Ragnarok_2ejes compass_acc ... more

Fork of MMA8451Q by Emilio Monti

Revision:
6:d3f7851ff32e
Parent:
5:b8512e0de86b
--- a/MMA8451Q.cpp	Mon Apr 07 21:03:37 2014 +0000
+++ b/MMA8451Q.cpp	Fri May 16 18:21:49 2014 +0000
@@ -17,66 +17,81 @@
 */
 
 #include "MMA8451Q.h"
+#include "MotionSensor.h"
 
-#define REG_WHO_AM_I      0x0D
+#define REG_WHOAMI      0x0D
 #define REG_CTRL_REG_1    0x2A
+#define REG_DR_STATUS     0x00
 #define REG_OUT_X_MSB     0x01
 #define REG_OUT_Y_MSB     0x03
 #define REG_OUT_Z_MSB     0x05
 
 #define UINT14_MAX        16383
 
+float countsperG = 4096.0f; // default 2G range
+
 MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
     // activate the peripheral
-    uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
+    uint8_t data[2] = {REG_CTRL_REG_1, 0x00};
     writeRegs(data, 2);
 }
 
-
 MMA8451Q::~MMA8451Q() { }
 
-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::enable(void) {
+    uint8_t data[2];
+    readRegs( REG_CTRL_REG_1, &data[1], 1);
+    data[1] |= 0x01;
+    data[0] = REG_CTRL_REG_1;
+    writeRegs(data, 2);
 }
 
-float MMA8451Q::getAccX() {
-    return (float(getAccAxis(REG_OUT_X_MSB))/4096.0);
+void MMA8451Q::disable(void) {
+    uint8_t data[2];
+    readRegs( REG_CTRL_REG_1, &data[1], 1);
+    data[1] &= 0xFE;
+    data[0] = REG_CTRL_REG_1;
+    writeRegs(data, 2);
 }
 
-float MMA8451Q::getAccY() {
-    return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0);
-}
-
-float MMA8451Q::getAccZ() {
-    return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0);
+uint32_t MMA8451Q::whoAmI() {
+    uint8_t who_am_i = 0;
+    readRegs(REG_WHOAMI, &who_am_i, 1);
+    return (uint32_t) who_am_i;
 }
 
+uint32_t MMA8451Q::dataReady(void) {
+    uint8_t stat = 0;
+    readRegs(REG_DR_STATUS, &stat, 1);
+    return (uint32_t) stat;
+}
 
-void MMA8451Q::getAccAllAxis(float * res) {
-    res[0] = getAccX();
-    res[1] = getAccY();
-    res[2] = getAccZ();
+uint32_t MMA8451Q::sampleRate(uint32_t f) {
+    return(50); // for now sample rate is fixed at 50Hz
+}
+
+void MMA8451Q::getX(float * x) {
+    *x = (float(getAccAxis(REG_OUT_X_MSB)) / countsperG);
 }
 
-void MMA8451Q::getAccXYZraw(int16_t * d) {
-    int16_t acc;
-    uint8_t res[6];
-    readRegs(REG_OUT_X_MSB, res, 6);
+void MMA8451Q::getY(float * y) {
+    *y = (float(getAccAxis(REG_OUT_Y_MSB)) / countsperG);
+}
+
+void MMA8451Q::getZ(float * z) {
+    *z = (float(getAccAxis(REG_OUT_Z_MSB)) / countsperG);
+}
 
-    acc = (res[0] << 6) | (res[1] >> 2);
-    if (acc > UINT14_MAX/2)
-        acc -= UINT14_MAX;
-    d[0] = acc;
-    acc = (res[2] << 6) | (res[3] >> 2);
-    if (acc > UINT14_MAX/2)
-        acc -= UINT14_MAX;
-    d[1] = acc;
-    acc = (res[4] << 6) | (res[5] >> 2);
-    if (acc > UINT14_MAX/2)
-        acc -= UINT14_MAX;
-    d[2] = acc;
+void MMA8451Q::getX(int16_t * d) {
+    *d = getAccAxis(REG_OUT_X_MSB);
+}
+
+void MMA8451Q::getY(int16_t * d) {
+    *d = getAccAxis(REG_OUT_Y_MSB);
+}
+
+void MMA8451Q::getZ(int16_t * d) {
+    *d = getAccAxis(REG_OUT_Z_MSB);
 }
 
 int16_t MMA8451Q::getAccAxis(uint8_t addr) {
@@ -84,11 +99,38 @@
     uint8_t res[2];
     readRegs(addr, res, 2);
 
-    acc = (res[0] << 6) | (res[1] >> 2);
-    if (acc > UINT14_MAX/2)
-        acc -= UINT14_MAX;
+    acc = (res[0] << 8) | res[1];
+    acc = acc >> 2;
+    return acc;
+}
+
+
+void MMA8451Q::getAxis(MotionSensorDataUnits &data) {
+    int16_t t[3];
+    uint8_t res[6];
 
-    return acc;
+    readRegs(REG_OUT_X_MSB, res, 6);
+    t[0] = (res[0] << 8) | res[1];
+    t[1] = (res[2] << 8) | res[3];
+    t[2] = (res[4] << 8) | res[5];
+    data.x = ((float) (t[0] >> 2))  / countsperG;
+    data.y = ((float) (t[1] >> 2))  / countsperG;
+    data.z = ((float) (t[2] >> 2))  / countsperG;
+}
+
+
+void MMA8451Q::getAxis(MotionSensorDataCounts &data) {
+    int16_t acc;
+    uint8_t res[6];
+    readRegs(REG_OUT_X_MSB, res, 6);
+
+
+    acc = (res[0] << 8) | res[1];
+    data.x = acc >> 2;
+    acc = (res[2] << 8) | res[3];
+    data.y = acc >> 2;
+    acc = (res[4] << 8) | res[5];
+    data.z = acc >> 2;
 }
 
 void MMA8451Q::readRegs(int addr, uint8_t * data, int len) {