MMA8653 emulator for BBC micro:bit

Dependencies:   mbed

main.cpp

Committer:
va009039
Date:
2016-05-07
Revision:
0:157b6cf33ee8

File content as of revision 0:157b6cf33ee8:

// 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;
        }
    }
}