Read output from MAX21105 and burst output to serial PC

Dependencies:   mbed

Committer:
visarute
Date:
Thu Dec 03 16:06:19 2015 +0000
Revision:
0:27f71d402a3e
MAX21105 burst output to computer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
visarute 0:27f71d402a3e 1 /*============================================================================
visarute 0:27f71d402a3e 2 MBED_MAX21105_Burst01
visarute 0:27f71d402a3e 3 Read data from MAX21105 IMU included temperature
visarute 0:27f71d402a3e 4 Data return by serial command in burst mode
visarute 0:27f71d402a3e 5 and control MCP4921 DAC
visarute 0:27f71d402a3e 6 Visarute Pinrod
visarute 0:27f71d402a3e 7 SonicMEMS Laboratory, ECE, Cornell University, Ithaca, NY, USA
visarute 0:27f71d402a3e 8 September 21, 2015
visarute 0:27f71d402a3e 9 ============================================================================*/
visarute 0:27f71d402a3e 10
visarute 0:27f71d402a3e 11 // Import library
visarute 0:27f71d402a3e 12 #include "mbed.h"
visarute 0:27f71d402a3e 13 #include "SPI.h"
visarute 0:27f71d402a3e 14 #include "DigitalOut.h"
visarute 0:27f71d402a3e 15
visarute 0:27f71d402a3e 16 // Define pinout
visarute 0:27f71d402a3e 17 SPI spi1(p5, p6, p7); //mosi, miso, sck
visarute 0:27f71d402a3e 18 DigitalOut cs_MAX21105(p8); //cs for MAX21105 6Dof IMU
visarute 0:27f71d402a3e 19 DigitalOut cs_MCP4921(p9); //cs for MCP4921 DAC for heater
visarute 0:27f71d402a3e 20 DigitalOut cs_TSYS01st(p10); //cs for TSYS01 Temperature sensor for stage
visarute 0:27f71d402a3e 21
visarute 0:27f71d402a3e 22 // Object
visarute 0:27f71d402a3e 23 Serial pc(USBTX, USBRX); // tx, rx
visarute 0:27f71d402a3e 24 Timer t;
visarute 0:27f71d402a3e 25
visarute 0:27f71d402a3e 26 // get value from command format
visarute 0:27f71d402a3e 27 int getVal(char *cmd){
visarute 0:27f71d402a3e 28 int val=-1;
visarute 0:27f71d402a3e 29 char valC[4];
visarute 0:27f71d402a3e 30 valC[0]=cmd[3];
visarute 0:27f71d402a3e 31 valC[1]=cmd[4];
visarute 0:27f71d402a3e 32 valC[2]=cmd[5];
visarute 0:27f71d402a3e 33 valC[3]=cmd[6];
visarute 0:27f71d402a3e 34 sscanf(valC,"%4x",&val);
visarute 0:27f71d402a3e 35 return val;
visarute 0:27f71d402a3e 36 }
visarute 0:27f71d402a3e 37
visarute 0:27f71d402a3e 38 // Start SPI connection
visarute 0:27f71d402a3e 39 void startSPI(){
visarute 0:27f71d402a3e 40 spi1.format(8,3);
visarute 0:27f71d402a3e 41 spi1.frequency(1000000);
visarute 0:27f71d402a3e 42 cs_MAX21105 = 1;
visarute 0:27f71d402a3e 43 cs_MCP4921 = 1;
visarute 0:27f71d402a3e 44 cs_TSYS01st = 1;
visarute 0:27f71d402a3e 45 }
visarute 0:27f71d402a3e 46
visarute 0:27f71d402a3e 47 // SPI write data to MAX21105
visarute 0:27f71d402a3e 48 void writeMAX21105(char addr, char value){
visarute 0:27f71d402a3e 49 cs_MAX21105 = 0;
visarute 0:27f71d402a3e 50 spi1.write(addr); // MAX21100 Writing scheme
visarute 0:27f71d402a3e 51 spi1.write(value); // MAX21100 Writing scheme
visarute 0:27f71d402a3e 52 cs_MAX21105 = 1;
visarute 0:27f71d402a3e 53 }
visarute 0:27f71d402a3e 54
visarute 0:27f71d402a3e 55 // SPI read and return 8 bits data to MBED
visarute 0:27f71d402a3e 56 char readMAX21105(char addr){
visarute 0:27f71d402a3e 57 char buf_u8;
visarute 0:27f71d402a3e 58 cs_MAX21105 = 0;
visarute 0:27f71d402a3e 59 spi1.write(0x80|addr); // MAX21100 Reading scheme
visarute 0:27f71d402a3e 60 buf_u8 = spi1.write(0x0); // MAX21100 Reading scheme
visarute 0:27f71d402a3e 61 cs_MAX21105 = 1;
visarute 0:27f71d402a3e 62 return(buf_u8);
visarute 0:27f71d402a3e 63 }
visarute 0:27f71d402a3e 64
visarute 0:27f71d402a3e 65 void startMAX21105(){
visarute 0:27f71d402a3e 66 // Check MAX21105 conditions
visarute 0:27f71d402a3e 67 char whoami = readMAX21105(0x20); // WHOAMI register
visarute 0:27f71d402a3e 68 char buf = readMAX21105(0x21); // SILICON_REV_OTP register
visarute 0:27f71d402a3e 69
visarute 0:27f71d402a3e 70 // Set MAX21105 options
visarute 0:27f71d402a3e 71 writeMAX21105(0x00, 0x00); // SET_PWR 0x00 - Power down,
visarute 0:27f71d402a3e 72 writeMAX21105(0x01, 0x03); // SNS_CFG_1 0x03 - LPF = 2kHz, SNS_DOUT_FSC=125 dps
visarute 0:27f71d402a3e 73 writeMAX21105(0x02, 0x22); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz
visarute 0:27f71d402a3e 74 // writeMAX21105(0x02, 0x25); // SNS_CFG_2 0x25 - sns_gyr_ois_lpf=on, sns_odr=200Hz
visarute 0:27f71d402a3e 75 // writeMAX21105(0x02, 0x06); // SNS_CFG_2 0x06 - sns_odr=100Hz
visarute 0:27f71d402a3e 76 writeMAX21105(0x03, 0x00); // SNS_CFG_3 0x00 - sns_hpf_co = 0.08 Hz
visarute 0:27f71d402a3e 77 writeMAX21105(0x04, 0xC0); // SET_ACC_PWR 0xC0 - sns_acc_fsc=2g
visarute 0:27f71d402a3e 78 writeMAX21105(0x05, 0x30); // ACC_CFG1 0x30 acc_odr = 2000 Hz
visarute 0:27f71d402a3e 79 // writeMAX21105(0x05, 0x33); // ACC_CFG1 0x33 acc_odr = 200 Hz
visarute 0:27f71d402a3e 80 // writeMAX21105(0x05, 0x01); // ACC_CFG1 0x01 - acc_odr = 800 Hz
visarute 0:27f71d402a3e 81 writeMAX21105(0x06, 0x01); // ACC_CFG2 0x01 Unfiltered
visarute 0:27f71d402a3e 82 writeMAX21105(0x00, 0x78); // POWER_CFG 0x78 - accelero,gyro low noise
visarute 0:27f71d402a3e 83
visarute 0:27f71d402a3e 84 writeMAX21105(0x13, 0x01); // SET_TEMP_DR 0x01 - enable temp, fine, dataready all
visarute 0:27f71d402a3e 85 writeMAX21105(0x00, 0x78); // POWER_CFG 0x78 - accelero,gyro low noise
visarute 0:27f71d402a3e 86
visarute 0:27f71d402a3e 87 pc.printf("[IMU_INITIAL_ST]");
visarute 0:27f71d402a3e 88 pc.printf("WHOAMI = 0x%X (MAX21105: B4)", whoami); //WhoAmI MAX21105 = B4
visarute 0:27f71d402a3e 89 pc.printf("REVISION_ID = 0x%X", buf); // Should be 0x00
visarute 0:27f71d402a3e 90 pc.printf("[IMU_INITIAL_ED]\n");
visarute 0:27f71d402a3e 91 }
visarute 0:27f71d402a3e 92
visarute 0:27f71d402a3e 93 // Read 6 axis data
visarute 0:27f71d402a3e 94 // See MAX21105 User guide for address and bit field description
visarute 0:27f71d402a3e 95 void readMAX21105All(char *imuBuf,short imuCnt){
visarute 0:27f71d402a3e 96 // Variables for data from IMU
visarute 0:27f71d402a3e 97 char con; // IMU status
visarute 0:27f71d402a3e 98 short i; // Data point measurement loop variable
visarute 0:27f71d402a3e 99 int time;
visarute 0:27f71d402a3e 100 // Wait for connection and return data
visarute 0:27f71d402a3e 101 t.start();
visarute 0:27f71d402a3e 102 t.reset();
visarute 0:27f71d402a3e 103 for(i=0;i<imuCnt;i++) {
visarute 0:27f71d402a3e 104 while ((con = readMAX21105(0x23))==0); // wait until DATA_READY
visarute 0:27f71d402a3e 105 imuBuf[0+18*i] = con;
visarute 0:27f71d402a3e 106 imuBuf[1+18*i] = readMAX21105(0x24); // wX_H MSB Angular speed X
visarute 0:27f71d402a3e 107 imuBuf[2+18*i] = readMAX21105(0x25); // wX_L LSB Angular speed X
visarute 0:27f71d402a3e 108 imuBuf[3+18*i] = readMAX21105(0x26); // wY_H MSB Angular speed Y
visarute 0:27f71d402a3e 109 imuBuf[4+18*i] = readMAX21105(0x27); // wY_L LSB Angular speed Y
visarute 0:27f71d402a3e 110 imuBuf[5+18*i] = readMAX21105(0x28); // wZ_H MSB Angular speed Z
visarute 0:27f71d402a3e 111 imuBuf[6+18*i] = readMAX21105(0x29); // wZ_L LSB Angular speed Z
visarute 0:27f71d402a3e 112
visarute 0:27f71d402a3e 113 imuBuf[7+18*i] = readMAX21105(0x2A); // aX_H MSB Acceleration X
visarute 0:27f71d402a3e 114 imuBuf[8+18*i] = readMAX21105(0x2B); // aX_L LSB Acceleration X
visarute 0:27f71d402a3e 115 imuBuf[9+18*i] = readMAX21105(0x2C); //aY_H MSB Acceleration Y
visarute 0:27f71d402a3e 116 imuBuf[10+18*i] = readMAX21105(0x2D); //aY_L LSB Acceleration Y
visarute 0:27f71d402a3e 117 imuBuf[11+18*i] = readMAX21105(0x2E); //aZ_H MSB Acceleration Z
visarute 0:27f71d402a3e 118 imuBuf[12+18*i] = readMAX21105(0x2F); //aZ_L LSB Acceleration Z
visarute 0:27f71d402a3e 119 imuBuf[13+18*i] = readMAX21105(0x30); //TEMP_H MSB Temperature
visarute 0:27f71d402a3e 120 imuBuf[14+18*i] = readMAX21105(0x31); //TEMP_L LSB Temperature
visarute 0:27f71d402a3e 121 time=t.read_us();
visarute 0:27f71d402a3e 122 imuBuf[15+18*i] = (char)(time>>16&0xFF); //TEMP_L LSB Temperature
visarute 0:27f71d402a3e 123 imuBuf[16+18*i] = (char)(time>>8&0xFF); //TEMP_L LSB Temperature
visarute 0:27f71d402a3e 124 imuBuf[17+18*i] = (char)(time&0xFF); //TEMP_L LSB Temperature
visarute 0:27f71d402a3e 125 }
visarute 0:27f71d402a3e 126 t.stop();
visarute 0:27f71d402a3e 127 }
visarute 0:27f71d402a3e 128
visarute 0:27f71d402a3e 129 // Send all axis data to PC
visarute 0:27f71d402a3e 130 void sendPCAll(char *imuBuf,short imuCnt){
visarute 0:27f71d402a3e 131 pc.printf("[IMU_READALL_ST]");
visarute 0:27f71d402a3e 132 // Variables for data from IMU
visarute 0:27f71d402a3e 133 char con; // IMU status
visarute 0:27f71d402a3e 134 short i; // Data point measurement loop variable
visarute 0:27f71d402a3e 135
visarute 0:27f71d402a3e 136 uint8_t wX_H, wX_L, wY_H, wY_L, wZ_H, wZ_L; // Angular speed MSB&LSB x,y,z
visarute 0:27f71d402a3e 137 uint8_t aX_H, aX_L, aY_H, aY_L, aZ_H, aZ_L; // Acceleration MSB&LSB x,y,z
visarute 0:27f71d402a3e 138 uint8_t temp_H, temp_L;
visarute 0:27f71d402a3e 139 uint8_t time_H, time_M, time_L;
visarute 0:27f71d402a3e 140 uint16_t wx, wy, wz, ax, ay, az, temp; // Full angular speed & acceleration
visarute 0:27f71d402a3e 141 int time;
visarute 0:27f71d402a3e 142
visarute 0:27f71d402a3e 143 // Wait for connection and return data
visarute 0:27f71d402a3e 144 for(i=0;i<imuCnt;i++) {
visarute 0:27f71d402a3e 145 con=imuBuf[0+18*i];
visarute 0:27f71d402a3e 146 wX_H = imuBuf[1+18*i]; // MSB Angular speed X
visarute 0:27f71d402a3e 147 wX_L = imuBuf[2+18*i]; // LSB Angular speed X
visarute 0:27f71d402a3e 148 wY_H = imuBuf[3+18*i]; // MSB Angular speed Y
visarute 0:27f71d402a3e 149 wY_L = imuBuf[4+18*i]; // LSB Angular speed Y
visarute 0:27f71d402a3e 150 wZ_H = imuBuf[5+18*i]; // MSB Angular speed Z
visarute 0:27f71d402a3e 151 wZ_L = imuBuf[6+18*i]; // LSB Angular speed Z
visarute 0:27f71d402a3e 152
visarute 0:27f71d402a3e 153 aX_H = imuBuf[7+18*i]; // MSB Acceleration X
visarute 0:27f71d402a3e 154 aX_L = imuBuf[8+18*i]; // LSB Acceleration X
visarute 0:27f71d402a3e 155 aY_H = imuBuf[9+18*i]; // MSB Acceleration Y
visarute 0:27f71d402a3e 156 aY_L = imuBuf[10+18*i]; // LSB Acceleration Y
visarute 0:27f71d402a3e 157 aZ_H = imuBuf[11+18*i]; // MSB Acceleration Z
visarute 0:27f71d402a3e 158 aZ_L = imuBuf[12+18*i]; // LSB Acceleration Z
visarute 0:27f71d402a3e 159
visarute 0:27f71d402a3e 160 temp_H = imuBuf[13+18*i]; // MSB Temperature
visarute 0:27f71d402a3e 161 temp_L = imuBuf[14+18*i]; // LSB Temperature
visarute 0:27f71d402a3e 162
visarute 0:27f71d402a3e 163 time_H = imuBuf[15+18*i]; // MSB Time
visarute 0:27f71d402a3e 164 time_M = imuBuf[16+18*i]; // middle Time
visarute 0:27f71d402a3e 165 time_L = imuBuf[17+18*i]; // LSB Time
visarute 0:27f71d402a3e 166
visarute 0:27f71d402a3e 167 // Stack MSB and LSB together and send out thru serialPC
visarute 0:27f71d402a3e 168 wx = (uint16_t)((uint16_t)wX_H<<8|(wX_L));
visarute 0:27f71d402a3e 169 wy = (uint16_t)((uint16_t)wY_H<<8|(wY_L));
visarute 0:27f71d402a3e 170 wz = (uint16_t)((uint16_t)wZ_H<<8|(wZ_L));
visarute 0:27f71d402a3e 171 ax = (uint16_t)((uint16_t)aX_H<<8|(aX_L));
visarute 0:27f71d402a3e 172 ay = (uint16_t)((uint16_t)aY_H<<8|(aY_L));
visarute 0:27f71d402a3e 173 az = (uint16_t)((uint16_t)aZ_H<<8|(aZ_L));
visarute 0:27f71d402a3e 174 temp = (uint16_t)((uint16_t)temp_H<<8|(temp_L));
visarute 0:27f71d402a3e 175 time = (int)((int)time_H<<16|(int)time_M<<8|(time_L));
visarute 0:27f71d402a3e 176 pc.printf("ST%01X%04X%04X%04X%04X%04X%04X%04X%06XED",
visarute 0:27f71d402a3e 177 con, wx, wy, wz, ax, ay, az,temp,time);
visarute 0:27f71d402a3e 178 }
visarute 0:27f71d402a3e 179 pc.printf("[IMU_READALL_ED]");
visarute 0:27f71d402a3e 180 }
visarute 0:27f71d402a3e 181
visarute 0:27f71d402a3e 182 void burstGMAX21105(){
visarute 0:27f71d402a3e 183 writeMAX21105(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz
visarute 0:27f71d402a3e 184 writeMAX21105(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz
visarute 0:27f71d402a3e 185 char con; // IMU status
visarute 0:27f71d402a3e 186 char wX_H, wX_L, wY_H, wY_L, wZ_H, wZ_L; // Angular speed MSB&LSB x,y,z
visarute 0:27f71d402a3e 187 char aX_H, aX_L, aY_H, aY_L, aZ_H, aZ_L; // Accel MSB&LSB x,y,z
visarute 0:27f71d402a3e 188 int time;
visarute 0:27f71d402a3e 189 t.start();
visarute 0:27f71d402a3e 190 t.reset();
visarute 0:27f71d402a3e 191 while(1){
visarute 0:27f71d402a3e 192 while ((con = readMAX21105(0x23))==0); // wait until DATA_READY
visarute 0:27f71d402a3e 193 time=t.read_us();
visarute 0:27f71d402a3e 194 wX_H = readMAX21105(0x24); // wX_H MSB Angular speed X
visarute 0:27f71d402a3e 195 wX_L = readMAX21105(0x25); // wX_L LSB Angular speed X
visarute 0:27f71d402a3e 196 wY_H = readMAX21105(0x26); // wY_H MSB Angular speed Y
visarute 0:27f71d402a3e 197 wY_L = readMAX21105(0x27); // wY_L LSB Angular speed Y
visarute 0:27f71d402a3e 198 wZ_H = readMAX21105(0x28); // wZ_H MSB Angular speed Z
visarute 0:27f71d402a3e 199 wZ_L = readMAX21105(0x29); // wZ_L LSB Angular speed Z
visarute 0:27f71d402a3e 200 aX_H = readMAX21105(0x2A); // aX_H MSB Acceleration X
visarute 0:27f71d402a3e 201 aX_L = readMAX21105(0x2B); // aX_L LSB Acceleration X
visarute 0:27f71d402a3e 202 aY_H = readMAX21105(0x2C); //aY_H MSB Acceleration Y
visarute 0:27f71d402a3e 203 aY_L = readMAX21105(0x2D); //aY_L LSB Acceleration Y
visarute 0:27f71d402a3e 204 aZ_H = readMAX21105(0x2E); //aZ_H MSB Acceleration Z
visarute 0:27f71d402a3e 205 aZ_L = readMAX21105(0x2F); //aZ_L LSB Acceleration Z
visarute 0:27f71d402a3e 206 pc.printf("ST%01X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%08XED\n",con,wX_H,wX_L,wY_H,wY_L,wZ_H,wZ_L,aX_H,aX_L,aY_H,aY_L,aZ_H,aZ_L,time);
visarute 0:27f71d402a3e 207 }
visarute 0:27f71d402a3e 208 t.stop();
visarute 0:27f71d402a3e 209 }
visarute 0:27f71d402a3e 210
visarute 0:27f71d402a3e 211 void setMCP4921(int val){
visarute 0:27f71d402a3e 212 cs_MCP4921 = 0; // Select the device by seting chip select low
visarute 0:27f71d402a3e 213 spi1.write(0x70|(0xF&(val>>8)));// Set MCP4921 value. 0x7000 prefix
visarute 0:27f71d402a3e 214 spi1.write(0xFF&val); // Set MCP4921 value. 0x7000 prefix
visarute 0:27f71d402a3e 215 cs_MCP4921 = 1; // Deselect the device
visarute 0:27f71d402a3e 216 }
visarute 0:27f71d402a3e 217
visarute 0:27f71d402a3e 218 void startTSYS01st(){
visarute 0:27f71d402a3e 219 // Select the device by seting chip select low
visarute 0:27f71d402a3e 220 cs_TSYS01st = 0;
visarute 0:27f71d402a3e 221 spi1.write(0x1E); // Reset
visarute 0:27f71d402a3e 222 cs_TSYS01st=1;
visarute 0:27f71d402a3e 223 wait(0.1); //2.8 ms reload
visarute 0:27f71d402a3e 224
visarute 0:27f71d402a3e 225 uint8_t kH, kL, kA[8];
visarute 0:27f71d402a3e 226 char i;
visarute 0:27f71d402a3e 227
visarute 0:27f71d402a3e 228 kA[0]=0xAA;
visarute 0:27f71d402a3e 229 kA[1]=0xA8;
visarute 0:27f71d402a3e 230 kA[2]=0xA6;
visarute 0:27f71d402a3e 231 kA[3]=0xA4;
visarute 0:27f71d402a3e 232 kA[4]=0xA2;
visarute 0:27f71d402a3e 233 kA[5]=0xAC;
visarute 0:27f71d402a3e 234 kA[6]=0xAE;
visarute 0:27f71d402a3e 235 kA[7]=0xA0;
visarute 0:27f71d402a3e 236 pc.printf("[TEMPS_COEFF_ST]");
visarute 0:27f71d402a3e 237 for(i=0;i<8;i++){
visarute 0:27f71d402a3e 238 cs_TSYS01st = 0;
visarute 0:27f71d402a3e 239 spi1.write(kA[i]); // k0 read
visarute 0:27f71d402a3e 240 kH=spi1.write(0x00); // k0_MSB
visarute 0:27f71d402a3e 241 kL=spi1.write(0x00); // k0_LSB
visarute 0:27f71d402a3e 242 pc.printf("%02X%02X",kH,kL);
visarute 0:27f71d402a3e 243 cs_TSYS01st = 1;
visarute 0:27f71d402a3e 244 }
visarute 0:27f71d402a3e 245 pc.printf("[TEMPS_COEFF_ED]");
visarute 0:27f71d402a3e 246 }
visarute 0:27f71d402a3e 247
visarute 0:27f71d402a3e 248 void readTSYS01st(){
visarute 0:27f71d402a3e 249 uint8_t t[3];
visarute 0:27f71d402a3e 250 cs_TSYS01st = 0;
visarute 0:27f71d402a3e 251 spi1.write(0x48); // k0 read
visarute 0:27f71d402a3e 252 wait(0.1);
visarute 0:27f71d402a3e 253 cs_TSYS01st = 1;
visarute 0:27f71d402a3e 254
visarute 0:27f71d402a3e 255 cs_TSYS01st = 0;
visarute 0:27f71d402a3e 256 spi1.write(0x00); // k0 read
visarute 0:27f71d402a3e 257 t[0]=spi1.write(0x00); // k0 read
visarute 0:27f71d402a3e 258 t[1]=spi1.write(0x00); // k0 read
visarute 0:27f71d402a3e 259 t[2]=spi1.write(0x00); // k0 read
visarute 0:27f71d402a3e 260 cs_TSYS01st = 1;
visarute 0:27f71d402a3e 261 pc.printf("[TEMPS_VALUE_ST]");
visarute 0:27f71d402a3e 262 pc.printf("%02X%02X%02X",t[0],t[1],t[2]);
visarute 0:27f71d402a3e 263 pc.printf("[TEMPS_VALUE_ED]");
visarute 0:27f71d402a3e 264 }
visarute 0:27f71d402a3e 265
visarute 0:27f71d402a3e 266 // Start connection
visarute 0:27f71d402a3e 267 void initialization(){
visarute 0:27f71d402a3e 268 //pc.baud(921600);
visarute 0:27f71d402a3e 269 pc.baud(460800);
visarute 0:27f71d402a3e 270
visarute 0:27f71d402a3e 271 startSPI(); // Start SPI connection
visarute 0:27f71d402a3e 272 startMAX21105(); // Connect to MAX21105
visarute 0:27f71d402a3e 273 }
visarute 0:27f71d402a3e 274
visarute 0:27f71d402a3e 275 int main(){
visarute 0:27f71d402a3e 276 // Variable for main function
visarute 0:27f71d402a3e 277 char buf[16]; // Buffer for the command from PC
visarute 0:27f71d402a3e 278 char imuBuf[28800]; // Buffer for IMU output
visarute 0:27f71d402a3e 279 short imuCnt=1600; // # of Point read from imu
visarute 0:27f71d402a3e 280 int val; // Value from command
visarute 0:27f71d402a3e 281
visarute 0:27f71d402a3e 282 // Start system
visarute 0:27f71d402a3e 283 initialization();
visarute 0:27f71d402a3e 284 // Infinite loop: listen to serial command
visarute 0:27f71d402a3e 285 while(1) {
visarute 0:27f71d402a3e 286 if (pc.readable()) {
visarute 0:27f71d402a3e 287 //Command format: Start Mode Submode VALUe enD S F F FFFF D
visarute 0:27f71d402a3e 288 pc.gets(buf, 16);
visarute 0:27f71d402a3e 289 //pc.printf("Get buf: %s\n",buf);
visarute 0:27f71d402a3e 290 if ((buf[0] == 'S')&&(buf[7] == 'D')) {
visarute 0:27f71d402a3e 291 //Mode switch
visarute 0:27f71d402a3e 292 switch(buf[1]) {
visarute 0:27f71d402a3e 293 //read all axis mode
visarute 0:27f71d402a3e 294 case 'r':
visarute 0:27f71d402a3e 295 // Submode switch
visarute 0:27f71d402a3e 296 switch(buf[2]) {
visarute 0:27f71d402a3e 297 case 'a':
visarute 0:27f71d402a3e 298 readMAX21105All(imuBuf,imuCnt);
visarute 0:27f71d402a3e 299 sendPCAll(imuBuf,imuCnt);
visarute 0:27f71d402a3e 300 pc.printf("\n");
visarute 0:27f71d402a3e 301 break;
visarute 0:27f71d402a3e 302 case 'm':
visarute 0:27f71d402a3e 303 readMAX21105All(imuBuf,imuCnt);
visarute 0:27f71d402a3e 304 sendPCAll(imuBuf,imuCnt);
visarute 0:27f71d402a3e 305 readTSYS01st();
visarute 0:27f71d402a3e 306 pc.printf("\n");
visarute 0:27f71d402a3e 307 break;
visarute 0:27f71d402a3e 308 case 'b':
visarute 0:27f71d402a3e 309 burstGMAX21105();
visarute 0:27f71d402a3e 310 break;
visarute 0:27f71d402a3e 311 default:
visarute 0:27f71d402a3e 312 break;
visarute 0:27f71d402a3e 313 }
visarute 0:27f71d402a3e 314 //stage temperature
visarute 0:27f71d402a3e 315 case 's':
visarute 0:27f71d402a3e 316 // Submode switch
visarute 0:27f71d402a3e 317 switch(buf[2]) {
visarute 0:27f71d402a3e 318 case 's':
visarute 0:27f71d402a3e 319 startTSYS01st();
visarute 0:27f71d402a3e 320 pc.printf("\n");
visarute 0:27f71d402a3e 321 break;
visarute 0:27f71d402a3e 322 case 'r':
visarute 0:27f71d402a3e 323 readTSYS01st();
visarute 0:27f71d402a3e 324 pc.printf("\n");
visarute 0:27f71d402a3e 325 break;
visarute 0:27f71d402a3e 326 default:
visarute 0:27f71d402a3e 327 break;
visarute 0:27f71d402a3e 328 }
visarute 0:27f71d402a3e 329 break;
visarute 0:27f71d402a3e 330 //set heater
visarute 0:27f71d402a3e 331 case 'h':
visarute 0:27f71d402a3e 332 val = getVal(buf);
visarute 0:27f71d402a3e 333 if(val!=-1){
visarute 0:27f71d402a3e 334 setMCP4921(val);
visarute 0:27f71d402a3e 335 }
visarute 0:27f71d402a3e 336 break;
visarute 0:27f71d402a3e 337 default:
visarute 0:27f71d402a3e 338 break;
visarute 0:27f71d402a3e 339 }
visarute 0:27f71d402a3e 340 }
visarute 0:27f71d402a3e 341 }
visarute 0:27f71d402a3e 342 }
visarute 0:27f71d402a3e 343 return 0;
visarute 0:27f71d402a3e 344 }