MMA8653 emulator for BBC micro:bit

Dependencies:   mbed

Committer:
va009039
Date:
Sat May 07 08:30:38 2016 +0000
Revision:
0:157b6cf33ee8
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:157b6cf33ee8 1 // MMA8653 emulator for BBC micro:bit
va009039 0:157b6cf33ee8 2 #include "mbed.h"
va009039 0:157b6cf33ee8 3 #include "mbed_assert.h"
va009039 0:157b6cf33ee8 4
va009039 0:157b6cf33ee8 5 #if defined(TARGET_KL25Z)
va009039 0:157b6cf33ee8 6 PinName const SDA = PTE25;
va009039 0:157b6cf33ee8 7 PinName const SCL = PTE24;
va009039 0:157b6cf33ee8 8 PinName const INT1 = PTA14;
va009039 0:157b6cf33ee8 9 #elif defined(TARGET_KL46Z)
va009039 0:157b6cf33ee8 10 PinName const SDA = PTE25;
va009039 0:157b6cf33ee8 11 PinName const SCL = PTE24;
va009039 0:157b6cf33ee8 12 PinName const INT1 = PTC5;
va009039 0:157b6cf33ee8 13 #elif defined(TARGET_K20D50M)
va009039 0:157b6cf33ee8 14 PinName const SDA = PTB1;
va009039 0:157b6cf33ee8 15 PinName const SCL = PTB0;
va009039 0:157b6cf33ee8 16 PinName const INT1 = PTC6;
va009039 0:157b6cf33ee8 17 #else
va009039 0:157b6cf33ee8 18 #error TARGET NOT DEFINED
va009039 0:157b6cf33ee8 19 #endif
va009039 0:157b6cf33ee8 20
va009039 0:157b6cf33ee8 21 RawSerial pc(USBTX, USBRX);
va009039 0:157b6cf33ee8 22 DigitalOut led2(LED2);
va009039 0:157b6cf33ee8 23
va009039 0:157b6cf33ee8 24 I2CSlave mma8653(I2C_SDA, I2C_SCL);
va009039 0:157b6cf33ee8 25 DigitalOut mma8653_int1(D13, 0);
va009039 0:157b6cf33ee8 26
va009039 0:157b6cf33ee8 27 I2C mma8451(SDA, SCL);
va009039 0:157b6cf33ee8 28 DigitalIn mma8451_int1(INT1);
va009039 0:157b6cf33ee8 29
va009039 0:157b6cf33ee8 30 #define MMA8653_DEFAULT_ADDR 0x3A
va009039 0:157b6cf33ee8 31
va009039 0:157b6cf33ee8 32 #define MMA8653_OUT_X_MSB 0x01
va009039 0:157b6cf33ee8 33 #define MMA8653_XYZ_DATA_CFG 0x0E
va009039 0:157b6cf33ee8 34 #define MMA8653_CTRL_REG1 0x2A
va009039 0:157b6cf33ee8 35 #define MMA8653_CTRL_REG2 0x2B
va009039 0:157b6cf33ee8 36 #define MMA8653_CTRL_REG3 0x2C
va009039 0:157b6cf33ee8 37 #define MMA8653_CTRL_REG4 0x2D
va009039 0:157b6cf33ee8 38 #define MMA8653_CTRL_REG5 0x2E
va009039 0:157b6cf33ee8 39
va009039 0:157b6cf33ee8 40 int main() {
va009039 0:157b6cf33ee8 41 pc.baud(115200);
va009039 0:157b6cf33ee8 42 pc.printf("%s\n", __FILE__);
va009039 0:157b6cf33ee8 43
va009039 0:157b6cf33ee8 44 char data[6];
va009039 0:157b6cf33ee8 45 bool config = true;
va009039 0:157b6cf33ee8 46 bool sampleMMA8451 = false;
va009039 0:157b6cf33ee8 47 mma8653.address(MMA8653_DEFAULT_ADDR);
va009039 0:157b6cf33ee8 48 for(;;) {
va009039 0:157b6cf33ee8 49 switch (mma8653.receive()) {
va009039 0:157b6cf33ee8 50 case I2CSlave::WriteAddressed:
va009039 0:157b6cf33ee8 51 char buf[2];
va009039 0:157b6cf33ee8 52 if (config) {
va009039 0:157b6cf33ee8 53 mma8653.read(buf, 2);
va009039 0:157b6cf33ee8 54 mma8451.write(MMA8653_DEFAULT_ADDR, buf, 2);
va009039 0:157b6cf33ee8 55 pc.printf(">> %02x %02x\n", buf[0], buf[1]);
va009039 0:157b6cf33ee8 56 if (buf[0] == MMA8653_CTRL_REG1 && buf[1] != 0x00) {
va009039 0:157b6cf33ee8 57 config = false;
va009039 0:157b6cf33ee8 58 mma8653_int1 = 1;
va009039 0:157b6cf33ee8 59 sampleMMA8451 = true;
va009039 0:157b6cf33ee8 60 }
va009039 0:157b6cf33ee8 61 } else {
va009039 0:157b6cf33ee8 62 mma8653.read(buf, 1);
va009039 0:157b6cf33ee8 63 pc.printf(">> %02x\n", buf[0]);
va009039 0:157b6cf33ee8 64 MBED_ASSERT(buf[0] == MMA8653_OUT_X_MSB);
va009039 0:157b6cf33ee8 65 }
va009039 0:157b6cf33ee8 66 break;
va009039 0:157b6cf33ee8 67 case I2CSlave::ReadAddressed:
va009039 0:157b6cf33ee8 68 mma8653.write(data, 6);
va009039 0:157b6cf33ee8 69 led2 = !led2;
va009039 0:157b6cf33ee8 70 mma8653_int1 = 1;
va009039 0:157b6cf33ee8 71 sampleMMA8451 = true;
va009039 0:157b6cf33ee8 72 pc.printf("<< %02x %02x %02x %02x %02x %02x\n", data[0], data[1], data[2], data[3], data[4], data[5]);
va009039 0:157b6cf33ee8 73 MBED_ASSERT(config == false);
va009039 0:157b6cf33ee8 74 break;
va009039 0:157b6cf33ee8 75 }
va009039 0:157b6cf33ee8 76 if (sampleMMA8451 && mma8451_int1 == 0) {
va009039 0:157b6cf33ee8 77 static const char reg[1] = {MMA8653_OUT_X_MSB};
va009039 0:157b6cf33ee8 78 mma8451.write(MMA8653_DEFAULT_ADDR, reg, 1, true);
va009039 0:157b6cf33ee8 79 mma8451.read(MMA8653_DEFAULT_ADDR, data, sizeof(data));
va009039 0:157b6cf33ee8 80 #if 0
va009039 0:157b6cf33ee8 81 data[1] &= 0xc0; data[3] &= 0xc0; data[5] &= 0xc0; // 14bit to 10bit
va009039 0:157b6cf33ee8 82 #endif
va009039 0:157b6cf33ee8 83 sampleMMA8451 = false;
va009039 0:157b6cf33ee8 84 mma8653_int1 = 0;
va009039 0:157b6cf33ee8 85 }
va009039 0:157b6cf33ee8 86 }
va009039 0:157b6cf33ee8 87 }