Norimasa Okamoto
/
emuMMA8653
MMA8653 emulator for BBC micro:bit
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; } } }