ADXL basic test
Dependencies: mbed
Fork of BLE_UARTConsole by
Diff: main.cpp
- Revision:
- 7:7ba97abac55b
- Parent:
- 5:2607923acfa1
- Child:
- 8:8db3894cf5e6
--- a/main.cpp Tue Dec 09 09:08:27 2014 +0000 +++ b/main.cpp Wed Jan 21 22:21:32 2015 +0000 @@ -29,10 +29,43 @@ #define DEBUG(...) /* nothing */ #endif /* #if NEED_CONSOLE_OUTPUT */ + +// ACC Registers +#define ID0 0x00 +#define STATUS 0x0b +#define RESET 0x1f +#define INTMAP1 0x2a +#define INTMAP2 0x2b +#define FILTER_CTL 0x2c +#define POWER_CTL 0x2d + +#define WR_SPI 0x0A +#define RD_SPI 0x0B +#define DOWN 0 +#define UP 1 + BLEDevice ble; DigitalOut led1(LED1); UARTService *uart; +// function definitions +void drSub(); +uint8_t ACC_ReadReg( uint8_t reg ); +void ACC_WriteReg( uint8_t reg, uint8_t reg ); +uint32_t drFlag; +void ACC_GetXYZ12( int16_t *x, int16_t *y, int16_t *z); +void ACC_GetXYZ8( int8_t *x, int8_t *y, int8_t *z); +void retargetStdout(); + +// mbed hardware config +// CONFIGURE: +SPI spi(p11, p12, p13); // mosi, miso, sclk +DigitalOut cs(p14); +InterruptIn dr(p15); + + + + void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) { DEBUG("Disconnected!\n\r"); @@ -42,13 +75,25 @@ void periodicCallback(void) { - led1 = !led1; - DEBUG("ping\r\n"); + + led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ + } int main(void) { - led1 = 1; + // local variables + uint8_t reg; + + int8_t x8 = 0; + int8_t y8 = 0; + int8_t z8 = 0; + + int16_t x12 = 0; + int16_t y12 = 0; + int16_t z12 = 0; + + led1 = 1; Ticker ticker; ticker.attach(periodicCallback, 1); @@ -57,6 +102,8 @@ ble.onDisconnection(disconnectionCallback); uart = new UARTService(ble); + + /* setup advertising */ ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); @@ -68,8 +115,174 @@ ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ ble.startAdvertising(); + + retargetStdout(); + + + // mbed spi config + // spi 8 bits, mode 0, 1 MHz for adxl362 + spi.format(8,0); + // 5 MHz, max for acc - works fine + spi.frequency(5000000); + + // mbed interrupt config + // data ready for adxl362 + drFlag = 0; + dr.mode(PullDown); + dr.rise(&drSub); + __disable_irq(); + + // reset the adxl362 + wait_ms(100); + ACC_WriteReg(RESET, 0x52); + wait_ms(100); + + // read adxl362 registers + printf("\r\n"); + // read id register + reg = ACC_ReadReg(ID0); + printf("ID0 = 0x%X\r\n", reg); + reg = ACC_ReadReg(FILTER_CTL); + printf("FILTER_CTL = 0x%X\r\n", reg); + + // set adxl362 to 4g range, 25Hz + //ACC_WriteReg(FILTER_CTL,0x51); + // 2g, 25Hz + ACC_WriteReg(FILTER_CTL,0x11); + reg = ACC_ReadReg(FILTER_CTL); + printf("FILTER_CTL = 0x%X\r\n", reg); + + // map adxl362 interrupts + ACC_WriteReg(INTMAP1,0x01); + reg = ACC_ReadReg(INTMAP1); + printf("INTMAP1 = 0x%X\r\n", reg); + + // set adxl362 to measurement mode, ultralow noise + ACC_WriteReg(POWER_CTL,0x22); + reg = ACC_ReadReg(POWER_CTL); + printf("POWER_CTL = 0x%X\r\n", reg); + + // start continuous processing adxl362 data + __enable_irq(); + + + + + while (true) { + if(drFlag == 8) + { + ACC_GetXYZ8(&x8, &y8, &z8); + printf("%+04d %+04d %+04d\r\n", x8,y8,z8); + drFlag = 0; + } + + else if(drFlag == 12) + { + ACC_GetXYZ12(&x12, &y12, &z12); + printf("%+05d %+05d %+05d\r\n",x12, y12, z12); + //pc.printf("%04X, %04X, %04X\r\n", x12, y12, z12); + drFlag = 0; + } ble.waitForEvent(); } } + + +//////////////////////////////////////////////////////////////////////////////////// +// read 8-bit x,y,z data +//////////////////////////////////////////////////////////////////////////////////// + +void ACC_GetXYZ8(int8_t* x, int8_t* y, int8_t* z) +{ + + cs = DOWN; + spi.write(RD_SPI); + spi.write(0x08); + + *x = spi.write(0x00); + *y = spi.write(0x00); + *z = spi.write(0x00); + + cs = UP; +} + +//////////////////////////////////////////////////////////////////////////////////// +// read 12-bit x,y,z data +//////////////////////////////////////////////////////////////////////////////////// + + void ACC_GetXYZ12(int16_t* x, int16_t* y, int16_t* z) +{ + int16_t xyzVal[6] = {0, 0, 0, 0, 0, 0}; + + cs = DOWN; + spi.write(RD_SPI); + spi.write(0x0E); + + for (uint32_t i = 0; i < 6; i++) + { + xyzVal[i] = spi.write(0x00); + } + + *x = (xyzVal[1] << 8) + xyzVal[0]; + *y = (xyzVal[3] << 8) + xyzVal[2]; + *z = (xyzVal[5] << 8) + xyzVal[4]; + + cs = UP; +} + +//////////////////////////////////////////////////////////////////////////////////// +// read ACC 8-bit registers +//////////////////////////////////////////////////////////////////////////////////// + +uint8_t ACC_ReadReg( uint8_t reg ) +{ + cs = DOWN; + spi.write(RD_SPI); + spi.write(reg); + uint8_t val = spi.write(0x00); + cs = UP; + return (val); +} + +//////////////////////////////////////////////////////////////////////////////////// +// write ACC 8-bit register +//////////////////////////////////////////////////////////////////////////////////// + +void ACC_WriteReg( uint8_t reg, uint8_t cmd ) +{ + cs = DOWN; + spi.write(WR_SPI); + spi.write(reg); + spi.write(cmd); + cs = UP; +} + + /** + * Following a call to this function, all writes to stdout (such as from + * printf) get redirected to the outbound characteristic of this service. + * This might be very useful when wanting to receive debug messages over BLE. + * + * @Note: debug messages originating from printf() like calls are buffered + * before being sent out. A '\n' in the printf() triggers the buffer update + * to the underlying characteristic. + * + * @Note: long messages need to be chopped up into 20-byte updates so that + * they flow out completely with notifications. The receiver should be + * prepared to stitch these messages back. + */ + void retargetStdout() { + freopen("/blueart", "w", stdout); + } + +//////////////////////////////////////////////////////////////////////////////////// +// Handle data ready interrupt +// just sets data ready flag +//////////////////////////////////////////////////////////////////////////////////// + +void drSub() +{ + drFlag = 8; + //drFlag = 12; +}