MMA8653 emulator for BBC micro:bit

Dependencies:   mbed

Revision:
0:157b6cf33ee8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat May 07 08:30:38 2016 +0000
@@ -0,0 +1,87 @@
+// MMA8653 emulator for BBC micro:bit
+#include "mbed.h"
+#include "mbed_assert.h"
+
+#if defined(TARGET_KL25Z)
+    PinName const SDA = PTE25;
+    PinName const SCL = PTE24;
+    PinName const INT1 = PTA14;
+#elif defined(TARGET_KL46Z)
+    PinName const SDA = PTE25;
+    PinName const SCL = PTE24;
+    PinName const INT1 = PTC5;
+#elif defined(TARGET_K20D50M)
+    PinName const SDA = PTB1;
+    PinName const SCL = PTB0;
+    PinName const INT1 = PTC6;
+#else
+    #error TARGET NOT DEFINED
+#endif
+
+RawSerial pc(USBTX, USBRX);
+DigitalOut led2(LED2);
+
+I2CSlave mma8653(I2C_SDA, I2C_SCL);
+DigitalOut mma8653_int1(D13, 0);
+
+I2C mma8451(SDA, SCL);
+DigitalIn mma8451_int1(INT1);
+
+#define MMA8653_DEFAULT_ADDR 0x3A
+
+#define MMA8653_OUT_X_MSB       0x01
+#define MMA8653_XYZ_DATA_CFG    0x0E
+#define MMA8653_CTRL_REG1       0x2A
+#define MMA8653_CTRL_REG2       0x2B
+#define MMA8653_CTRL_REG3       0x2C
+#define MMA8653_CTRL_REG4       0x2D
+#define MMA8653_CTRL_REG5       0x2E
+ 
+ int main() {
+    pc.baud(115200);
+    pc.printf("%s\n", __FILE__);
+
+    char data[6];
+    bool config = true;
+    bool sampleMMA8451 = false;
+    mma8653.address(MMA8653_DEFAULT_ADDR);
+    for(;;) {
+        switch (mma8653.receive()) {
+            case I2CSlave::WriteAddressed:
+                char buf[2];
+                if (config) {
+                    mma8653.read(buf, 2);
+                    mma8451.write(MMA8653_DEFAULT_ADDR, buf, 2);
+                    pc.printf(">> %02x %02x\n", buf[0], buf[1]);
+                    if (buf[0] == MMA8653_CTRL_REG1 && buf[1] != 0x00) {
+                        config = false;
+                        mma8653_int1 = 1;
+                        sampleMMA8451 = true;
+                    }
+                 } else {
+                    mma8653.read(buf, 1);
+                    pc.printf(">> %02x\n", buf[0]);
+                    MBED_ASSERT(buf[0] == MMA8653_OUT_X_MSB);
+                }
+               break;
+            case I2CSlave::ReadAddressed:
+                mma8653.write(data, 6);
+                led2 = !led2;
+                mma8653_int1 = 1;
+                sampleMMA8451 = true;
+                pc.printf("<< %02x %02x %02x %02x %02x %02x\n", data[0], data[1], data[2], data[3], data[4], data[5]);
+                MBED_ASSERT(config == false);
+                break;
+        }
+        if (sampleMMA8451 && mma8451_int1 == 0) {
+            static const char reg[1] = {MMA8653_OUT_X_MSB};
+            mma8451.write(MMA8653_DEFAULT_ADDR, reg, 1, true);
+            mma8451.read(MMA8653_DEFAULT_ADDR, data, sizeof(data));
+#if 0
+            data[1] &= 0xc0; data[3] &= 0xc0; data[5] &= 0xc0; // 14bit to 10bit
+#endif
+            sampleMMA8451 = false;
+            mma8653_int1 = 0;
+        }
+    }
+}