Read output from MAX21105 and burst output to serial PC
Dependencies: mbed
main.cpp@0:27f71d402a3e, 2015-12-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |