/*============================================================================ MBED_MAX21105_2IMU_Burst Read data from 2 MAX21105 IMU Data return by serial command in burst mode Visarute Pinrod SonicMEMS Laboratory, ECE, Cornell University, Ithaca, NY, USA Novemver 16, 2015 ============================================================================*/

Dependencies:   mbed

Committer:
visarute
Date:
Mon Jan 25 03:44:30 2016 +0000
Revision:
0:ee6b1953c19a
MBED_MAX21105_2IMU_Burst;  Read data from 2 MAX21105 IMU ;  Data return by serial command in burst mode;  Visarute Pinrod;  SonicMEMS Laboratory, ECE, Cornell University, Ithaca, NY

Who changed what in which revision?

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