This project logs 6-axis data to a connected SD card for later analysis. This project demonstrates the use of the SD file system, I2C as well as interrupt input and digital input/output.
Dependencies: SDFileSystem mbed
main.cpp@0:fe17733d483f, 2015-07-27 (annotated)
- Committer:
- Kas_Lewis
- Date:
- Mon Jul 27 17:20:03 2015 +0000
- Revision:
- 0:fe17733d483f
This is a working version of a 6-axis data logger using the FRDM-KL25Z and the FRDM-STBC-AGM01 that contains a FXOS8700C and FXAS8700C. The data is logged to a .txt file on a SD card for plotting on a PC at a later date.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Kas_Lewis | 0:fe17733d483f | 1 | #include "mbed.h" |
Kas_Lewis | 0:fe17733d483f | 2 | #include "SDFileSystem.h" |
Kas_Lewis | 0:fe17733d483f | 3 | |
Kas_Lewis | 0:fe17733d483f | 4 | //FXOS8700CQ |
Kas_Lewis | 0:fe17733d483f | 5 | #define FXOS_ADDRESS_W 0x3C |
Kas_Lewis | 0:fe17733d483f | 6 | #define FXOS_ADDRESS_R 0x3D |
Kas_Lewis | 0:fe17733d483f | 7 | #define FXOS_STATUS 0x00 |
Kas_Lewis | 0:fe17733d483f | 8 | #define FXOS_OUT_X_MSB 0x01 |
Kas_Lewis | 0:fe17733d483f | 9 | #define FXOS_F_SETUP 0x09 |
Kas_Lewis | 0:fe17733d483f | 10 | #define FXOS_TRIG_CFG 0x0A |
Kas_Lewis | 0:fe17733d483f | 11 | #define FXOS_SYS_MOD 0x0B |
Kas_Lewis | 0:fe17733d483f | 12 | #define FXOS_INT_SOURCE 0x0C |
Kas_Lewis | 0:fe17733d483f | 13 | #define FXOS_WHO_AM_I 0x0D |
Kas_Lewis | 0:fe17733d483f | 14 | #define FXOS_ID 0xC7 |
Kas_Lewis | 0:fe17733d483f | 15 | #define FXOS_XYZ_DATA_CFG 0x0E |
Kas_Lewis | 0:fe17733d483f | 16 | #define FXOS_TRANSIENT_CFG 0x1D |
Kas_Lewis | 0:fe17733d483f | 17 | #define FXOS_TRANSIENT_SRC 0x1E |
Kas_Lewis | 0:fe17733d483f | 18 | #define FXOS_ASLP_COUNT 0x29 |
Kas_Lewis | 0:fe17733d483f | 19 | #define FXOS_CTRL_REG_1 0x2A |
Kas_Lewis | 0:fe17733d483f | 20 | #define FXOS_CTRL_REG_2 0x2B |
Kas_Lewis | 0:fe17733d483f | 21 | #define FXOS_CTRL_REG_3 0x2C |
Kas_Lewis | 0:fe17733d483f | 22 | #define FXOS_CTRL_REG_4 0x2D |
Kas_Lewis | 0:fe17733d483f | 23 | #define FXOS_CTRL_REG_5 0x2E |
Kas_Lewis | 0:fe17733d483f | 24 | #define FXOS_OFF_X 0x2F |
Kas_Lewis | 0:fe17733d483f | 25 | #define FXOS_OFF_Y 0x30 |
Kas_Lewis | 0:fe17733d483f | 26 | #define FXOS_OFF_Z 0x31 |
Kas_Lewis | 0:fe17733d483f | 27 | #define FXOS_TEMP 0x51 |
Kas_Lewis | 0:fe17733d483f | 28 | #define FXOS_M_CTRL_REG_1 0x5B |
Kas_Lewis | 0:fe17733d483f | 29 | #define FXOS_M_CTRL_REG_2 0x5C |
Kas_Lewis | 0:fe17733d483f | 30 | #define FXOS_M_CTRL_REG_3 0x5D |
Kas_Lewis | 0:fe17733d483f | 31 | |
Kas_Lewis | 0:fe17733d483f | 32 | //FXAS21002C |
Kas_Lewis | 0:fe17733d483f | 33 | #define FXAS_ADDRESS_W 0x40 |
Kas_Lewis | 0:fe17733d483f | 34 | #define FXAS_ADDRESS_R 0x41 |
Kas_Lewis | 0:fe17733d483f | 35 | #define FXAS_STATUS 0x00 |
Kas_Lewis | 0:fe17733d483f | 36 | #define FXAS_OUT_X_MSB 0x01 |
Kas_Lewis | 0:fe17733d483f | 37 | #define FXAS_F_SETUP 0x09 |
Kas_Lewis | 0:fe17733d483f | 38 | #define FXAS_F_EVENT 0x0A |
Kas_Lewis | 0:fe17733d483f | 39 | #define FXAS_INT_SRC_FLAG 0x0B |
Kas_Lewis | 0:fe17733d483f | 40 | #define FXAS_WHO_AM_I 0x0C |
Kas_Lewis | 0:fe17733d483f | 41 | #define FXAS_ID 0xD7 |
Kas_Lewis | 0:fe17733d483f | 42 | #define FXAS_CTRL_REG_0 0x0D |
Kas_Lewis | 0:fe17733d483f | 43 | #define FXAS_RT_CFG 0x0E |
Kas_Lewis | 0:fe17733d483f | 44 | #define FXAS_TEMP 0x12 |
Kas_Lewis | 0:fe17733d483f | 45 | #define FXAS_CTRL_REG_1 0x13 |
Kas_Lewis | 0:fe17733d483f | 46 | #define FXAS_CTRL_REG_2 0x14 |
Kas_Lewis | 0:fe17733d483f | 47 | #define FXAS_CTRL_REG_3 0x15 |
Kas_Lewis | 0:fe17733d483f | 48 | |
Kas_Lewis | 0:fe17733d483f | 49 | //Global variables |
Kas_Lewis | 0:fe17733d483f | 50 | int FXAS_FIFO_FULL_FLAG = 0; |
Kas_Lewis | 0:fe17733d483f | 51 | int FXOS_FIFO_FULL_FLAG = 0; |
Kas_Lewis | 0:fe17733d483f | 52 | char fxos_data_1[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
Kas_Lewis | 0:fe17733d483f | 53 | char fxas_data_1[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
Kas_Lewis | 0:fe17733d483f | 54 | |
Kas_Lewis | 0:fe17733d483f | 55 | //Setup UART to PC |
Kas_Lewis | 0:fe17733d483f | 56 | Serial pc(USBTX, USBRX); |
Kas_Lewis | 0:fe17733d483f | 57 | |
Kas_Lewis | 0:fe17733d483f | 58 | //Setup I2C |
Kas_Lewis | 0:fe17733d483f | 59 | I2C sensors(PTE0, PTE1); |
Kas_Lewis | 0:fe17733d483f | 60 | |
Kas_Lewis | 0:fe17733d483f | 61 | //FXOS8700C Control Pins |
Kas_Lewis | 0:fe17733d483f | 62 | InterruptIn fxos_int1_8700(PTD4); //INT1-8700 |
Kas_Lewis | 0:fe17733d483f | 63 | InterruptIn fxos_int2_8700(PTA4); //INT2-8700 |
Kas_Lewis | 0:fe17733d483f | 64 | |
Kas_Lewis | 0:fe17733d483f | 65 | //FXAS21002C Control Pins |
Kas_Lewis | 0:fe17733d483f | 66 | InterruptIn fxas_int1_21002(PTA5); //INT1-21002 |
Kas_Lewis | 0:fe17733d483f | 67 | InterruptIn fxas_int2_21002(PTA13); //INT2-21002 |
Kas_Lewis | 0:fe17733d483f | 68 | |
Kas_Lewis | 0:fe17733d483f | 69 | //SD File System |
Kas_Lewis | 0:fe17733d483f | 70 | SDFileSystem sd(PTD2, PTD3, PTD1, PTD0, "sd"); |
Kas_Lewis | 0:fe17733d483f | 71 | |
Kas_Lewis | 0:fe17733d483f | 72 | ////LED Setup |
Kas_Lewis | 0:fe17733d483f | 73 | DigitalOut led_1(LED1, 1); //red |
Kas_Lewis | 0:fe17733d483f | 74 | DigitalOut led_2(LED2, 1); //green |
Kas_Lewis | 0:fe17733d483f | 75 | //DigitalOut led_3(LED3, 1); //blue <- NB!! Wont play nice with SDFileSystem |
Kas_Lewis | 0:fe17733d483f | 76 | |
Kas_Lewis | 0:fe17733d483f | 77 | //****************************************************************// |
Kas_Lewis | 0:fe17733d483f | 78 | //Functions |
Kas_Lewis | 0:fe17733d483f | 79 | int i2c_write(char address, char device_register, char data){ |
Kas_Lewis | 0:fe17733d483f | 80 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 81 | sensors.write((char)address); |
Kas_Lewis | 0:fe17733d483f | 82 | sensors.write((char)device_register); |
Kas_Lewis | 0:fe17733d483f | 83 | sensors.write((char)data); |
Kas_Lewis | 0:fe17733d483f | 84 | sensors.stop(); |
Kas_Lewis | 0:fe17733d483f | 85 | return 0; |
Kas_Lewis | 0:fe17733d483f | 86 | } |
Kas_Lewis | 0:fe17733d483f | 87 | |
Kas_Lewis | 0:fe17733d483f | 88 | int i2c_write(char address, char device_register, int stop){ |
Kas_Lewis | 0:fe17733d483f | 89 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 90 | sensors.write((char)address); |
Kas_Lewis | 0:fe17733d483f | 91 | sensors.write((char)device_register); |
Kas_Lewis | 0:fe17733d483f | 92 | if(stop == 1){ |
Kas_Lewis | 0:fe17733d483f | 93 | sensors.stop(); |
Kas_Lewis | 0:fe17733d483f | 94 | } |
Kas_Lewis | 0:fe17733d483f | 95 | return 0; |
Kas_Lewis | 0:fe17733d483f | 96 | } |
Kas_Lewis | 0:fe17733d483f | 97 | |
Kas_Lewis | 0:fe17733d483f | 98 | char i2c_read(char address, char device_register){ |
Kas_Lewis | 0:fe17733d483f | 99 | char data; |
Kas_Lewis | 0:fe17733d483f | 100 | |
Kas_Lewis | 0:fe17733d483f | 101 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 102 | sensors.write(address); |
Kas_Lewis | 0:fe17733d483f | 103 | sensors.write(device_register); |
Kas_Lewis | 0:fe17733d483f | 104 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 105 | sensors.write(address | 0x01); |
Kas_Lewis | 0:fe17733d483f | 106 | data = (char)sensors.read(0); |
Kas_Lewis | 0:fe17733d483f | 107 | sensors.stop(); |
Kas_Lewis | 0:fe17733d483f | 108 | return data; |
Kas_Lewis | 0:fe17733d483f | 109 | } |
Kas_Lewis | 0:fe17733d483f | 110 | |
Kas_Lewis | 0:fe17733d483f | 111 | int i2c_write_verify(char address, char device_register, char data){ |
Kas_Lewis | 0:fe17733d483f | 112 | char return_data; |
Kas_Lewis | 0:fe17733d483f | 113 | int return_val; |
Kas_Lewis | 0:fe17733d483f | 114 | |
Kas_Lewis | 0:fe17733d483f | 115 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 116 | sensors.write((char)address); |
Kas_Lewis | 0:fe17733d483f | 117 | sensors.write((char)device_register); |
Kas_Lewis | 0:fe17733d483f | 118 | sensors.write((char)data); |
Kas_Lewis | 0:fe17733d483f | 119 | sensors.stop(); |
Kas_Lewis | 0:fe17733d483f | 120 | |
Kas_Lewis | 0:fe17733d483f | 121 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 122 | sensors.write(address); |
Kas_Lewis | 0:fe17733d483f | 123 | sensors.write(device_register); |
Kas_Lewis | 0:fe17733d483f | 124 | sensors.start(); |
Kas_Lewis | 0:fe17733d483f | 125 | sensors.write(address | 0x01); |
Kas_Lewis | 0:fe17733d483f | 126 | return_data = sensors.read(0); |
Kas_Lewis | 0:fe17733d483f | 127 | sensors.stop(); |
Kas_Lewis | 0:fe17733d483f | 128 | |
Kas_Lewis | 0:fe17733d483f | 129 | if (return_data == data){ |
Kas_Lewis | 0:fe17733d483f | 130 | return_val = 0; |
Kas_Lewis | 0:fe17733d483f | 131 | } |
Kas_Lewis | 0:fe17733d483f | 132 | else{ |
Kas_Lewis | 0:fe17733d483f | 133 | return_val = -1; |
Kas_Lewis | 0:fe17733d483f | 134 | } |
Kas_Lewis | 0:fe17733d483f | 135 | return return_val; |
Kas_Lewis | 0:fe17733d483f | 136 | } |
Kas_Lewis | 0:fe17733d483f | 137 | |
Kas_Lewis | 0:fe17733d483f | 138 | int fxas_init() { |
Kas_Lewis | 0:fe17733d483f | 139 | int return_val = 0; |
Kas_Lewis | 0:fe17733d483f | 140 | int sensor_id = 0; |
Kas_Lewis | 0:fe17733d483f | 141 | |
Kas_Lewis | 0:fe17733d483f | 142 | sensor_id = i2c_read(FXAS_ADDRESS_W, FXAS_WHO_AM_I); |
Kas_Lewis | 0:fe17733d483f | 143 | // pc.printf("Expected ID from FXAS21002C is 0xD7\n\r"); |
Kas_Lewis | 0:fe17733d483f | 144 | // pc.printf("Returned value: %X\n\n\r", sensor_id); |
Kas_Lewis | 0:fe17733d483f | 145 | |
Kas_Lewis | 0:fe17733d483f | 146 | if (sensor_id == FXAS_ID){ |
Kas_Lewis | 0:fe17733d483f | 147 | return_val = 0; |
Kas_Lewis | 0:fe17733d483f | 148 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_CTRL_REG_1, 0x00); |
Kas_Lewis | 0:fe17733d483f | 149 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_F_SETUP, 0x00); |
Kas_Lewis | 0:fe17733d483f | 150 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_F_SETUP, 0x57); |
Kas_Lewis | 0:fe17733d483f | 151 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_CTRL_REG_0, 0x03); |
Kas_Lewis | 0:fe17733d483f | 152 | |
Kas_Lewis | 0:fe17733d483f | 153 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_CTRL_REG_2, 0xC2); |
Kas_Lewis | 0:fe17733d483f | 154 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_CTRL_REG_3, 0x08); |
Kas_Lewis | 0:fe17733d483f | 155 | return_val += i2c_write_verify(FXAS_ADDRESS_W, FXAS_CTRL_REG_1, 0x13); |
Kas_Lewis | 0:fe17733d483f | 156 | } |
Kas_Lewis | 0:fe17733d483f | 157 | else{ |
Kas_Lewis | 0:fe17733d483f | 158 | return_val = -1; |
Kas_Lewis | 0:fe17733d483f | 159 | } |
Kas_Lewis | 0:fe17733d483f | 160 | return return_val; |
Kas_Lewis | 0:fe17733d483f | 161 | } |
Kas_Lewis | 0:fe17733d483f | 162 | |
Kas_Lewis | 0:fe17733d483f | 163 | int fxos_init() { |
Kas_Lewis | 0:fe17733d483f | 164 | int return_val = 0; |
Kas_Lewis | 0:fe17733d483f | 165 | int sensor_id = 0; |
Kas_Lewis | 0:fe17733d483f | 166 | |
Kas_Lewis | 0:fe17733d483f | 167 | sensor_id = i2c_read(FXOS_ADDRESS_W, FXOS_WHO_AM_I); |
Kas_Lewis | 0:fe17733d483f | 168 | // pc.printf("Expected ID from FXOS8700CQ is 0xC7\n\r"); |
Kas_Lewis | 0:fe17733d483f | 169 | // pc.printf("Returned value: %X\n\n\r", sensor_id); |
Kas_Lewis | 0:fe17733d483f | 170 | |
Kas_Lewis | 0:fe17733d483f | 171 | if (sensor_id == FXOS_ID){ |
Kas_Lewis | 0:fe17733d483f | 172 | return_val = 0; |
Kas_Lewis | 0:fe17733d483f | 173 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_1, 0x00); |
Kas_Lewis | 0:fe17733d483f | 174 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_F_SETUP, 0x00); |
Kas_Lewis | 0:fe17733d483f | 175 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_F_SETUP, 0x57); |
Kas_Lewis | 0:fe17733d483f | 176 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_ASLP_COUNT, 0xFF); |
Kas_Lewis | 0:fe17733d483f | 177 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_XYZ_DATA_CFG, 0x02); |
Kas_Lewis | 0:fe17733d483f | 178 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_2, 0x00); |
Kas_Lewis | 0:fe17733d483f | 179 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_3, 0x02); |
Kas_Lewis | 0:fe17733d483f | 180 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_4, 0x41); //Enable FIFO & DRDY Interrupts |
Kas_Lewis | 0:fe17733d483f | 181 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_5, 0x40); //FIFO -> Int_1, DRDY -> Imt_2 |
Kas_Lewis | 0:fe17733d483f | 182 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_M_CTRL_REG_1, 0x00); |
Kas_Lewis | 0:fe17733d483f | 183 | return_val += i2c_write_verify(FXOS_ADDRESS_W, FXOS_CTRL_REG_1, 0x21); |
Kas_Lewis | 0:fe17733d483f | 184 | } |
Kas_Lewis | 0:fe17733d483f | 185 | else{ |
Kas_Lewis | 0:fe17733d483f | 186 | return_val = -1; |
Kas_Lewis | 0:fe17733d483f | 187 | } |
Kas_Lewis | 0:fe17733d483f | 188 | return return_val; |
Kas_Lewis | 0:fe17733d483f | 189 | } |
Kas_Lewis | 0:fe17733d483f | 190 | |
Kas_Lewis | 0:fe17733d483f | 191 | //Interrupt for FXAS21002 INT_1 |
Kas_Lewis | 0:fe17733d483f | 192 | void read_fxas_data(){ |
Kas_Lewis | 0:fe17733d483f | 193 | // //Read data from FXAS21002 sensor |
Kas_Lewis | 0:fe17733d483f | 194 | if(FXAS_FIFO_FULL_FLAG != 2){ |
Kas_Lewis | 0:fe17733d483f | 195 | FXAS_FIFO_FULL_FLAG = 1; |
Kas_Lewis | 0:fe17733d483f | 196 | } |
Kas_Lewis | 0:fe17733d483f | 197 | } |
Kas_Lewis | 0:fe17733d483f | 198 | |
Kas_Lewis | 0:fe17733d483f | 199 | //Interrupt for FXOS8700S INT_1 |
Kas_Lewis | 0:fe17733d483f | 200 | void read_fxos_data(){ |
Kas_Lewis | 0:fe17733d483f | 201 | //Read data from FXOS8700C sensor |
Kas_Lewis | 0:fe17733d483f | 202 | if(FXOS_FIFO_FULL_FLAG != 2){ |
Kas_Lewis | 0:fe17733d483f | 203 | FXOS_FIFO_FULL_FLAG = 1; |
Kas_Lewis | 0:fe17733d483f | 204 | } |
Kas_Lewis | 0:fe17733d483f | 205 | } |
Kas_Lewis | 0:fe17733d483f | 206 | |
Kas_Lewis | 0:fe17733d483f | 207 | int main() { |
Kas_Lewis | 0:fe17733d483f | 208 | int initilised = 0; |
Kas_Lewis | 0:fe17733d483f | 209 | int index = 0; |
Kas_Lewis | 0:fe17733d483f | 210 | int test_index = 0; |
Kas_Lewis | 0:fe17733d483f | 211 | int fxos_data_flag_1 = 0; |
Kas_Lewis | 0:fe17733d483f | 212 | int fxas_data_flag_1 = 0; |
Kas_Lewis | 0:fe17733d483f | 213 | |
Kas_Lewis | 0:fe17733d483f | 214 | //Configure interrupts |
Kas_Lewis | 0:fe17733d483f | 215 | fxas_int1_21002.rise(&read_fxas_data);//FIFO -> Int_1 |
Kas_Lewis | 0:fe17733d483f | 216 | // fxas_int2_21002.rise(&read_fxas_data);//DRDY -> Int_2 |
Kas_Lewis | 0:fe17733d483f | 217 | fxos_int1_8700.rise(&read_fxos_data);//FIFO -> Int_1 |
Kas_Lewis | 0:fe17733d483f | 218 | // fxos_int2_8700.rise(&read_fxos_data);//DRDY -> Int_2 |
Kas_Lewis | 0:fe17733d483f | 219 | |
Kas_Lewis | 0:fe17733d483f | 220 | sensors.frequency(450000); |
Kas_Lewis | 0:fe17733d483f | 221 | pc.baud(115200); |
Kas_Lewis | 0:fe17733d483f | 222 | |
Kas_Lewis | 0:fe17733d483f | 223 | mkdir("/sd/sensor_data", 0777); |
Kas_Lewis | 0:fe17733d483f | 224 | FILE *fp = fopen("/sd/sensor_data/data.txt", "w"); |
Kas_Lewis | 0:fe17733d483f | 225 | if(fp == NULL) { |
Kas_Lewis | 0:fe17733d483f | 226 | error("Could not open file for write\n"); |
Kas_Lewis | 0:fe17733d483f | 227 | } |
Kas_Lewis | 0:fe17733d483f | 228 | fprintf(fp, "Gyro X,\tGyro Y,\tGyro Z,\t\tAcc X,\tACC Y,\tACC Z\n\r\n\r\n\r\n\r"); |
Kas_Lewis | 0:fe17733d483f | 229 | fclose(fp); |
Kas_Lewis | 0:fe17733d483f | 230 | |
Kas_Lewis | 0:fe17733d483f | 231 | //Initlilise the FXOS8700CQ Accelorometer & the FXAS21002C Gyroscope |
Kas_Lewis | 0:fe17733d483f | 232 | initilised = fxas_init() & fxos_init(); |
Kas_Lewis | 0:fe17733d483f | 233 | // pc.printf("Returned value: %d\n\n\r", initilised); |
Kas_Lewis | 0:fe17733d483f | 234 | |
Kas_Lewis | 0:fe17733d483f | 235 | while(1) { |
Kas_Lewis | 0:fe17733d483f | 236 | if (FXOS_FIFO_FULL_FLAG == 1){//0.976mg * (fxos_data >> 2) = total g force (8g scale) |
Kas_Lewis | 0:fe17733d483f | 237 | FXOS_FIFO_FULL_FLAG = 0; |
Kas_Lewis | 0:fe17733d483f | 238 | i2c_write(FXOS_ADDRESS_W, FXOS_STATUS, 0); |
Kas_Lewis | 0:fe17733d483f | 239 | sensors.read(FXOS_ADDRESS_R, fxos_data_1, 139, false);//Reads the status register on every pass 0x06 -> 0x00 |
Kas_Lewis | 0:fe17733d483f | 240 | fxos_data_flag_1 = 1; |
Kas_Lewis | 0:fe17733d483f | 241 | } |
Kas_Lewis | 0:fe17733d483f | 242 | |
Kas_Lewis | 0:fe17733d483f | 243 | if (FXAS_FIFO_FULL_FLAG == 1){//7.8125mdps * fxas_data = total degrees per second (250dps scale) |
Kas_Lewis | 0:fe17733d483f | 244 | FXAS_FIFO_FULL_FLAG = 0; |
Kas_Lewis | 0:fe17733d483f | 245 | i2c_write(FXAS_ADDRESS_W, FXAS_STATUS, 0); |
Kas_Lewis | 0:fe17733d483f | 246 | sensors.read(FXAS_ADDRESS_R, fxas_data_1, 139, false);//Reads the status register on the first if set to otherwise 0x06 -> 0x01 |
Kas_Lewis | 0:fe17733d483f | 247 | fxas_data_flag_1 = 1; |
Kas_Lewis | 0:fe17733d483f | 248 | } |
Kas_Lewis | 0:fe17733d483f | 249 | |
Kas_Lewis | 0:fe17733d483f | 250 | |
Kas_Lewis | 0:fe17733d483f | 251 | if ((fxos_data_flag_1 == 1) && (fxas_data_flag_1 == 1)){ |
Kas_Lewis | 0:fe17733d483f | 252 | //Store data on SD card |
Kas_Lewis | 0:fe17733d483f | 253 | if (test_index == 0){// <--------- Just till a proper file closing system can be implemented |
Kas_Lewis | 0:fe17733d483f | 254 | fp = fopen("/sd/sensor_data/data.txt", "a"); |
Kas_Lewis | 0:fe17733d483f | 255 | if(fp == NULL) { |
Kas_Lewis | 0:fe17733d483f | 256 | error("Could not open file for write\n"); |
Kas_Lewis | 0:fe17733d483f | 257 | } |
Kas_Lewis | 0:fe17733d483f | 258 | } |
Kas_Lewis | 0:fe17733d483f | 259 | |
Kas_Lewis | 0:fe17733d483f | 260 | for (index = 1; index < 139; index += 6){ |
Kas_Lewis | 0:fe17733d483f | 261 | //move data to SD card |
Kas_Lewis | 0:fe17733d483f | 262 | fprintf(fp, "%d\t%d\t%d\t\t", ((int16_t)((fxos_data_1[(index + 0)] << 8) | fxos_data_1[(index + 1)]) >> 2), |
Kas_Lewis | 0:fe17733d483f | 263 | ((int16_t)((fxos_data_1[(index + 2)] << 8) | fxos_data_1[(index + 3)]) >> 2), |
Kas_Lewis | 0:fe17733d483f | 264 | ((int16_t)((fxos_data_1[(index + 4)] << 8) | fxos_data_1[(index + 5)]) >> 2)); |
Kas_Lewis | 0:fe17733d483f | 265 | |
Kas_Lewis | 0:fe17733d483f | 266 | fprintf(fp, "%d\t%d\t%d\n\r\n\r", ((int16_t)((fxas_data_1[(index + 0)] << 8) | fxas_data_1[(index + 1)])), |
Kas_Lewis | 0:fe17733d483f | 267 | ((int16_t)((fxas_data_1[(index + 2)] << 8) | fxas_data_1[(index + 3)])), |
Kas_Lewis | 0:fe17733d483f | 268 | ((int16_t)((fxas_data_1[(index + 4)] << 8) | fxas_data_1[(index + 5)]))); |
Kas_Lewis | 0:fe17733d483f | 269 | } |
Kas_Lewis | 0:fe17733d483f | 270 | |
Kas_Lewis | 0:fe17733d483f | 271 | fxos_data_flag_1 = 0; |
Kas_Lewis | 0:fe17733d483f | 272 | fxas_data_flag_1 = 0; |
Kas_Lewis | 0:fe17733d483f | 273 | test_index++; |
Kas_Lewis | 0:fe17733d483f | 274 | if (test_index == 30){// <--------- Just till a proper file closing system can be implemented |
Kas_Lewis | 0:fe17733d483f | 275 | fclose(fp); |
Kas_Lewis | 0:fe17733d483f | 276 | test_index = 0; |
Kas_Lewis | 0:fe17733d483f | 277 | } |
Kas_Lewis | 0:fe17733d483f | 278 | for (int i = 0; i < 210; i++){ |
Kas_Lewis | 0:fe17733d483f | 279 | fxos_data_1[i] = 0; |
Kas_Lewis | 0:fe17733d483f | 280 | fxas_data_1[i] = 0; |
Kas_Lewis | 0:fe17733d483f | 281 | } |
Kas_Lewis | 0:fe17733d483f | 282 | } |
Kas_Lewis | 0:fe17733d483f | 283 | } |
Kas_Lewis | 0:fe17733d483f | 284 | } |