Code for the project of LELEC2811 2017

Dependencies:   FreescaleIAP MMA8491Q_PG mbed

Fork of LELEC_2811_Accelerometer by LELEC2811 - I&S

Committer:
Salamandre
Date:
Wed Nov 23 15:52:48 2016 +0000
Revision:
1:1406d318a3b7
Parent:
0:a18d6e69c993
Child:
2:f146ae6546b5
Bug correction at line 309

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Salamandre 0:a18d6e69c993 1 /* LELEC_2811 Accelerometer Project
Salamandre 0:a18d6e69c993 2 UCL 2014 - P. Gérard
Salamandre 0:a18d6e69c993 3 */
Salamandre 0:a18d6e69c993 4 #include "mbed.h"
Salamandre 0:a18d6e69c993 5 #include "FreescaleIAP.h" // Library for Flash Access
Salamandre 0:a18d6e69c993 6 #include "MMA8491Q_PG.h" // Accelerometer
Salamandre 0:a18d6e69c993 7
Salamandre 0:a18d6e69c993 8 #define MMA8491_I2C_ADDRESS (0x55<<1)
Salamandre 0:a18d6e69c993 9
Salamandre 0:a18d6e69c993 10 #define NO_JUMPER 0
Salamandre 0:a18d6e69c993 11 #define JUMPER_PRESENT 1
Salamandre 0:a18d6e69c993 12
Salamandre 0:a18d6e69c993 13 #define LEVEL_0 0
Salamandre 0:a18d6e69c993 14 #define LEVEL_1 1
Salamandre 0:a18d6e69c993 15
Salamandre 0:a18d6e69c993 16 #define LED_ON 0
Salamandre 0:a18d6e69c993 17 #define LED_OFF 1
Salamandre 0:a18d6e69c993 18
Salamandre 0:a18d6e69c993 19 #define DISABLE_STATE 0
Salamandre 0:a18d6e69c993 20 #define ENABLE_STATE 1
Salamandre 0:a18d6e69c993 21
Salamandre 0:a18d6e69c993 22 #define REG_OUT_X_MSB 0x01
Salamandre 0:a18d6e69c993 23 #define REG_OUT_Y_MSB 0x03
Salamandre 0:a18d6e69c993 24 #define REG_OUT_Z_MSB 0x05
Salamandre 0:a18d6e69c993 25
Salamandre 0:a18d6e69c993 26 #define FLASH_NO_ACQ_DONE 0
Salamandre 0:a18d6e69c993 27 #define FLASH_ACQ_DONE 1
Salamandre 0:a18d6e69c993 28 #define ERASE_FLASH_ERROR -1
Salamandre 0:a18d6e69c993 29 #define WRITE_FLASH_ERROR -2
Salamandre 0:a18d6e69c993 30
Salamandre 0:a18d6e69c993 31 #define SECTOR_SIZE 1024
Salamandre 0:a18d6e69c993 32 #define RESERVED_SECTOR 32
Salamandre 0:a18d6e69c993 33
Salamandre 0:a18d6e69c993 34 #define ACQ_TIMER_PERIOD 0.01 // Time between 2 acquisitions (here 10 mSec)
Salamandre 0:a18d6e69c993 35
Salamandre 0:a18d6e69c993 36 typedef struct{
Salamandre 0:a18d6e69c993 37 int16_t X;
Salamandre 0:a18d6e69c993 38 int16_t Y;
Salamandre 0:a18d6e69c993 39 int16_t Z;
Salamandre 0:a18d6e69c993 40 } Accel_Data;
Salamandre 0:a18d6e69c993 41
Salamandre 0:a18d6e69c993 42 // --- Setup I2C for MMA8491
Salamandre 0:a18d6e69c993 43 MMA8491Q my8491(PTE0, PTE1, MMA8491_I2C_ADDRESS);
Salamandre 0:a18d6e69c993 44
Salamandre 0:a18d6e69c993 45 // --- Set Serial Port
Salamandre 0:a18d6e69c993 46 Serial Host_Comm(USBTX, USBRX); // tx, rxSerial pc(USBTX, USBRX); // tx, rx
Salamandre 0:a18d6e69c993 47
Salamandre 0:a18d6e69c993 48 Ticker myTick_Acq; // Periodical timer for Acquisition
Salamandre 0:a18d6e69c993 49
Salamandre 0:a18d6e69c993 50 DigitalOut Led_Red(LED1); // Define I/O for Leds
Salamandre 0:a18d6e69c993 51 DigitalOut Led_Green(LED2);
Salamandre 0:a18d6e69c993 52 DigitalOut Led_Blue(LED3);
Salamandre 0:a18d6e69c993 53
Salamandre 0:a18d6e69c993 54 DigitalOut Accel_Enable(PTA13);
Salamandre 0:a18d6e69c993 55
Salamandre 0:a18d6e69c993 56 DigitalOut Start_Pulse_Out(PTC9); // Used to enter/exit Acquisition mode
Salamandre 0:a18d6e69c993 57 DigitalIn Start_Pulse_In(PTC11); // ShortPin J1_15 and J1_16 to enter in Acq_Mode
Salamandre 0:a18d6e69c993 58
Salamandre 0:a18d6e69c993 59
Salamandre 0:a18d6e69c993 60 // Globale variable
Salamandre 0:a18d6e69c993 61 volatile bool bTimer; // 1 means a Timer tick is done
Salamandre 0:a18d6e69c993 62
Salamandre 0:a18d6e69c993 63 int Flash_Base_Address = RESERVED_SECTOR * SECTOR_SIZE ; // Store Flash Base Adresse with 32K reserved for Application Code
Salamandre 0:a18d6e69c993 64 int Nb_Sector;
Salamandre 0:a18d6e69c993 65 uint32_t KL25_Flash_Size;
Salamandre 0:a18d6e69c993 66
Salamandre 0:a18d6e69c993 67 // Function Declaration
Salamandre 0:a18d6e69c993 68
Salamandre 0:a18d6e69c993 69 void Clear_Led(void);
Salamandre 0:a18d6e69c993 70 int Acquisition_Flash(void);
Salamandre 0:a18d6e69c993 71 int Read_Data_Logging(void);
Salamandre 0:a18d6e69c993 72 bool Check_Jumper(void);
Salamandre 0:a18d6e69c993 73 void myTimer_Acq_Task(void);
Salamandre 0:a18d6e69c993 74 void Acquisition_Task(void);
Salamandre 0:a18d6e69c993 75 void Read_Task(void);
Salamandre 0:a18d6e69c993 76
Salamandre 0:a18d6e69c993 77 extern IAPCode verify_erased(int address, unsigned int length);
Salamandre 0:a18d6e69c993 78
Salamandre 0:a18d6e69c993 79 int main() {
Salamandre 0:a18d6e69c993 80
Salamandre 0:a18d6e69c993 81 uint8_t Count;
Salamandre 0:a18d6e69c993 82
Salamandre 0:a18d6e69c993 83 Start_Pulse_In.mode(PullNone); // Input Pin is programmed as floating
Salamandre 0:a18d6e69c993 84 Accel_Enable = DISABLE_STATE; // Turn Accel Enable to disabled state
Salamandre 0:a18d6e69c993 85
Salamandre 0:a18d6e69c993 86 // --- Baud rate setting
Salamandre 0:a18d6e69c993 87 Host_Comm.baud(115200);
Salamandre 0:a18d6e69c993 88
Salamandre 0:a18d6e69c993 89 Clear_Led();
Salamandre 0:a18d6e69c993 90
Salamandre 0:a18d6e69c993 91 KL25_Flash_Size = flash_size(); // Get Size of KL25 Embedded Flash
Salamandre 0:a18d6e69c993 92 Nb_Sector = (KL25_Flash_Size / SECTOR_SIZE) - RESERVED_SECTOR; // Reserve Max 32K for App Code
Salamandre 0:a18d6e69c993 93
Salamandre 0:a18d6e69c993 94 myTick_Acq.attach(&myTimer_Acq_Task, ACQ_TIMER_PERIOD);
Salamandre 0:a18d6e69c993 95
Salamandre 0:a18d6e69c993 96 Host_Comm.printf("\n\rLELEC2811 Accelerometer Logger V1.0 UCL 2014\n\r");
Salamandre 0:a18d6e69c993 97
Salamandre 0:a18d6e69c993 98 for (;;)
Salamandre 0:a18d6e69c993 99 {
Salamandre 0:a18d6e69c993 100 if (Check_Jumper() == JUMPER_PRESENT)
Salamandre 0:a18d6e69c993 101 {
Salamandre 0:a18d6e69c993 102 Clear_Led();
Salamandre 0:a18d6e69c993 103
Salamandre 0:a18d6e69c993 104 Count = 5;
Salamandre 0:a18d6e69c993 105 while (Count !=0)
Salamandre 0:a18d6e69c993 106 {
Salamandre 0:a18d6e69c993 107 if (Check_Jumper() == JUMPER_PRESENT)
Salamandre 0:a18d6e69c993 108 {
Salamandre 0:a18d6e69c993 109 Led_Blue = LED_ON; // Blink to alert user "Enter in Acquisition"
Salamandre 0:a18d6e69c993 110 wait_ms(900);
Salamandre 0:a18d6e69c993 111 Led_Blue = LED_OFF;
Salamandre 0:a18d6e69c993 112 wait_ms(100);
Salamandre 0:a18d6e69c993 113 Count --;
Salamandre 0:a18d6e69c993 114 if (Count == 0)
Salamandre 0:a18d6e69c993 115 {
Salamandre 0:a18d6e69c993 116 Acquisition_Task();
Salamandre 0:a18d6e69c993 117 }
Salamandre 0:a18d6e69c993 118 }
Salamandre 0:a18d6e69c993 119 else
Salamandre 0:a18d6e69c993 120 {
Salamandre 0:a18d6e69c993 121 Count = 0;
Salamandre 0:a18d6e69c993 122 }
Salamandre 0:a18d6e69c993 123 }
Salamandre 0:a18d6e69c993 124 }
Salamandre 0:a18d6e69c993 125 else
Salamandre 0:a18d6e69c993 126 {
Salamandre 0:a18d6e69c993 127 Read_Task();
Salamandre 0:a18d6e69c993 128 }
Salamandre 0:a18d6e69c993 129 }
Salamandre 0:a18d6e69c993 130 }
Salamandre 0:a18d6e69c993 131
Salamandre 0:a18d6e69c993 132 void Read_Task()
Salamandre 0:a18d6e69c993 133 {
Salamandre 0:a18d6e69c993 134 char host_cmd;
Salamandre 0:a18d6e69c993 135 IAPCode Flash_State;
Salamandre 0:a18d6e69c993 136 bool bAcq_Done;
Salamandre 0:a18d6e69c993 137
Salamandre 0:a18d6e69c993 138 Flash_State = verify_erased(Flash_Base_Address, KL25_Flash_Size - (RESERVED_SECTOR * SECTOR_SIZE));
Salamandre 0:a18d6e69c993 139 if (Flash_State == 0) // Virgin Flash ?
Salamandre 0:a18d6e69c993 140 {
Salamandre 0:a18d6e69c993 141 bAcq_Done = 0;
Salamandre 0:a18d6e69c993 142 }
Salamandre 0:a18d6e69c993 143 else
Salamandre 0:a18d6e69c993 144 {
Salamandre 0:a18d6e69c993 145 bAcq_Done = 1;
Salamandre 0:a18d6e69c993 146 }
Salamandre 0:a18d6e69c993 147
Salamandre 0:a18d6e69c993 148 Clear_Led();
Salamandre 0:a18d6e69c993 149 wait_ms(500);
Salamandre 0:a18d6e69c993 150
Salamandre 0:a18d6e69c993 151 if (bAcq_Done == 1)
Salamandre 0:a18d6e69c993 152 {
Salamandre 0:a18d6e69c993 153 Led_Green = LED_ON;
Salamandre 0:a18d6e69c993 154 Host_Comm.putc('1');
Salamandre 0:a18d6e69c993 155 }
Salamandre 0:a18d6e69c993 156 else
Salamandre 0:a18d6e69c993 157 {
Salamandre 0:a18d6e69c993 158 Led_Red = LED_ON;
Salamandre 0:a18d6e69c993 159 Host_Comm.putc('0');
Salamandre 0:a18d6e69c993 160 }
Salamandre 0:a18d6e69c993 161
Salamandre 0:a18d6e69c993 162 if(Host_Comm.readable()) // Did we receive a char from Host ?
Salamandre 0:a18d6e69c993 163 {
Salamandre 0:a18d6e69c993 164 host_cmd = Host_Comm.getc(); // Get it
Salamandre 0:a18d6e69c993 165
Salamandre 0:a18d6e69c993 166 if ((host_cmd == 'R') || (host_cmd == 'r')) // Read Flash Command ?
Salamandre 0:a18d6e69c993 167 {
Salamandre 0:a18d6e69c993 168 Read_Data_Logging(); // Read and send acquisition data
Salamandre 0:a18d6e69c993 169 }
Salamandre 0:a18d6e69c993 170 }
Salamandre 0:a18d6e69c993 171 wait_ms(50);
Salamandre 0:a18d6e69c993 172 }
Salamandre 0:a18d6e69c993 173
Salamandre 0:a18d6e69c993 174 void Acquisition_Task()
Salamandre 0:a18d6e69c993 175 {
Salamandre 0:a18d6e69c993 176 int Acq_Status;
Salamandre 0:a18d6e69c993 177
Salamandre 0:a18d6e69c993 178 Clear_Led();
Salamandre 0:a18d6e69c993 179
Salamandre 0:a18d6e69c993 180 Acq_Status = Acquisition_Flash();
Salamandre 0:a18d6e69c993 181
Salamandre 0:a18d6e69c993 182 Clear_Led();
Salamandre 0:a18d6e69c993 183
Salamandre 0:a18d6e69c993 184 while (Check_Jumper() == JUMPER_PRESENT)
Salamandre 0:a18d6e69c993 185 {
Salamandre 0:a18d6e69c993 186 if (Acq_Status != FLASH_ACQ_DONE)
Salamandre 0:a18d6e69c993 187 {
Salamandre 0:a18d6e69c993 188 Led_Red = !Led_Red;
Salamandre 0:a18d6e69c993 189 }
Salamandre 0:a18d6e69c993 190 else
Salamandre 0:a18d6e69c993 191 {
Salamandre 0:a18d6e69c993 192 Led_Green = !Led_Green;
Salamandre 0:a18d6e69c993 193 }
Salamandre 0:a18d6e69c993 194 wait_ms(100);
Salamandre 0:a18d6e69c993 195 }
Salamandre 0:a18d6e69c993 196 }
Salamandre 0:a18d6e69c993 197
Salamandre 0:a18d6e69c993 198 void Clear_Led(void)
Salamandre 0:a18d6e69c993 199 {
Salamandre 0:a18d6e69c993 200 Led_Red = LED_OFF;
Salamandre 0:a18d6e69c993 201 Led_Green = LED_OFF;
Salamandre 0:a18d6e69c993 202 Led_Blue = LED_OFF ; // Bug on board : Turning On Blue Led decrease consumption...
Salamandre 0:a18d6e69c993 203 }
Salamandre 0:a18d6e69c993 204
Salamandre 0:a18d6e69c993 205 bool Check_Jumper() // If J1_15 and J1_16 connected together -> return JUMPER_PRESENT
Salamandre 0:a18d6e69c993 206 {
Salamandre 0:a18d6e69c993 207 uint8_t i;
Salamandre 0:a18d6e69c993 208
Salamandre 0:a18d6e69c993 209 for (i = 0 ; i < 2 ; i ++)
Salamandre 0:a18d6e69c993 210 {
Salamandre 0:a18d6e69c993 211 Start_Pulse_Out = LEVEL_1;
Salamandre 0:a18d6e69c993 212 wait_ms(1);
Salamandre 0:a18d6e69c993 213 if (Start_Pulse_In != LEVEL_1)
Salamandre 0:a18d6e69c993 214 {
Salamandre 0:a18d6e69c993 215 return NO_JUMPER;
Salamandre 0:a18d6e69c993 216 }
Salamandre 0:a18d6e69c993 217
Salamandre 0:a18d6e69c993 218 Start_Pulse_Out = LEVEL_0;
Salamandre 0:a18d6e69c993 219 wait_ms(1);
Salamandre 0:a18d6e69c993 220 if (Start_Pulse_In != LEVEL_0)
Salamandre 0:a18d6e69c993 221 {
Salamandre 0:a18d6e69c993 222 return NO_JUMPER;
Salamandre 0:a18d6e69c993 223 }
Salamandre 0:a18d6e69c993 224 }
Salamandre 0:a18d6e69c993 225 return JUMPER_PRESENT;
Salamandre 0:a18d6e69c993 226 }
Salamandre 0:a18d6e69c993 227
Salamandre 0:a18d6e69c993 228 int Acquisition_Flash(void)
Salamandre 0:a18d6e69c993 229 {
Salamandre 0:a18d6e69c993 230 int Status;
Salamandre 0:a18d6e69c993 231 int Flash_Ptr ;
Salamandre 0:a18d6e69c993 232 uint8_t Data_Ptr;
Salamandre 0:a18d6e69c993 233 Accel_Data myData[2];
Salamandre 0:a18d6e69c993 234 uint8_t Ready;
Salamandre 0:a18d6e69c993 235 int Led_Counter;
Salamandre 0:a18d6e69c993 236
Salamandre 0:a18d6e69c993 237
Salamandre 0:a18d6e69c993 238 for (Flash_Ptr = Flash_Base_Address ; Flash_Ptr < KL25_Flash_Size ; Flash_Ptr += 0x400)
Salamandre 0:a18d6e69c993 239 {
Salamandre 0:a18d6e69c993 240 Status = erase_sector(Flash_Ptr); // Erase sector
Salamandre 0:a18d6e69c993 241
Salamandre 0:a18d6e69c993 242 if (Status !=0)
Salamandre 0:a18d6e69c993 243 {
Salamandre 0:a18d6e69c993 244 return ERASE_FLASH_ERROR;
Salamandre 0:a18d6e69c993 245 }
Salamandre 0:a18d6e69c993 246 }
Salamandre 0:a18d6e69c993 247
Salamandre 0:a18d6e69c993 248 Flash_Ptr = Flash_Base_Address;
Salamandre 0:a18d6e69c993 249
Salamandre 0:a18d6e69c993 250 Led_Blue = LED_ON;
Salamandre 0:a18d6e69c993 251
Salamandre 0:a18d6e69c993 252 Led_Counter = 0;
Salamandre 0:a18d6e69c993 253 Data_Ptr = 0;
Salamandre 0:a18d6e69c993 254 while (Flash_Ptr < KL25_Flash_Size ) // Acq Loop
Salamandre 0:a18d6e69c993 255 {
Salamandre 0:a18d6e69c993 256 while (bTimer == 0) // Wait Acq Tick Timer
Salamandre 0:a18d6e69c993 257 {
Salamandre 0:a18d6e69c993 258
Salamandre 0:a18d6e69c993 259 }
Salamandre 0:a18d6e69c993 260 bTimer = 0;
Salamandre 0:a18d6e69c993 261
Salamandre 0:a18d6e69c993 262 Accel_Enable = ENABLE_STATE; // Rising Edge -> Start Accel Measure
Salamandre 0:a18d6e69c993 263
Salamandre 0:a18d6e69c993 264 if ((float) Led_Counter * ACQ_TIMER_PERIOD == 1.0) // Blink at 1 Hz
Salamandre 0:a18d6e69c993 265 {
Salamandre 0:a18d6e69c993 266 Led_Counter = 0;
Salamandre 0:a18d6e69c993 267 Led_Blue = !Led_Blue;
Salamandre 0:a18d6e69c993 268 }
Salamandre 0:a18d6e69c993 269
Salamandre 0:a18d6e69c993 270
Salamandre 0:a18d6e69c993 271 Ready = 0;
Salamandre 0:a18d6e69c993 272 while((Ready && 0x10) == 0) // Wait Accelerometer have new data's
Salamandre 0:a18d6e69c993 273 {
Salamandre 0:a18d6e69c993 274 Ready = my8491.Read_Status();
Salamandre 0:a18d6e69c993 275 }
Salamandre 0:a18d6e69c993 276
Salamandre 0:a18d6e69c993 277 myData[Data_Ptr].X = my8491.getAccAxis(REG_OUT_X_MSB);
Salamandre 0:a18d6e69c993 278 myData[Data_Ptr].Y = my8491.getAccAxis(REG_OUT_Y_MSB);
Salamandre 0:a18d6e69c993 279 myData[Data_Ptr].Z = my8491.getAccAxis(REG_OUT_Z_MSB);
Salamandre 0:a18d6e69c993 280
Salamandre 0:a18d6e69c993 281 Led_Counter++;
Salamandre 0:a18d6e69c993 282
Salamandre 0:a18d6e69c993 283 Accel_Enable = DISABLE_STATE;
Salamandre 0:a18d6e69c993 284
Salamandre 0:a18d6e69c993 285 //Host_Comm.printf("\n\r%x\tX = %f", Flash_Ptr, float(myData[Data_Ptr].X)*4.0/4096.0 );
Salamandre 0:a18d6e69c993 286 //Host_Comm.printf("\tY = %f", float(myData[Data_Ptr].Y)*4.0/4096.0 );
Salamandre 0:a18d6e69c993 287 //Host_Comm.printf("\tZ = %f", float(myData[Data_Ptr].Z)*4.0/4096.0 );
Salamandre 0:a18d6e69c993 288
Salamandre 0:a18d6e69c993 289 Data_Ptr ++;
Salamandre 0:a18d6e69c993 290
Salamandre 0:a18d6e69c993 291 if (Data_Ptr == 2)// Save 2 acquistions -> 2 * 3 * 2 bytes = 12 bytes
Salamandre 0:a18d6e69c993 292 {
Salamandre 0:a18d6e69c993 293 Data_Ptr = 0;
Salamandre 0:a18d6e69c993 294 Status = program_flash(Flash_Ptr, (char *) &myData[0].X, 4); // Write 4 bytes in the Flash
Salamandre 0:a18d6e69c993 295 if (Status !=0)
Salamandre 0:a18d6e69c993 296 {
Salamandre 0:a18d6e69c993 297 return WRITE_FLASH_ERROR;
Salamandre 0:a18d6e69c993 298 }
Salamandre 0:a18d6e69c993 299
Salamandre 0:a18d6e69c993 300 Flash_Ptr += 4;
Salamandre 0:a18d6e69c993 301 Status = program_flash(Flash_Ptr, (char *) &myData[0].Z, 4); // Write 4 bytes in the Flash
Salamandre 0:a18d6e69c993 302 if (Status !=0)
Salamandre 0:a18d6e69c993 303 {
Salamandre 0:a18d6e69c993 304 return WRITE_FLASH_ERROR;
Salamandre 0:a18d6e69c993 305 }
Salamandre 0:a18d6e69c993 306
Salamandre 0:a18d6e69c993 307 Flash_Ptr += 4;
Salamandre 1:1406d318a3b7 308 //Status = program_flash(Flash_Ptr, (char *) &myData[1].Y, 4); // Write 4 bytes in the Flash
Salamandre 1:1406d318a3b7 309 Status = program_flash(Flash_Ptr, (char *) &myData[0].Y, 4); // Bug corrected 23/11/2016
Salamandre 0:a18d6e69c993 310 if (Status !=0)
Salamandre 0:a18d6e69c993 311 {
Salamandre 0:a18d6e69c993 312 return WRITE_FLASH_ERROR;
Salamandre 0:a18d6e69c993 313 }
Salamandre 0:a18d6e69c993 314
Salamandre 0:a18d6e69c993 315 Flash_Ptr += 4;
Salamandre 0:a18d6e69c993 316
Salamandre 0:a18d6e69c993 317 if ((Flash_Ptr & 0x3FC) == 0x3FC)
Salamandre 0:a18d6e69c993 318 {
Salamandre 0:a18d6e69c993 319 Flash_Ptr += 4; //170 * 6 = 1020 ---> skip 4 last bytes of each sector of 1024 bytes
Salamandre 0:a18d6e69c993 320 }
Salamandre 0:a18d6e69c993 321 }
Salamandre 0:a18d6e69c993 322 if (Check_Jumper() != JUMPER_PRESENT) // If Jumper remoded -> Stop Acquisition
Salamandre 0:a18d6e69c993 323 {
Salamandre 0:a18d6e69c993 324 return FLASH_ACQ_DONE ;
Salamandre 0:a18d6e69c993 325 }
Salamandre 0:a18d6e69c993 326 }
Salamandre 0:a18d6e69c993 327 return FLASH_ACQ_DONE ;
Salamandre 0:a18d6e69c993 328 }
Salamandre 0:a18d6e69c993 329
Salamandre 0:a18d6e69c993 330 int Read_Data_Logging()
Salamandre 0:a18d6e69c993 331 {
Salamandre 0:a18d6e69c993 332 int16_t *data = (int16_t *) Flash_Base_Address; // uint16 pointer of data stored in Flash
Salamandre 0:a18d6e69c993 333 int Flash_Ptr;
Salamandre 0:a18d6e69c993 334 char cmd;
Salamandre 0:a18d6e69c993 335 int Record_Counter;
Salamandre 0:a18d6e69c993 336 float X_Val, Y_Val, Z_Val;
Salamandre 0:a18d6e69c993 337 int16_t Raw_X, Raw_Y, Raw_Z;
Salamandre 0:a18d6e69c993 338 int Max_Record;
Salamandre 0:a18d6e69c993 339
Salamandre 0:a18d6e69c993 340 Clear_Led();
Salamandre 0:a18d6e69c993 341
Salamandre 0:a18d6e69c993 342 Max_Record = Nb_Sector * (SECTOR_SIZE / sizeof(Accel_Data));
Salamandre 0:a18d6e69c993 343 Record_Counter = 0;
Salamandre 0:a18d6e69c993 344 Flash_Ptr = 0;
Salamandre 0:a18d6e69c993 345
Salamandre 0:a18d6e69c993 346 //Host_Comm.printf("\n\rBegin of Data");
Salamandre 0:a18d6e69c993 347
Salamandre 0:a18d6e69c993 348 while (Record_Counter < Max_Record)
Salamandre 0:a18d6e69c993 349 {
Salamandre 0:a18d6e69c993 350 Led_Green = !Led_Green;
Salamandre 0:a18d6e69c993 351 Led_Blue = !Led_Green;
Salamandre 0:a18d6e69c993 352
Salamandre 0:a18d6e69c993 353 if(Host_Comm.readable())
Salamandre 0:a18d6e69c993 354 {
Salamandre 0:a18d6e69c993 355 cmd = Host_Comm.getc();
Salamandre 0:a18d6e69c993 356 if ((cmd == 'S') || (cmd == 's')) // Receiving 'S' or 's' means stop Read Flash
Salamandre 0:a18d6e69c993 357 {
Salamandre 0:a18d6e69c993 358 Clear_Led();
Salamandre 0:a18d6e69c993 359 return 0;
Salamandre 0:a18d6e69c993 360 }
Salamandre 0:a18d6e69c993 361 }
Salamandre 0:a18d6e69c993 362
Salamandre 0:a18d6e69c993 363 Record_Counter ++;
Salamandre 0:a18d6e69c993 364
Salamandre 0:a18d6e69c993 365 Raw_X = data[Flash_Ptr++];
Salamandre 0:a18d6e69c993 366 Raw_Y = data[Flash_Ptr++];
Salamandre 0:a18d6e69c993 367 Raw_Z = data[Flash_Ptr++];
Salamandre 0:a18d6e69c993 368
Salamandre 0:a18d6e69c993 369 if ((Raw_X == -1) && (Raw_Y == -1) && (Raw_Z == -1)) // Valid data ? (!= 0xFFFFFFFF from empty Flash sector)
Salamandre 0:a18d6e69c993 370 {
Salamandre 0:a18d6e69c993 371 }
Salamandre 0:a18d6e69c993 372 else
Salamandre 0:a18d6e69c993 373 {
Salamandre 0:a18d6e69c993 374 X_Val = float(Raw_X) * 4.0/4096.0;
Salamandre 0:a18d6e69c993 375 Y_Val = float(Raw_Y) * 4.0/4096.0;
Salamandre 0:a18d6e69c993 376 Z_Val = float(Raw_Z) * 4.0/4096.0;
Salamandre 0:a18d6e69c993 377
Salamandre 0:a18d6e69c993 378 Host_Comm.printf("\n\r%d\tX=%.4f\tY=%.4f\tZ=%.4f", Record_Counter, X_Val, Y_Val, Z_Val);
Salamandre 0:a18d6e69c993 379 }
Salamandre 0:a18d6e69c993 380
Salamandre 0:a18d6e69c993 381 if ((Flash_Ptr & 0x1FE) == 0x1FE)
Salamandre 0:a18d6e69c993 382 {
Salamandre 0:a18d6e69c993 383 Flash_Ptr +=2; // skip the last bytes at the end of a sector
Salamandre 0:a18d6e69c993 384 }
Salamandre 0:a18d6e69c993 385 }
Salamandre 0:a18d6e69c993 386 //Host_Comm.printf("\n\rEnd of Data");
Salamandre 0:a18d6e69c993 387 Clear_Led();
Salamandre 0:a18d6e69c993 388 return 0;
Salamandre 0:a18d6e69c993 389 }
Salamandre 0:a18d6e69c993 390
Salamandre 0:a18d6e69c993 391 /* Interrupt Task */
Salamandre 0:a18d6e69c993 392 void myTimer_Acq_Task()
Salamandre 0:a18d6e69c993 393 {
Salamandre 0:a18d6e69c993 394 bTimer = 1;
Salamandre 0:a18d6e69c993 395 }
Salamandre 0:a18d6e69c993 396