Norimasa Okamoto
/
emuMMA8653
MMA8653 emulator for BBC micro:bit
main.cpp@0:157b6cf33ee8, 2016-05-07 (annotated)
- Committer:
- va009039
- Date:
- Sat May 07 08:30:38 2016 +0000
- Revision:
- 0:157b6cf33ee8
first commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |