MMA8653 emulator for BBC micro:bit

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
va009039
Date:
Sat May 07 08:30:38 2016 +0000
Commit message:
first commit

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 157b6cf33ee8 main.cpp
--- /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;
+        }
+    }
+}
diff -r 000000000000 -r 157b6cf33ee8 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat May 07 08:30:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/aae6fcc7d9bb
\ No newline at end of file