,,

Fork of Application by Daniel Sygut

Revision:
13:3dfb24be0612
Parent:
12:3a30cdffa27c
Child:
14:3eee9e20da88
--- a/main.cpp	Sun Jan 21 22:28:30 2018 +0000
+++ b/main.cpp	Thu Feb 15 11:30:54 2018 +0000
@@ -3,22 +3,89 @@
 #include "USBSerial.h"
 #include "MMA8451Q.h"
 
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+#define REG_WHO_AM_I      0x0D
+#define REG_CTRL_REG_1    0x2A
+#define REG_OUT_X_MSB     0x01
+#define REG_OUT_Y_MSB     0x03
+#define REG_OUT_Z_MSB     0x05
+#define UINT14_MAX        16383
+
 DigitalOut  myled(LED1);
 USBMouse mouse;
-//USBSerial serial;
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
+I2C m_i2c(PTE25,PTE24);
+  
+  
+  uint8_t getWhoAmI();
+  float getAccX();
+  float getAccY();
+  float getAccZ();
+  void getAccAllAxis(float * res);
+  void readRegs(int addr, uint8_t * data, int len);
+  void writeRegs(uint8_t * data, int len);
+  int16_t getAccAxis(uint8_t addr);
   
 int main() {
-    //USBSerial usbSerial;
-MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
     float x, y, z;
 
     while (1) {
-        x = (acc.getAccX()*10);
-        y = (acc.getAccY()*10);
-        z = (acc.getAccZ()*10);
+        x = (getAccX()*10);
+        y = (getAccY()*10);
+        z = (getAccZ()*10);
         printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x, y, z);
         mouse.move(x, y);
         wait(0.01);
     }
-}
\ No newline at end of file
+}
+
+
+void acc_Init()
+{
+    uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
+    writeRegs(data, 2);
+}
+
+uint8_t getWhoAmI()
+{
+    uint8_t who_am_i = 0;
+    readRegs(REG_WHO_AM_I, &who_am_i, 1);
+    return who_am_i;
+}
+float getAccX() 
+{
+    return (float(getAccAxis(REG_OUT_X_MSB))/4096.0);
+}
+float getAccY() 
+{
+    return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0);
+}
+float getAccZ() {
+    return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0);
+}
+void getAccAllAxis(float * res) {
+    res[0] = getAccX();
+    res[1] = getAccY();
+    res[2] = getAccZ();
+}
+int16_t getAccAxis(uint8_t addr) {
+    int16_t acc;
+    uint8_t res[2];
+    readRegs(addr, res, 2);
+
+    acc = (res[0] << 6) | (res[1] >> 2);
+    if (acc > UINT14_MAX/2)
+        acc -= UINT14_MAX;
+
+    return acc;
+}
+
+void readRegs(int addr, uint8_t * data, int len) {
+    char t[1] = {addr};
+    m_i2c.write(MMA8451_I2C_ADDRESS, t, 1, true);
+    m_i2c.read(MMA8451_I2C_ADDRESS, (char *)data, len);
+}
+
+void writeRegs(uint8_t * data, int len) {
+    m_i2c.write(MMA8451_I2C_ADDRESS, (char *)data, len);
+}