Icarus Sensors / Mbed 2 deprecated ADXL362_test

Dependencies:   mbed

Fork of BLE_UARTConsole by Bluetooth Low Energy

Committer:
smigielski
Date:
Wed Jan 21 22:21:32 2015 +0000
Revision:
7:7ba97abac55b
Parent:
5:2607923acfa1
Child:
8:8db3894cf5e6
Initial version of ADXL tests;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:2130d7f559dc 1 /* mbed Microcontroller Library
rgrover1 0:2130d7f559dc 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:2130d7f559dc 3 *
rgrover1 0:2130d7f559dc 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:2130d7f559dc 5 * you may not use this file except in compliance with the License.
rgrover1 0:2130d7f559dc 6 * You may obtain a copy of the License at
rgrover1 0:2130d7f559dc 7 *
rgrover1 0:2130d7f559dc 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:2130d7f559dc 9 *
rgrover1 0:2130d7f559dc 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:2130d7f559dc 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:2130d7f559dc 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:2130d7f559dc 13 * See the License for the specific language governing permissions and
rgrover1 0:2130d7f559dc 14 * limitations under the License.
rgrover1 0:2130d7f559dc 15 */
rgrover1 0:2130d7f559dc 16
rgrover1 5:2607923acfa1 17 #include <string.h>
rgrover1 0:2130d7f559dc 18 #include "mbed.h"
rgrover1 0:2130d7f559dc 19 #include "BLEDevice.h"
rgrover1 0:2130d7f559dc 20
rgrover1 0:2130d7f559dc 21 #include "UARTService.h"
rgrover1 0:2130d7f559dc 22
rgrover1 0:2130d7f559dc 23 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
rgrover1 0:2130d7f559dc 24 * it will have an impact on code-size and power consumption. */
rgrover1 0:2130d7f559dc 25
rgrover1 0:2130d7f559dc 26 #if NEED_CONSOLE_OUTPUT
rgrover1 5:2607923acfa1 27 #define DEBUG(STR) { if (uart) uart->write(STR, strlen(STR)); }
rgrover1 0:2130d7f559dc 28 #else
rgrover1 0:2130d7f559dc 29 #define DEBUG(...) /* nothing */
rgrover1 0:2130d7f559dc 30 #endif /* #if NEED_CONSOLE_OUTPUT */
rgrover1 0:2130d7f559dc 31
smigielski 7:7ba97abac55b 32
smigielski 7:7ba97abac55b 33 // ACC Registers
smigielski 7:7ba97abac55b 34 #define ID0 0x00
smigielski 7:7ba97abac55b 35 #define STATUS 0x0b
smigielski 7:7ba97abac55b 36 #define RESET 0x1f
smigielski 7:7ba97abac55b 37 #define INTMAP1 0x2a
smigielski 7:7ba97abac55b 38 #define INTMAP2 0x2b
smigielski 7:7ba97abac55b 39 #define FILTER_CTL 0x2c
smigielski 7:7ba97abac55b 40 #define POWER_CTL 0x2d
smigielski 7:7ba97abac55b 41
smigielski 7:7ba97abac55b 42 #define WR_SPI 0x0A
smigielski 7:7ba97abac55b 43 #define RD_SPI 0x0B
smigielski 7:7ba97abac55b 44 #define DOWN 0
smigielski 7:7ba97abac55b 45 #define UP 1
smigielski 7:7ba97abac55b 46
rgrover1 0:2130d7f559dc 47 BLEDevice ble;
rgrover1 0:2130d7f559dc 48 DigitalOut led1(LED1);
rgrover1 5:2607923acfa1 49 UARTService *uart;
rgrover1 0:2130d7f559dc 50
smigielski 7:7ba97abac55b 51 // function definitions
smigielski 7:7ba97abac55b 52 void drSub();
smigielski 7:7ba97abac55b 53 uint8_t ACC_ReadReg( uint8_t reg );
smigielski 7:7ba97abac55b 54 void ACC_WriteReg( uint8_t reg, uint8_t reg );
smigielski 7:7ba97abac55b 55 uint32_t drFlag;
smigielski 7:7ba97abac55b 56 void ACC_GetXYZ12( int16_t *x, int16_t *y, int16_t *z);
smigielski 7:7ba97abac55b 57 void ACC_GetXYZ8( int8_t *x, int8_t *y, int8_t *z);
smigielski 7:7ba97abac55b 58 void retargetStdout();
smigielski 7:7ba97abac55b 59
smigielski 7:7ba97abac55b 60 // mbed hardware config
smigielski 7:7ba97abac55b 61 // CONFIGURE:
smigielski 7:7ba97abac55b 62 SPI spi(p11, p12, p13); // mosi, miso, sclk
smigielski 7:7ba97abac55b 63 DigitalOut cs(p14);
smigielski 7:7ba97abac55b 64 InterruptIn dr(p15);
smigielski 7:7ba97abac55b 65
smigielski 7:7ba97abac55b 66
smigielski 7:7ba97abac55b 67
smigielski 7:7ba97abac55b 68
rgrover1 0:2130d7f559dc 69 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
rgrover1 0:2130d7f559dc 70 {
rgrover1 0:2130d7f559dc 71 DEBUG("Disconnected!\n\r");
rgrover1 0:2130d7f559dc 72 DEBUG("Restarting the advertising process\n\r");
rgrover1 0:2130d7f559dc 73 ble.startAdvertising();
rgrover1 0:2130d7f559dc 74 }
rgrover1 0:2130d7f559dc 75
rgrover1 0:2130d7f559dc 76 void periodicCallback(void)
rgrover1 0:2130d7f559dc 77 {
smigielski 7:7ba97abac55b 78
smigielski 7:7ba97abac55b 79 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
smigielski 7:7ba97abac55b 80
rgrover1 0:2130d7f559dc 81 }
rgrover1 0:2130d7f559dc 82
rgrover1 0:2130d7f559dc 83 int main(void)
rgrover1 0:2130d7f559dc 84 {
smigielski 7:7ba97abac55b 85 // local variables
smigielski 7:7ba97abac55b 86 uint8_t reg;
smigielski 7:7ba97abac55b 87
smigielski 7:7ba97abac55b 88 int8_t x8 = 0;
smigielski 7:7ba97abac55b 89 int8_t y8 = 0;
smigielski 7:7ba97abac55b 90 int8_t z8 = 0;
smigielski 7:7ba97abac55b 91
smigielski 7:7ba97abac55b 92 int16_t x12 = 0;
smigielski 7:7ba97abac55b 93 int16_t y12 = 0;
smigielski 7:7ba97abac55b 94 int16_t z12 = 0;
smigielski 7:7ba97abac55b 95
smigielski 7:7ba97abac55b 96 led1 = 1;
rgrover1 0:2130d7f559dc 97 Ticker ticker;
rgrover1 0:2130d7f559dc 98 ticker.attach(periodicCallback, 1);
rgrover1 0:2130d7f559dc 99
rgrover1 0:2130d7f559dc 100 DEBUG("Initialising the nRF51822\n\r");
rgrover1 0:2130d7f559dc 101 ble.init();
rgrover1 0:2130d7f559dc 102 ble.onDisconnection(disconnectionCallback);
rgrover1 5:2607923acfa1 103
rgrover1 5:2607923acfa1 104 uart = new UARTService(ble);
smigielski 7:7ba97abac55b 105
smigielski 7:7ba97abac55b 106
rgrover1 0:2130d7f559dc 107
rgrover1 0:2130d7f559dc 108 /* setup advertising */
rgrover1 0:2130d7f559dc 109 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
rgrover1 0:2130d7f559dc 110 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
rgrover1 0:2130d7f559dc 111 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
rgrover1 0:2130d7f559dc 112 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
rgrover1 0:2130d7f559dc 113 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 0:2130d7f559dc 114 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
rgrover1 0:2130d7f559dc 115
rgrover1 0:2130d7f559dc 116 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
rgrover1 0:2130d7f559dc 117 ble.startAdvertising();
smigielski 7:7ba97abac55b 118
smigielski 7:7ba97abac55b 119 retargetStdout();
smigielski 7:7ba97abac55b 120
smigielski 7:7ba97abac55b 121
smigielski 7:7ba97abac55b 122 // mbed spi config
smigielski 7:7ba97abac55b 123 // spi 8 bits, mode 0, 1 MHz for adxl362
smigielski 7:7ba97abac55b 124 spi.format(8,0);
smigielski 7:7ba97abac55b 125 // 5 MHz, max for acc - works fine
smigielski 7:7ba97abac55b 126 spi.frequency(5000000);
smigielski 7:7ba97abac55b 127
smigielski 7:7ba97abac55b 128 // mbed interrupt config
smigielski 7:7ba97abac55b 129 // data ready for adxl362
smigielski 7:7ba97abac55b 130 drFlag = 0;
smigielski 7:7ba97abac55b 131 dr.mode(PullDown);
smigielski 7:7ba97abac55b 132 dr.rise(&drSub);
smigielski 7:7ba97abac55b 133 __disable_irq();
smigielski 7:7ba97abac55b 134
smigielski 7:7ba97abac55b 135 // reset the adxl362
smigielski 7:7ba97abac55b 136 wait_ms(100);
smigielski 7:7ba97abac55b 137 ACC_WriteReg(RESET, 0x52);
smigielski 7:7ba97abac55b 138 wait_ms(100);
smigielski 7:7ba97abac55b 139
smigielski 7:7ba97abac55b 140 // read adxl362 registers
smigielski 7:7ba97abac55b 141 printf("\r\n");
smigielski 7:7ba97abac55b 142 // read id register
smigielski 7:7ba97abac55b 143 reg = ACC_ReadReg(ID0);
smigielski 7:7ba97abac55b 144 printf("ID0 = 0x%X\r\n", reg);
smigielski 7:7ba97abac55b 145 reg = ACC_ReadReg(FILTER_CTL);
smigielski 7:7ba97abac55b 146 printf("FILTER_CTL = 0x%X\r\n", reg);
smigielski 7:7ba97abac55b 147
smigielski 7:7ba97abac55b 148 // set adxl362 to 4g range, 25Hz
smigielski 7:7ba97abac55b 149 //ACC_WriteReg(FILTER_CTL,0x51);
smigielski 7:7ba97abac55b 150 // 2g, 25Hz
smigielski 7:7ba97abac55b 151 ACC_WriteReg(FILTER_CTL,0x11);
smigielski 7:7ba97abac55b 152 reg = ACC_ReadReg(FILTER_CTL);
smigielski 7:7ba97abac55b 153 printf("FILTER_CTL = 0x%X\r\n", reg);
smigielski 7:7ba97abac55b 154
smigielski 7:7ba97abac55b 155 // map adxl362 interrupts
smigielski 7:7ba97abac55b 156 ACC_WriteReg(INTMAP1,0x01);
smigielski 7:7ba97abac55b 157 reg = ACC_ReadReg(INTMAP1);
smigielski 7:7ba97abac55b 158 printf("INTMAP1 = 0x%X\r\n", reg);
smigielski 7:7ba97abac55b 159
smigielski 7:7ba97abac55b 160 // set adxl362 to measurement mode, ultralow noise
smigielski 7:7ba97abac55b 161 ACC_WriteReg(POWER_CTL,0x22);
smigielski 7:7ba97abac55b 162 reg = ACC_ReadReg(POWER_CTL);
smigielski 7:7ba97abac55b 163 printf("POWER_CTL = 0x%X\r\n", reg);
smigielski 7:7ba97abac55b 164
smigielski 7:7ba97abac55b 165 // start continuous processing adxl362 data
smigielski 7:7ba97abac55b 166 __enable_irq();
smigielski 7:7ba97abac55b 167
smigielski 7:7ba97abac55b 168
smigielski 7:7ba97abac55b 169
smigielski 7:7ba97abac55b 170
smigielski 7:7ba97abac55b 171
rgrover1 0:2130d7f559dc 172
rgrover1 0:2130d7f559dc 173 while (true) {
smigielski 7:7ba97abac55b 174 if(drFlag == 8)
smigielski 7:7ba97abac55b 175 {
smigielski 7:7ba97abac55b 176 ACC_GetXYZ8(&x8, &y8, &z8);
smigielski 7:7ba97abac55b 177 printf("%+04d %+04d %+04d\r\n", x8,y8,z8);
smigielski 7:7ba97abac55b 178 drFlag = 0;
smigielski 7:7ba97abac55b 179 }
smigielski 7:7ba97abac55b 180
smigielski 7:7ba97abac55b 181 else if(drFlag == 12)
smigielski 7:7ba97abac55b 182 {
smigielski 7:7ba97abac55b 183 ACC_GetXYZ12(&x12, &y12, &z12);
smigielski 7:7ba97abac55b 184 printf("%+05d %+05d %+05d\r\n",x12, y12, z12);
smigielski 7:7ba97abac55b 185 //pc.printf("%04X, %04X, %04X\r\n", x12, y12, z12);
smigielski 7:7ba97abac55b 186 drFlag = 0;
smigielski 7:7ba97abac55b 187 }
rgrover1 0:2130d7f559dc 188 ble.waitForEvent();
rgrover1 0:2130d7f559dc 189 }
rgrover1 0:2130d7f559dc 190 }
smigielski 7:7ba97abac55b 191
smigielski 7:7ba97abac55b 192
smigielski 7:7ba97abac55b 193 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 194 // read 8-bit x,y,z data
smigielski 7:7ba97abac55b 195 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 196
smigielski 7:7ba97abac55b 197 void ACC_GetXYZ8(int8_t* x, int8_t* y, int8_t* z)
smigielski 7:7ba97abac55b 198 {
smigielski 7:7ba97abac55b 199
smigielski 7:7ba97abac55b 200 cs = DOWN;
smigielski 7:7ba97abac55b 201 spi.write(RD_SPI);
smigielski 7:7ba97abac55b 202 spi.write(0x08);
smigielski 7:7ba97abac55b 203
smigielski 7:7ba97abac55b 204 *x = spi.write(0x00);
smigielski 7:7ba97abac55b 205 *y = spi.write(0x00);
smigielski 7:7ba97abac55b 206 *z = spi.write(0x00);
smigielski 7:7ba97abac55b 207
smigielski 7:7ba97abac55b 208 cs = UP;
smigielski 7:7ba97abac55b 209 }
smigielski 7:7ba97abac55b 210
smigielski 7:7ba97abac55b 211 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 212 // read 12-bit x,y,z data
smigielski 7:7ba97abac55b 213 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 214
smigielski 7:7ba97abac55b 215 void ACC_GetXYZ12(int16_t* x, int16_t* y, int16_t* z)
smigielski 7:7ba97abac55b 216 {
smigielski 7:7ba97abac55b 217 int16_t xyzVal[6] = {0, 0, 0, 0, 0, 0};
smigielski 7:7ba97abac55b 218
smigielski 7:7ba97abac55b 219 cs = DOWN;
smigielski 7:7ba97abac55b 220 spi.write(RD_SPI);
smigielski 7:7ba97abac55b 221 spi.write(0x0E);
smigielski 7:7ba97abac55b 222
smigielski 7:7ba97abac55b 223 for (uint32_t i = 0; i < 6; i++)
smigielski 7:7ba97abac55b 224 {
smigielski 7:7ba97abac55b 225 xyzVal[i] = spi.write(0x00);
smigielski 7:7ba97abac55b 226 }
smigielski 7:7ba97abac55b 227
smigielski 7:7ba97abac55b 228 *x = (xyzVal[1] << 8) + xyzVal[0];
smigielski 7:7ba97abac55b 229 *y = (xyzVal[3] << 8) + xyzVal[2];
smigielski 7:7ba97abac55b 230 *z = (xyzVal[5] << 8) + xyzVal[4];
smigielski 7:7ba97abac55b 231
smigielski 7:7ba97abac55b 232 cs = UP;
smigielski 7:7ba97abac55b 233 }
smigielski 7:7ba97abac55b 234
smigielski 7:7ba97abac55b 235 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 236 // read ACC 8-bit registers
smigielski 7:7ba97abac55b 237 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 238
smigielski 7:7ba97abac55b 239 uint8_t ACC_ReadReg( uint8_t reg )
smigielski 7:7ba97abac55b 240 {
smigielski 7:7ba97abac55b 241 cs = DOWN;
smigielski 7:7ba97abac55b 242 spi.write(RD_SPI);
smigielski 7:7ba97abac55b 243 spi.write(reg);
smigielski 7:7ba97abac55b 244 uint8_t val = spi.write(0x00);
smigielski 7:7ba97abac55b 245 cs = UP;
smigielski 7:7ba97abac55b 246 return (val);
smigielski 7:7ba97abac55b 247 }
smigielski 7:7ba97abac55b 248
smigielski 7:7ba97abac55b 249 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 250 // write ACC 8-bit register
smigielski 7:7ba97abac55b 251 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 252
smigielski 7:7ba97abac55b 253 void ACC_WriteReg( uint8_t reg, uint8_t cmd )
smigielski 7:7ba97abac55b 254 {
smigielski 7:7ba97abac55b 255 cs = DOWN;
smigielski 7:7ba97abac55b 256 spi.write(WR_SPI);
smigielski 7:7ba97abac55b 257 spi.write(reg);
smigielski 7:7ba97abac55b 258 spi.write(cmd);
smigielski 7:7ba97abac55b 259 cs = UP;
smigielski 7:7ba97abac55b 260 }
smigielski 7:7ba97abac55b 261
smigielski 7:7ba97abac55b 262 /**
smigielski 7:7ba97abac55b 263 * Following a call to this function, all writes to stdout (such as from
smigielski 7:7ba97abac55b 264 * printf) get redirected to the outbound characteristic of this service.
smigielski 7:7ba97abac55b 265 * This might be very useful when wanting to receive debug messages over BLE.
smigielski 7:7ba97abac55b 266 *
smigielski 7:7ba97abac55b 267 * @Note: debug messages originating from printf() like calls are buffered
smigielski 7:7ba97abac55b 268 * before being sent out. A '\n' in the printf() triggers the buffer update
smigielski 7:7ba97abac55b 269 * to the underlying characteristic.
smigielski 7:7ba97abac55b 270 *
smigielski 7:7ba97abac55b 271 * @Note: long messages need to be chopped up into 20-byte updates so that
smigielski 7:7ba97abac55b 272 * they flow out completely with notifications. The receiver should be
smigielski 7:7ba97abac55b 273 * prepared to stitch these messages back.
smigielski 7:7ba97abac55b 274 */
smigielski 7:7ba97abac55b 275 void retargetStdout() {
smigielski 7:7ba97abac55b 276 freopen("/blueart", "w", stdout);
smigielski 7:7ba97abac55b 277 }
smigielski 7:7ba97abac55b 278
smigielski 7:7ba97abac55b 279 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 280 // Handle data ready interrupt
smigielski 7:7ba97abac55b 281 // just sets data ready flag
smigielski 7:7ba97abac55b 282 ////////////////////////////////////////////////////////////////////////////////////
smigielski 7:7ba97abac55b 283
smigielski 7:7ba97abac55b 284 void drSub()
smigielski 7:7ba97abac55b 285 {
smigielski 7:7ba97abac55b 286 drFlag = 8;
smigielski 7:7ba97abac55b 287 //drFlag = 12;
smigielski 7:7ba97abac55b 288 }