An example demonstrating the usage of the default FXOS8700CQ firmware configuration by Thomas Murphy. Uses interrupts to control flow and to cue access to the peripheral.

Dependencies:   FXOS8700CQ-AccOnly50hz mbed

Fork of fxos8700cq_example by Thomas Murphy

Committer:
julianhigginson
Date:
Fri Feb 05 00:35:44 2016 +0000
Revision:
1:d006ce66f663
Parent:
0:6c6060a8a2f6
working, approximately.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
trm 0:6c6060a8a2f6 1 #include "mbed.h"
trm 0:6c6060a8a2f6 2 #include "FXOS8700CQ.h"
trm 0:6c6060a8a2f6 3
trm 0:6c6060a8a2f6 4 #define DATA_RECORD_TIME_MS 1000
trm 0:6c6060a8a2f6 5
trm 0:6c6060a8a2f6 6 Serial pc(USBTX, USBRX); // Primary output to demonstrate library
trm 0:6c6060a8a2f6 7
trm 0:6c6060a8a2f6 8 // Pin names for FRDM-K64F
trm 0:6c6060a8a2f6 9 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
trm 0:6c6060a8a2f6 10
trm 0:6c6060a8a2f6 11 DigitalOut green(LED_GREEN); // waiting light
trm 0:6c6060a8a2f6 12 DigitalOut blue(LED_BLUE); // collection-in-progress light
trm 0:6c6060a8a2f6 13 DigitalOut red(LED_RED); // completed/error ligt
trm 0:6c6060a8a2f6 14
trm 0:6c6060a8a2f6 15 Timer t; // Microsecond timer, 32 bit int, maximum count of ~30 minutes
julianhigginson 1:d006ce66f663 16 //InterruptIn fxos_int1(PTC6); // unused, common with SW2 on FRDM-K64F
trm 0:6c6060a8a2f6 17 InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt
julianhigginson 1:d006ce66f663 18 //InterruptIn start_sw(PTA4); // switch SW3
trm 0:6c6060a8a2f6 19
trm 0:6c6060a8a2f6 20 // Interrupt status flags and data
trm 0:6c6060a8a2f6 21 bool fxos_int1_triggered = false;
trm 0:6c6060a8a2f6 22 bool fxos_int2_triggered = false;
trm 0:6c6060a8a2f6 23 uint32_t us_ellapsed = 0;
trm 0:6c6060a8a2f6 24 bool start_sw_triggered = false;
trm 0:6c6060a8a2f6 25
trm 0:6c6060a8a2f6 26 // Storage for the data from the sensor
trm 0:6c6060a8a2f6 27 SRAWDATA accel_data;
trm 0:6c6060a8a2f6 28 SRAWDATA magn_data;
trm 0:6c6060a8a2f6 29
julianhigginson 1:d006ce66f663 30 void print_reading()
trm 0:6c6060a8a2f6 31 {
julianhigginson 1:d006ce66f663 32 // pc.printf("%d A X:%5d,Y:%5d,Z:%5d M X:%5d,Y:%5d,Z:%5d\r\n",
julianhigginson 1:d006ce66f663 33 // us_ellapsed,
julianhigginson 1:d006ce66f663 34 // accel_data.x, accel_data.y, accel_data.z,
julianhigginson 1:d006ce66f663 35 // magn_data.x, magn_data.y, magn_data.z);
julianhigginson 1:d006ce66f663 36 pc.printf("%d A X:%5d,Y:%5d,Z:%5d \r\n",
julianhigginson 1:d006ce66f663 37 //pc.printf("%d A X:%5x,Y:%5x,Z:%5x \r\n",
julianhigginson 1:d006ce66f663 38 us_ellapsed/1000,
julianhigginson 1:d006ce66f663 39 accel_data.x, accel_data.y, accel_data.z);
trm 0:6c6060a8a2f6 40 }
trm 0:6c6060a8a2f6 41
julianhigginson 1:d006ce66f663 42
trm 0:6c6060a8a2f6 43 void trigger_fxos_int2(void)
trm 0:6c6060a8a2f6 44 {
trm 0:6c6060a8a2f6 45 us_ellapsed = t.read_us();
julianhigginson 1:d006ce66f663 46 fxos.get_data(&accel_data);
julianhigginson 1:d006ce66f663 47 print_reading();
trm 0:6c6060a8a2f6 48 }
trm 0:6c6060a8a2f6 49
trm 0:6c6060a8a2f6 50 int main(void)
trm 0:6c6060a8a2f6 51 {
trm 0:6c6060a8a2f6 52 // Setup
trm 0:6c6060a8a2f6 53 t.reset();
trm 0:6c6060a8a2f6 54 pc.baud(115200); // Print quickly! 200Hz x line of output data!
trm 0:6c6060a8a2f6 55
trm 0:6c6060a8a2f6 56 // Lights off (FRDM-K64F has active-low LEDs)
trm 0:6c6060a8a2f6 57 green.write(1);
trm 0:6c6060a8a2f6 58 red.write(1);
trm 0:6c6060a8a2f6 59 blue.write(1);
trm 0:6c6060a8a2f6 60
trm 0:6c6060a8a2f6 61 // Diagnostic printing of the FXOS WHOAMI register value
julianhigginson 1:d006ce66f663 62 pc.printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", fxos.get_whoami());
trm 0:6c6060a8a2f6 63
trm 0:6c6060a8a2f6 64 // Iterrupt for active-low interrupt line from FXOS
trm 0:6c6060a8a2f6 65 // Configured with only one interrupt on INT2 signaling Data-Ready
trm 0:6c6060a8a2f6 66 fxos_int2.fall(&trigger_fxos_int2);
julianhigginson 1:d006ce66f663 67
julianhigginson 1:d006ce66f663 68 pc.printf("Started data collection. Accelerometer at max %dg.\r\n", fxos.get_accel_scale());
julianhigginson 1:d006ce66f663 69
julianhigginson 1:d006ce66f663 70 pc.printf("FXOS8700CQ_CTRL_REG1 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_CTRL_REG1));
julianhigginson 1:d006ce66f663 71 pc.printf("FXOS8700CQ_CTRL_REG2 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_CTRL_REG2));
julianhigginson 1:d006ce66f663 72 pc.printf("FXOS8700CQ_CTRL_REG3 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_CTRL_REG3));
julianhigginson 1:d006ce66f663 73 pc.printf("FXOS8700CQ_CTRL_REG4 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_CTRL_REG4));
julianhigginson 1:d006ce66f663 74 pc.printf("FXOS8700CQ_CTRL_REG5 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_CTRL_REG5));
julianhigginson 1:d006ce66f663 75
julianhigginson 1:d006ce66f663 76 pc.printf("FXOS8700CQ_M_CTRL_REG1 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_M_CTRL_REG1));
julianhigginson 1:d006ce66f663 77 pc.printf("FXOS8700CQ_M_CTRL_REG2 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_M_CTRL_REG2));
julianhigginson 1:d006ce66f663 78 pc.printf("FXOS8700CQ_M_CTRL_REG3 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_M_CTRL_REG3));
julianhigginson 1:d006ce66f663 79
julianhigginson 1:d006ce66f663 80 pc.printf("FXOS8700CQ_XYZ_DATA_CFG 0x%02x\r\n", fxos.read_single_reg(FXOS8700CQ_XYZ_DATA_CFG));
julianhigginson 1:d006ce66f663 81
julianhigginson 1:d006ce66f663 82
julianhigginson 1:d006ce66f663 83
julianhigginson 1:d006ce66f663 84 fxos.get_data(&accel_data); // clear interrupt from device
julianhigginson 1:d006ce66f663 85
julianhigginson 1:d006ce66f663 86 t.start(); // start timer and enter collection loop
julianhigginson 1:d006ce66f663 87
trm 0:6c6060a8a2f6 88 fxos.enable();
trm 0:6c6060a8a2f6 89
julianhigginson 1:d006ce66f663 90 while(1) {
trm 0:6c6060a8a2f6 91 wait_us(500); // 1/10th the period of the 200Hz sample rate
trm 0:6c6060a8a2f6 92 }
trm 0:6c6060a8a2f6 93
trm 0:6c6060a8a2f6 94 }