BMS

Dependencies:   bms_master mbed

Committer:
roger5641
Date:
Fri Nov 17 09:02:34 2017 +0000
Revision:
2:e0ec3ed506ea
Parent:
0:3547f7580dbd
Child:
4:47d6a0b63e38
change library, one error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
roger5641 2:e0ec3ed506ea 1 /*
roger5641 0:3547f7580dbd 2 Copyright (c) 2017, Linear Technology Corp.(LTC)
roger5641 0:3547f7580dbd 3 All rights reserved.
roger5641 0:3547f7580dbd 4
roger5641 0:3547f7580dbd 5 Redistribution and use in source and binary forms, with or without
roger5641 0:3547f7580dbd 6 modification, are permitted provided that the following conditions are met:
roger5641 0:3547f7580dbd 7
roger5641 0:3547f7580dbd 8 1. Redistributions of source code must retain the above copyright notice, this
roger5641 0:3547f7580dbd 9 list of conditions and the following disclaimer.
roger5641 0:3547f7580dbd 10 2. Redistributions in binary form must reproduce the above copyright notice,
roger5641 0:3547f7580dbd 11 this list of conditions and the following disclaimer in the documentation
roger5641 0:3547f7580dbd 12 and/or other materials provided with the distribution.
roger5641 0:3547f7580dbd 13
roger5641 0:3547f7580dbd 14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
roger5641 0:3547f7580dbd 15 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
roger5641 0:3547f7580dbd 16 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
roger5641 0:3547f7580dbd 17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
roger5641 0:3547f7580dbd 18 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
roger5641 0:3547f7580dbd 19 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
roger5641 0:3547f7580dbd 20 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
roger5641 0:3547f7580dbd 21 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
roger5641 0:3547f7580dbd 22 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
roger5641 0:3547f7580dbd 23 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
roger5641 0:3547f7580dbd 24
roger5641 0:3547f7580dbd 25 The views and conclusions contained in the software and documentation are those
roger5641 0:3547f7580dbd 26 of the authors and should not be interpreted as representing official policies,
roger5641 0:3547f7580dbd 27 either expressed or implied, of Linear Technology Corp.
roger5641 0:3547f7580dbd 28
roger5641 0:3547f7580dbd 29 The Linear Technology Linduino is not affiliated with the official Arduino team.
roger5641 0:3547f7580dbd 30 However, the Linduino is only possible because of the Arduino team's commitment
roger5641 0:3547f7580dbd 31 to the open-source community. Please, visit http://www.arduino.cc and
roger5641 0:3547f7580dbd 32 http://store.arduino.cc , and consider a purchase that will help fund their
roger5641 0:3547f7580dbd 33 ongoing work.
roger5641 0:3547f7580dbd 34
roger5641 0:3547f7580dbd 35 Copyright 2017 Linear Technology Corp. (LTC)
roger5641 0:3547f7580dbd 36 */
roger5641 0:3547f7580dbd 37
roger5641 0:3547f7580dbd 38
roger5641 0:3547f7580dbd 39 #include "mbed.h"
roger5641 0:3547f7580dbd 40 #include <stdint.h>
roger5641 2:e0ec3ed506ea 41 #include "bms_master.h"
roger5641 0:3547f7580dbd 42
roger5641 0:3547f7580dbd 43 #define ENABLED 1
roger5641 0:3547f7580dbd 44 #define DISABLED 0
roger5641 0:3547f7580dbd 45
roger5641 0:3547f7580dbd 46 #define DATALOG_ENABLED 1
roger5641 0:3547f7580dbd 47 #define DATALOG_DISABLED 0
roger5641 0:3547f7580dbd 48
roger5641 0:3547f7580dbd 49 //char get_char();
roger5641 0:3547f7580dbd 50 void print_menu();
roger5641 0:3547f7580dbd 51 void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
roger5641 0:3547f7580dbd 52 void print_cells(uint8_t datalog_en);
roger5641 0:3547f7580dbd 53 void print_open();
roger5641 0:3547f7580dbd 54 void print_config();
roger5641 0:3547f7580dbd 55 void print_rxconfig();
roger5641 0:3547f7580dbd 56 void print_aux(uint8_t datalog_en);
roger5641 0:3547f7580dbd 57 void print_stat();
roger5641 0:3547f7580dbd 58 void check_error(int error);
roger5641 0:3547f7580dbd 59 /**********************************************************
roger5641 0:3547f7580dbd 60 Setup Variables
roger5641 0:3547f7580dbd 61 The following variables can be modified to
roger5641 0:3547f7580dbd 62 configure the software.
roger5641 0:3547f7580dbd 63
roger5641 0:3547f7580dbd 64 ***********************************************************/
roger5641 0:3547f7580dbd 65 const uint8_t TOTAL_IC = 1;//!<number of ICs in the daisy chain
roger5641 0:3547f7580dbd 66
roger5641 0:3547f7580dbd 67 //ADC Command Configurations
roger5641 0:3547f7580dbd 68 const uint8_t ADC_OPT = ADC_OPT_DISABLED; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 69 const uint8_t ADC_CONVERSION_MODE = MD_7KHZ_3KHZ;//MD_7KHZ_3KHZ; //MD_26HZ_2KHZ;//MD_7KHZ_3KHZ; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 70 const uint8_t ADC_DCP = DCP_DISABLED; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 71 const uint8_t CELL_CH_TO_CONVERT = CELL_CH_ALL; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 72 const uint8_t AUX_CH_TO_CONVERT = AUX_CH_ALL; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 73 const uint8_t STAT_CH_TO_CONVERT = STAT_CH_ALL; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 74
roger5641 0:3547f7580dbd 75 const uint16_t MEASUREMENT_LOOP_TIME = 500;//milliseconds(mS)
roger5641 0:3547f7580dbd 76
roger5641 0:3547f7580dbd 77 //Under Voltage and Over Voltage Thresholds
roger5641 0:3547f7580dbd 78 const uint16_t OV_THRESHOLD = 41000; // Over voltage threshold ADC Code. LSB = 0.0001
roger5641 0:3547f7580dbd 79 const uint16_t UV_THRESHOLD = 30000; // Under voltage threshold ADC Code. LSB = 0.0001
roger5641 0:3547f7580dbd 80
roger5641 0:3547f7580dbd 81 //Loop Measurement Setup These Variables are ENABLED or DISABLED Remember ALL CAPS
roger5641 0:3547f7580dbd 82 const uint8_t WRITE_CONFIG = DISABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 83 const uint8_t READ_CONFIG = DISABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 84 const uint8_t MEASURE_CELL = ENABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 85 const uint8_t MEASURE_AUX = DISABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 86 const uint8_t MEASURE_STAT = DISABLED; //This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 87 const uint8_t PRINT_PEC = DISABLED; //This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 88 /************************************
roger5641 0:3547f7580dbd 89 END SETUP
roger5641 0:3547f7580dbd 90 *************************************/
roger5641 0:3547f7580dbd 91
roger5641 0:3547f7580dbd 92 /******************************************************
roger5641 0:3547f7580dbd 93 *** Global Battery Variables received from 681x commands
roger5641 0:3547f7580dbd 94 These variables store the results from the LTC6811
roger5641 0:3547f7580dbd 95 register reads and the array lengths must be based
roger5641 0:3547f7580dbd 96 on the number of ICs on the stack
roger5641 0:3547f7580dbd 97 ******************************************************/
roger5641 0:3547f7580dbd 98
roger5641 0:3547f7580dbd 99 cell_asic bms_ic[TOTAL_IC];
roger5641 0:3547f7580dbd 100 void run_command(uint32_t cmd);
roger5641 0:3547f7580dbd 101 void measurement_loop(uint8_t datalog_en);
roger5641 0:3547f7580dbd 102 void print_pec(void);
roger5641 0:3547f7580dbd 103 void serial_print_hex(uint8_t data);
roger5641 0:3547f7580dbd 104
roger5641 0:3547f7580dbd 105
roger5641 0:3547f7580dbd 106 /*!*********************************************************************
roger5641 0:3547f7580dbd 107 \brief main loop
roger5641 0:3547f7580dbd 108 ***********************************************************************/
roger5641 0:3547f7580dbd 109 int main(void)
roger5641 0:3547f7580dbd 110 {
roger5641 2:e0ec3ed506ea 111 pc.baud(115200);
roger5641 2:e0ec3ed506ea 112 CS_PIN = 1;
roger5641 2:e0ec3ed506ea 113 spi.format(16,3);
roger5641 2:e0ec3ed506ea 114 spi.frequency(1000000); // 1MHz clock rate
roger5641 2:e0ec3ed506ea 115
roger5641 2:e0ec3ed506ea 116 LTC681x_init_cfg(TOTAL_IC, bms_ic);
roger5641 2:e0ec3ed506ea 117 LTC681x_reset_crc_count(TOTAL_IC,bms_ic);
roger5641 2:e0ec3ed506ea 118 LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
roger5641 2:e0ec3ed506ea 119 print_menu();
roger5641 2:e0ec3ed506ea 120
roger5641 2:e0ec3ed506ea 121 while(1)
roger5641 2:e0ec3ed506ea 122 {
roger5641 2:e0ec3ed506ea 123 if (pc.readable()) // Check for user input
roger5641 2:e0ec3ed506ea 124 {
roger5641 2:e0ec3ed506ea 125 uint32_t user_command;
roger5641 2:e0ec3ed506ea 126 user_command = read_int(); // Read the user command
roger5641 2:e0ec3ed506ea 127 pc.printf("%d",user_command);
roger5641 2:e0ec3ed506ea 128 run_command(user_command);
roger5641 2:e0ec3ed506ea 129 }
roger5641 2:e0ec3ed506ea 130 }
roger5641 0:3547f7580dbd 131 }
roger5641 0:3547f7580dbd 132
roger5641 0:3547f7580dbd 133
roger5641 0:3547f7580dbd 134 /*!*****************************************
roger5641 0:3547f7580dbd 135 \brief executes the user command
roger5641 0:3547f7580dbd 136 *******************************************/
roger5641 0:3547f7580dbd 137
roger5641 0:3547f7580dbd 138 void run_command(uint32_t cmd)
roger5641 0:3547f7580dbd 139 {
roger5641 0:3547f7580dbd 140 int8_t error = 0;
roger5641 0:3547f7580dbd 141 uint32_t conv_time = 0;
roger5641 0:3547f7580dbd 142 uint32_t user_command;
roger5641 0:3547f7580dbd 143 int8_t readIC=0;
roger5641 0:3547f7580dbd 144 char input = 0;
roger5641 0:3547f7580dbd 145 switch (cmd)
roger5641 0:3547f7580dbd 146 {
roger5641 0:3547f7580dbd 147
roger5641 0:3547f7580dbd 148 case 1: // Write Configuration Register
roger5641 0:3547f7580dbd 149 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 150 LTC681x_wrcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 151 print_config();
roger5641 0:3547f7580dbd 152 break;
roger5641 0:3547f7580dbd 153
roger5641 0:3547f7580dbd 154 case 2: // Read Configuration Register
roger5641 0:3547f7580dbd 155 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 156 error = LTC681x_rdcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 157 check_error(error);
roger5641 0:3547f7580dbd 158 print_rxconfig();
roger5641 0:3547f7580dbd 159 break;
roger5641 0:3547f7580dbd 160
roger5641 0:3547f7580dbd 161 case 3: // Start Cell ADC Measurement
roger5641 0:3547f7580dbd 162 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 163 LTC681x_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
roger5641 2:e0ec3ed506ea 164 conv_time = LTC681x_pollAdc();
roger5641 0:3547f7580dbd 165 pc.printf("cell conversion completed in:");
roger5641 0:3547f7580dbd 166 pc.printf("%.1f",((float)conv_time/1000));
roger5641 0:3547f7580dbd 167 pc.printf("mS");
roger5641 0:3547f7580dbd 168 pc.printf("\r");
roger5641 0:3547f7580dbd 169 break;
roger5641 0:3547f7580dbd 170
roger5641 0:3547f7580dbd 171 case 4: // Read Cell Voltage Registers
roger5641 0:3547f7580dbd 172 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 173 error = LTC681x_rdcv(0, TOTAL_IC,bms_ic); // Set to read back all cell voltage registers
roger5641 0:3547f7580dbd 174 check_error(error);
roger5641 0:3547f7580dbd 175 print_cells(DATALOG_DISABLED);
roger5641 0:3547f7580dbd 176 break;
roger5641 0:3547f7580dbd 177
roger5641 0:3547f7580dbd 178 case 5: // Start GPIO ADC Measurement
roger5641 0:3547f7580dbd 179 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 180 LTC681x_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT);
roger5641 2:e0ec3ed506ea 181 LTC681x_pollAdc();
roger5641 0:3547f7580dbd 182 pc.printf("aux conversion completed");
roger5641 0:3547f7580dbd 183 pc.printf("\r");
roger5641 0:3547f7580dbd 184 break;
roger5641 0:3547f7580dbd 185
roger5641 0:3547f7580dbd 186 case 6: // Read AUX Voltage Registers
roger5641 0:3547f7580dbd 187 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 188 error = LTC681x_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
roger5641 0:3547f7580dbd 189 check_error(error);
roger5641 0:3547f7580dbd 190 print_aux(DATALOG_DISABLED);
roger5641 0:3547f7580dbd 191 break;
roger5641 0:3547f7580dbd 192
roger5641 0:3547f7580dbd 193 case 7: // Start Status ADC Measurement
roger5641 0:3547f7580dbd 194 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 195 LTC681x_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT);
roger5641 2:e0ec3ed506ea 196 LTC681x_pollAdc();
roger5641 0:3547f7580dbd 197 pc.printf("stat conversion completed");
roger5641 0:3547f7580dbd 198 pc.printf("\r");
roger5641 0:3547f7580dbd 199 break;
roger5641 0:3547f7580dbd 200
roger5641 0:3547f7580dbd 201 case 8: // Read Status registers
roger5641 0:3547f7580dbd 202 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 203 error = LTC681x_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
roger5641 0:3547f7580dbd 204 check_error(error);
roger5641 0:3547f7580dbd 205 print_stat();
roger5641 0:3547f7580dbd 206 break;
roger5641 0:3547f7580dbd 207
roger5641 0:3547f7580dbd 208 case 9: // Loop Measurements
roger5641 0:3547f7580dbd 209 pc.printf("transmit 'm' to quit");
roger5641 0:3547f7580dbd 210 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 211 LTC681x_wrcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 212 while (input != 'm')
roger5641 0:3547f7580dbd 213 {
roger5641 0:3547f7580dbd 214 if (pc.readable() > 0)
roger5641 0:3547f7580dbd 215 {
roger5641 0:3547f7580dbd 216 input = read_char();
roger5641 0:3547f7580dbd 217 }
roger5641 0:3547f7580dbd 218
roger5641 0:3547f7580dbd 219 measurement_loop(DATALOG_DISABLED);
roger5641 0:3547f7580dbd 220
roger5641 0:3547f7580dbd 221 wait_ms(MEASUREMENT_LOOP_TIME);
roger5641 0:3547f7580dbd 222 }
roger5641 0:3547f7580dbd 223 //print_menu();
roger5641 0:3547f7580dbd 224 break;
roger5641 0:3547f7580dbd 225
roger5641 0:3547f7580dbd 226 case 10: // Run open wire self test
roger5641 0:3547f7580dbd 227 print_pec();
roger5641 0:3547f7580dbd 228
roger5641 0:3547f7580dbd 229 break;
roger5641 0:3547f7580dbd 230
roger5641 0:3547f7580dbd 231 case 11: // Read in raw configuration data
roger5641 2:e0ec3ed506ea 232 LTC681x_reset_crc_count(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 233 break;
roger5641 0:3547f7580dbd 234
roger5641 0:3547f7580dbd 235 case 12: // Run the ADC/Memory Self Test
roger5641 0:3547f7580dbd 236 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 237 error = LTC681x_run_cell_adc_st(CELL,ADC_CONVERSION_MODE,bms_ic);
roger5641 0:3547f7580dbd 238 pc.printf("%d",error);
roger5641 0:3547f7580dbd 239 pc.printf(" : errors detected in Digital Filter and CELL Memory \n");
roger5641 0:3547f7580dbd 240
roger5641 0:3547f7580dbd 241 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 242 error = LTC681x_run_cell_adc_st(AUX,ADC_CONVERSION_MODE, bms_ic);
roger5641 0:3547f7580dbd 243 pc.printf("%d",error);
roger5641 0:3547f7580dbd 244 pc.printf(" : errors detected in Digital Filter and AUX Memory \n");
roger5641 0:3547f7580dbd 245
roger5641 0:3547f7580dbd 246 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 247 error = LTC681x_run_cell_adc_st(STAT,ADC_CONVERSION_MODE, bms_ic);
roger5641 0:3547f7580dbd 248 pc.printf("%d",error);
roger5641 0:3547f7580dbd 249 pc.printf(" : errors detected in Digital Filter and STAT Memory \n");
roger5641 0:3547f7580dbd 250 print_menu();
roger5641 0:3547f7580dbd 251 break;
roger5641 0:3547f7580dbd 252
roger5641 0:3547f7580dbd 253 case 13: // Enable a discharge transistor
roger5641 0:3547f7580dbd 254 pc.printf("Please enter the Spin number");
roger5641 0:3547f7580dbd 255 readIC = (int8_t)read_int();
roger5641 0:3547f7580dbd 256 LTC6811_set_discharge(readIC,TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 257 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 258 LTC681x_wrcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 259 print_config();
roger5641 0:3547f7580dbd 260 break;
roger5641 0:3547f7580dbd 261
roger5641 0:3547f7580dbd 262 case 14: // Clear all discharge transistors
roger5641 0:3547f7580dbd 263 clear_discharge(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 264 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 265 LTC681x_wrcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 266 print_config();
roger5641 0:3547f7580dbd 267 break;
roger5641 0:3547f7580dbd 268
roger5641 0:3547f7580dbd 269 case 15: // Clear all ADC measurement registers
roger5641 0:3547f7580dbd 270 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 271 LTC681x_clrcell();
roger5641 2:e0ec3ed506ea 272 LTC681x_clraux();
roger5641 2:e0ec3ed506ea 273 LTC681x_clrstat();
roger5641 0:3547f7580dbd 274 pc.printf("All Registers Cleared");
roger5641 0:3547f7580dbd 275 break;
roger5641 0:3547f7580dbd 276
roger5641 0:3547f7580dbd 277 case 16: // Run the Mux Decoder Self Test
roger5641 0:3547f7580dbd 278 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 279 LTC681x_diagn();
roger5641 0:3547f7580dbd 280 wait_ms(5);
roger5641 2:e0ec3ed506ea 281 error = LTC681x_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
roger5641 0:3547f7580dbd 282 check_error(error);
roger5641 0:3547f7580dbd 283 error = 0;
roger5641 0:3547f7580dbd 284 for (int ic = 0; ic<TOTAL_IC; ic++)
roger5641 0:3547f7580dbd 285 {
roger5641 0:3547f7580dbd 286 if (bms_ic[ic].stat.mux_fail[0] != 0) error++;
roger5641 0:3547f7580dbd 287 }
roger5641 0:3547f7580dbd 288 if (error==0) pc.printf("Mux Test: PASS ");
roger5641 0:3547f7580dbd 289 else pc.printf("Mux Test: FAIL ");
roger5641 0:3547f7580dbd 290
roger5641 0:3547f7580dbd 291 break;
roger5641 0:3547f7580dbd 292
roger5641 0:3547f7580dbd 293 case 17: // Run ADC Overlap self test
roger5641 0:3547f7580dbd 294 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 295 error = (int8_t)LTC681x_run_adc_overlap(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 296 if (error==0) pc.printf("Overlap Test: PASS ");
roger5641 0:3547f7580dbd 297 else pc.printf("Overlap Test: FAIL");
roger5641 0:3547f7580dbd 298 break;
roger5641 0:3547f7580dbd 299
roger5641 0:3547f7580dbd 300 case 18: // Run ADC Redundancy self test
roger5641 0:3547f7580dbd 301 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 302 error = LTC681x_run_adc_redundancy_st(ADC_CONVERSION_MODE,AUX,TOTAL_IC, bms_ic);
roger5641 0:3547f7580dbd 303 pc.printf("%d",error);
roger5641 0:3547f7580dbd 304 pc.printf(" : errors detected in AUX Measurement \n");
roger5641 0:3547f7580dbd 305
roger5641 0:3547f7580dbd 306 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 307 error = LTC681x_run_adc_redundancy_st(ADC_CONVERSION_MODE,STAT,TOTAL_IC, bms_ic);
roger5641 0:3547f7580dbd 308 pc.printf("%d",error);
roger5641 0:3547f7580dbd 309 pc.printf(" : errors detected in STAT Measurement \n");
roger5641 0:3547f7580dbd 310 break;
roger5641 0:3547f7580dbd 311
roger5641 0:3547f7580dbd 312 case 19:
roger5641 2:e0ec3ed506ea 313 LTC681x_run_openwire(TOTAL_IC, bms_ic);
roger5641 0:3547f7580dbd 314 print_open();
roger5641 0:3547f7580dbd 315 break;
roger5641 0:3547f7580dbd 316
roger5641 0:3547f7580dbd 317 case 20: //Datalog print option Loop Measurements
roger5641 0:3547f7580dbd 318 pc.printf("transmit 'm' to quit");
roger5641 0:3547f7580dbd 319 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 320 LTC681x_wrcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 321 while (input != 'm')
roger5641 0:3547f7580dbd 322 {
roger5641 0:3547f7580dbd 323 if (pc.readable() > 0)
roger5641 0:3547f7580dbd 324 {
roger5641 0:3547f7580dbd 325 input = read_char();
roger5641 0:3547f7580dbd 326 }
roger5641 0:3547f7580dbd 327
roger5641 0:3547f7580dbd 328 measurement_loop(DATALOG_ENABLED);
roger5641 0:3547f7580dbd 329
roger5641 0:3547f7580dbd 330 wait_ms(MEASUREMENT_LOOP_TIME);
roger5641 0:3547f7580dbd 331 }
roger5641 0:3547f7580dbd 332 print_menu();
roger5641 0:3547f7580dbd 333 break;
roger5641 0:3547f7580dbd 334
roger5641 0:3547f7580dbd 335 case 'm': //prints menu
roger5641 0:3547f7580dbd 336 print_menu();
roger5641 0:3547f7580dbd 337 break;
roger5641 0:3547f7580dbd 338
roger5641 0:3547f7580dbd 339 default:
roger5641 0:3547f7580dbd 340 pc.printf("Incorrect Option");
roger5641 0:3547f7580dbd 341 break;
roger5641 0:3547f7580dbd 342 }
roger5641 0:3547f7580dbd 343 }
roger5641 0:3547f7580dbd 344
roger5641 0:3547f7580dbd 345 void measurement_loop(uint8_t datalog_en)
roger5641 0:3547f7580dbd 346 {
roger5641 0:3547f7580dbd 347 int8_t error = 0;
roger5641 0:3547f7580dbd 348 if (WRITE_CONFIG == ENABLED)
roger5641 0:3547f7580dbd 349 {
roger5641 0:3547f7580dbd 350 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 351 LTC681x_wrcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 352 print_config();
roger5641 0:3547f7580dbd 353 }
roger5641 0:3547f7580dbd 354
roger5641 0:3547f7580dbd 355 if (READ_CONFIG == ENABLED)
roger5641 0:3547f7580dbd 356 {
roger5641 0:3547f7580dbd 357 wakeup_sleep(TOTAL_IC);
roger5641 2:e0ec3ed506ea 358 error = LTC681x_rdcfg(TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 359 check_error(error);
roger5641 0:3547f7580dbd 360 print_rxconfig();
roger5641 0:3547f7580dbd 361 }
roger5641 0:3547f7580dbd 362
roger5641 0:3547f7580dbd 363 if (MEASURE_CELL == ENABLED)
roger5641 0:3547f7580dbd 364 {
roger5641 0:3547f7580dbd 365 wakeup_idle(TOTAL_IC);
roger5641 2:e0ec3ed506ea 366 LTC681x_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
roger5641 2:e0ec3ed506ea 367 LTC681x_pollAdc();
roger5641 0:3547f7580dbd 368 wakeup_idle(TOTAL_IC);
roger5641 2:e0ec3ed506ea 369 error = LTC681x_rdcv(0, TOTAL_IC,bms_ic);
roger5641 0:3547f7580dbd 370 check_error(error);
roger5641 0:3547f7580dbd 371 print_cells(datalog_en);
roger5641 0:3547f7580dbd 372
roger5641 0:3547f7580dbd 373 }
roger5641 0:3547f7580dbd 374
roger5641 0:3547f7580dbd 375 if (MEASURE_AUX == ENABLED)
roger5641 0:3547f7580dbd 376 {
roger5641 0:3547f7580dbd 377 wakeup_idle(TOTAL_IC);
roger5641 2:e0ec3ed506ea 378 LTC681x_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
roger5641 2:e0ec3ed506ea 379 LTC681x_pollAdc();
roger5641 0:3547f7580dbd 380 wakeup_idle(TOTAL_IC);
roger5641 2:e0ec3ed506ea 381 error = LTC681x_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
roger5641 0:3547f7580dbd 382 check_error(error);
roger5641 0:3547f7580dbd 383 print_aux(datalog_en);
roger5641 0:3547f7580dbd 384 }
roger5641 0:3547f7580dbd 385
roger5641 0:3547f7580dbd 386 if (MEASURE_STAT == ENABLED)
roger5641 0:3547f7580dbd 387 {
roger5641 0:3547f7580dbd 388 wakeup_idle(TOTAL_IC);
roger5641 2:e0ec3ed506ea 389 LTC681x_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
roger5641 2:e0ec3ed506ea 390 LTC681x_pollAdc();
roger5641 0:3547f7580dbd 391 wakeup_idle(TOTAL_IC);
roger5641 2:e0ec3ed506ea 392 error = LTC681x_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
roger5641 0:3547f7580dbd 393 check_error(error);
roger5641 0:3547f7580dbd 394 print_stat();
roger5641 0:3547f7580dbd 395 }
roger5641 0:3547f7580dbd 396
roger5641 0:3547f7580dbd 397 if (PRINT_PEC == ENABLED)
roger5641 0:3547f7580dbd 398 {
roger5641 0:3547f7580dbd 399 print_pec();
roger5641 0:3547f7580dbd 400 }
roger5641 0:3547f7580dbd 401
roger5641 0:3547f7580dbd 402 }
roger5641 0:3547f7580dbd 403
roger5641 0:3547f7580dbd 404
roger5641 0:3547f7580dbd 405 /*!*********************************
roger5641 0:3547f7580dbd 406 \brief Prints the main menu
roger5641 0:3547f7580dbd 407 ***********************************/
roger5641 0:3547f7580dbd 408 void print_menu()
roger5641 0:3547f7580dbd 409 {
roger5641 0:3547f7580dbd 410 pc.printf("Please enter LTC6811 Command");
roger5641 0:3547f7580dbd 411 pc.printf("Write Configuration: 1 | Reset PEC Counter: 11 ");
roger5641 0:3547f7580dbd 412 pc.printf("Read Configuration: 2 | Run ADC Self Test: 12");
roger5641 0:3547f7580dbd 413 pc.printf("Start Cell Voltage Conversion: 3 | Set Discharge: 13");
roger5641 0:3547f7580dbd 414 pc.printf("Read Cell Voltages: 4 | Clear Discharge: 14");
roger5641 0:3547f7580dbd 415 pc.printf("Start Aux Voltage Conversion: 5 | Clear Registers: 15");
roger5641 0:3547f7580dbd 416 pc.printf("Read Aux Voltages: 6 | Run Mux Self Test: 16");
roger5641 0:3547f7580dbd 417 pc.printf("Start Stat Voltage Conversion: 7 | Run ADC overlap Test: 17");
roger5641 0:3547f7580dbd 418 pc.printf("Read Stat Voltages: 8 | Run Digital Redundancy Test: 18");
roger5641 0:3547f7580dbd 419 pc.printf("loop Measurements: 9 | Run Open Wire Test: 19");
roger5641 0:3547f7580dbd 420 pc.printf("Read PEC Errors: 10 | Loop measurements with datalog output: 20");
roger5641 0:3547f7580dbd 421 pc.printf("\r");
roger5641 0:3547f7580dbd 422 pc.printf("Please enter command: ");
roger5641 0:3547f7580dbd 423 pc.printf("\r");
roger5641 0:3547f7580dbd 424 }
roger5641 0:3547f7580dbd 425
roger5641 0:3547f7580dbd 426 /*!************************************************************
roger5641 0:3547f7580dbd 427 \brief Prints cell voltage codes to the pc port
roger5641 0:3547f7580dbd 428 *************************************************************/
roger5641 0:3547f7580dbd 429 void print_cells(uint8_t datalog_en)
roger5641 0:3547f7580dbd 430 {
roger5641 0:3547f7580dbd 431
roger5641 0:3547f7580dbd 432
roger5641 0:3547f7580dbd 433 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 434 {
roger5641 0:3547f7580dbd 435 if (datalog_en == 0)
roger5641 0:3547f7580dbd 436 {
roger5641 0:3547f7580dbd 437 pc.printf(" IC ");
roger5641 0:3547f7580dbd 438 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 439 pc.printf(", ");
roger5641 0:3547f7580dbd 440 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++)
roger5641 0:3547f7580dbd 441 {
roger5641 0:3547f7580dbd 442
roger5641 0:3547f7580dbd 443 pc.printf(" C");
roger5641 0:3547f7580dbd 444 pc.printf("%d",i+1);
roger5641 0:3547f7580dbd 445 pc.printf(":");
roger5641 0:3547f7580dbd 446 pc.printf("%.4f",bms_ic[current_ic].cells.c_codes[i]*0.0001);
roger5641 0:3547f7580dbd 447 pc.printf(",");
roger5641 0:3547f7580dbd 448 }
roger5641 0:3547f7580dbd 449 pc.printf("\r");
roger5641 0:3547f7580dbd 450 }
roger5641 0:3547f7580dbd 451 else
roger5641 0:3547f7580dbd 452 {
roger5641 0:3547f7580dbd 453 pc.printf("Cells, ");
roger5641 0:3547f7580dbd 454 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++)
roger5641 0:3547f7580dbd 455 {
roger5641 0:3547f7580dbd 456 pc.printf("%.4f",bms_ic[current_ic].cells.c_codes[i]*0.0001);
roger5641 0:3547f7580dbd 457 pc.printf(",");
roger5641 0:3547f7580dbd 458 }
roger5641 0:3547f7580dbd 459
roger5641 0:3547f7580dbd 460 }
roger5641 0:3547f7580dbd 461 }
roger5641 0:3547f7580dbd 462 pc.printf("\r");
roger5641 0:3547f7580dbd 463 }
roger5641 0:3547f7580dbd 464
roger5641 0:3547f7580dbd 465 /*!****************************************************************************
roger5641 0:3547f7580dbd 466 \brief Prints Open wire test results to the pc port
roger5641 0:3547f7580dbd 467 *****************************************************************************/
roger5641 0:3547f7580dbd 468 void print_open()
roger5641 0:3547f7580dbd 469 {
roger5641 0:3547f7580dbd 470 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 471 {
roger5641 0:3547f7580dbd 472 if (bms_ic[current_ic].system_open_wire == 0)
roger5641 0:3547f7580dbd 473 {
roger5641 0:3547f7580dbd 474 pc.printf("No Opens Detected on IC: ");
roger5641 0:3547f7580dbd 475 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 476 pc.printf("\r");
roger5641 0:3547f7580dbd 477 }
roger5641 0:3547f7580dbd 478 else
roger5641 0:3547f7580dbd 479 {
roger5641 0:3547f7580dbd 480 for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++)
roger5641 0:3547f7580dbd 481 {
roger5641 0:3547f7580dbd 482 if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0)
roger5641 0:3547f7580dbd 483 {
roger5641 0:3547f7580dbd 484 pc.printf("There is an open wire on IC: ");
roger5641 0:3547f7580dbd 485 pc.printf("%d",current_ic + 1);
roger5641 0:3547f7580dbd 486 pc.printf(" Channel: ");
roger5641 0:3547f7580dbd 487 pc.printf("%d",cell);
roger5641 0:3547f7580dbd 488 }
roger5641 0:3547f7580dbd 489 }
roger5641 0:3547f7580dbd 490 }
roger5641 0:3547f7580dbd 491 }
roger5641 0:3547f7580dbd 492 }
roger5641 0:3547f7580dbd 493
roger5641 0:3547f7580dbd 494 /*!****************************************************************************
roger5641 0:3547f7580dbd 495 \brief Prints GPIO voltage codes and Vref2 voltage code onto the pc port
roger5641 0:3547f7580dbd 496 *****************************************************************************/
roger5641 0:3547f7580dbd 497 void print_aux(uint8_t datalog_en)
roger5641 0:3547f7580dbd 498 {
roger5641 0:3547f7580dbd 499
roger5641 0:3547f7580dbd 500 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 501 {
roger5641 0:3547f7580dbd 502 if (datalog_en == 0)
roger5641 0:3547f7580dbd 503 {
roger5641 0:3547f7580dbd 504 pc.printf(" IC ");
roger5641 0:3547f7580dbd 505 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 506 for (int i=0; i < 5; i++)
roger5641 0:3547f7580dbd 507 {
roger5641 0:3547f7580dbd 508 pc.printf(" GPIO-");
roger5641 0:3547f7580dbd 509 pc.printf("%d",i+1);
roger5641 0:3547f7580dbd 510 pc.printf(":");
roger5641 0:3547f7580dbd 511 pc.printf("%.4f",bms_ic[current_ic].aux.a_codes[i]*0.0001);
roger5641 0:3547f7580dbd 512 pc.printf(",");
roger5641 0:3547f7580dbd 513 }
roger5641 0:3547f7580dbd 514 pc.printf(" Vref2");
roger5641 0:3547f7580dbd 515 pc.printf(":");
roger5641 0:3547f7580dbd 516 pc.printf("%.4f",bms_ic[current_ic].aux.a_codes[5]*0.0001);
roger5641 0:3547f7580dbd 517 pc.printf("\r");
roger5641 0:3547f7580dbd 518 }
roger5641 0:3547f7580dbd 519 else
roger5641 0:3547f7580dbd 520 {
roger5641 0:3547f7580dbd 521 pc.printf("AUX, ");
roger5641 0:3547f7580dbd 522
roger5641 0:3547f7580dbd 523 for (int i=0; i < 6; i++)
roger5641 0:3547f7580dbd 524 {
roger5641 0:3547f7580dbd 525 pc.printf("%.4f",bms_ic[current_ic].aux.a_codes[i]*0.0001);
roger5641 0:3547f7580dbd 526 pc.printf(",");
roger5641 0:3547f7580dbd 527 }
roger5641 0:3547f7580dbd 528 }
roger5641 0:3547f7580dbd 529 }
roger5641 0:3547f7580dbd 530 pc.printf("\r");
roger5641 0:3547f7580dbd 531 }
roger5641 0:3547f7580dbd 532
roger5641 0:3547f7580dbd 533 /*!****************************************************************************
roger5641 0:3547f7580dbd 534 \brief Prints Status voltage codes and Vref2 voltage code onto the pc port
roger5641 0:3547f7580dbd 535 *****************************************************************************/
roger5641 0:3547f7580dbd 536 void print_stat()
roger5641 0:3547f7580dbd 537 {
roger5641 0:3547f7580dbd 538
roger5641 0:3547f7580dbd 539 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 540 {
roger5641 0:3547f7580dbd 541 pc.printf(" IC ");
roger5641 0:3547f7580dbd 542 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 543 pc.printf(" SOC:");
roger5641 0:3547f7580dbd 544 pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
roger5641 0:3547f7580dbd 545 pc.printf(",");
roger5641 0:3547f7580dbd 546 pc.printf(" Itemp:");
roger5641 0:3547f7580dbd 547 pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[1]*0.0001);
roger5641 0:3547f7580dbd 548 pc.printf(",");
roger5641 0:3547f7580dbd 549 pc.printf(" VregA:");
roger5641 0:3547f7580dbd 550 pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[2]*0.0001);
roger5641 0:3547f7580dbd 551 pc.printf(",");
roger5641 0:3547f7580dbd 552 pc.printf(" VregD:");
roger5641 0:3547f7580dbd 553 pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[3]*0.0001);
roger5641 0:3547f7580dbd 554 pc.printf("\r");
roger5641 0:3547f7580dbd 555 }
roger5641 0:3547f7580dbd 556
roger5641 0:3547f7580dbd 557 pc.printf("\r");
roger5641 0:3547f7580dbd 558 }
roger5641 0:3547f7580dbd 559
roger5641 0:3547f7580dbd 560 /*!******************************************************************************
roger5641 0:3547f7580dbd 561 \brief Prints the configuration data that is going to be written to the LTC6811
roger5641 0:3547f7580dbd 562 to the pc port.
roger5641 0:3547f7580dbd 563 ********************************************************************************/
roger5641 0:3547f7580dbd 564 void print_config()
roger5641 0:3547f7580dbd 565 {
roger5641 0:3547f7580dbd 566 int cfg_pec;
roger5641 0:3547f7580dbd 567
roger5641 0:3547f7580dbd 568 pc.printf("Written Configuration: ");
roger5641 0:3547f7580dbd 569 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 570 {
roger5641 0:3547f7580dbd 571 pc.printf(" IC ");
roger5641 0:3547f7580dbd 572 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 573 pc.printf(": ");
roger5641 0:3547f7580dbd 574 pc.printf("0x");
roger5641 0:3547f7580dbd 575 serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
roger5641 0:3547f7580dbd 576 pc.printf(", 0x");
roger5641 0:3547f7580dbd 577 serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
roger5641 0:3547f7580dbd 578 pc.printf(", 0x");
roger5641 0:3547f7580dbd 579 serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
roger5641 0:3547f7580dbd 580 pc.printf(", 0x");
roger5641 0:3547f7580dbd 581 serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
roger5641 0:3547f7580dbd 582 pc.printf(", 0x");
roger5641 0:3547f7580dbd 583 serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
roger5641 0:3547f7580dbd 584 pc.printf(", 0x");
roger5641 0:3547f7580dbd 585 serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
roger5641 0:3547f7580dbd 586 pc.printf(", Calculated PEC: 0x");
roger5641 0:3547f7580dbd 587 cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
roger5641 0:3547f7580dbd 588 serial_print_hex((uint8_t)(cfg_pec>>8));
roger5641 0:3547f7580dbd 589 pc.printf(", 0x");
roger5641 0:3547f7580dbd 590 serial_print_hex((uint8_t)(cfg_pec));
roger5641 0:3547f7580dbd 591 pc.printf("\r");
roger5641 0:3547f7580dbd 592 }
roger5641 0:3547f7580dbd 593 pc.printf("\r");
roger5641 0:3547f7580dbd 594 }
roger5641 0:3547f7580dbd 595
roger5641 0:3547f7580dbd 596 /*!*****************************************************************
roger5641 0:3547f7580dbd 597 \brief Prints the configuration data that was read back from the
roger5641 0:3547f7580dbd 598 LTC6811 to the pc port.
roger5641 0:3547f7580dbd 599 *******************************************************************/
roger5641 0:3547f7580dbd 600 void print_rxconfig()
roger5641 0:3547f7580dbd 601 {
roger5641 0:3547f7580dbd 602 pc.printf("Received Configuration ");
roger5641 0:3547f7580dbd 603 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 604 {
roger5641 0:3547f7580dbd 605 pc.printf(" IC ");
roger5641 0:3547f7580dbd 606 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 607 pc.printf(": 0x");
roger5641 0:3547f7580dbd 608 serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
roger5641 0:3547f7580dbd 609 pc.printf(", 0x");
roger5641 0:3547f7580dbd 610 serial_print_hex(bms_ic[current_ic].config.rx_data[1]);
roger5641 0:3547f7580dbd 611 pc.printf(", 0x");
roger5641 0:3547f7580dbd 612 serial_print_hex(bms_ic[current_ic].config.rx_data[2]);
roger5641 0:3547f7580dbd 613 pc.printf(", 0x");
roger5641 0:3547f7580dbd 614 serial_print_hex(bms_ic[current_ic].config.rx_data[3]);
roger5641 0:3547f7580dbd 615 pc.printf(", 0x");
roger5641 0:3547f7580dbd 616 serial_print_hex(bms_ic[current_ic].config.rx_data[4]);
roger5641 0:3547f7580dbd 617 pc.printf(", 0x");
roger5641 0:3547f7580dbd 618 serial_print_hex(bms_ic[current_ic].config.rx_data[5]);
roger5641 0:3547f7580dbd 619 pc.printf(", Received PEC: 0x");
roger5641 0:3547f7580dbd 620 serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
roger5641 0:3547f7580dbd 621 pc.printf(", 0x");
roger5641 0:3547f7580dbd 622 serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
roger5641 0:3547f7580dbd 623 pc.printf("\r");
roger5641 0:3547f7580dbd 624 }
roger5641 0:3547f7580dbd 625 pc.printf("\r");
roger5641 0:3547f7580dbd 626 }
roger5641 0:3547f7580dbd 627
roger5641 0:3547f7580dbd 628 void print_pec()
roger5641 0:3547f7580dbd 629 {
roger5641 0:3547f7580dbd 630 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++)
roger5641 0:3547f7580dbd 631 {
roger5641 0:3547f7580dbd 632 pc.printf("");
roger5641 0:3547f7580dbd 633 pc.printf("%d",bms_ic[current_ic].crc_count.pec_count);
roger5641 0:3547f7580dbd 634 pc.printf(" : PEC Errors Detected on IC");
roger5641 0:3547f7580dbd 635 pc.printf("%d",current_ic+1);
roger5641 0:3547f7580dbd 636 }
roger5641 0:3547f7580dbd 637 }
roger5641 0:3547f7580dbd 638
roger5641 0:3547f7580dbd 639
roger5641 0:3547f7580dbd 640 void serial_print_hex(uint8_t data)
roger5641 0:3547f7580dbd 641 {
roger5641 0:3547f7580dbd 642 if (data< 16)
roger5641 0:3547f7580dbd 643 {
roger5641 0:3547f7580dbd 644 pc.printf("0");
roger5641 0:3547f7580dbd 645 pc.printf("%X",data);
roger5641 0:3547f7580dbd 646 }
roger5641 0:3547f7580dbd 647 else
roger5641 0:3547f7580dbd 648 pc.printf("%X",data);
roger5641 0:3547f7580dbd 649 }
roger5641 0:3547f7580dbd 650
roger5641 0:3547f7580dbd 651 //Function to check error flag and print PEC error message
roger5641 0:3547f7580dbd 652 void check_error(int error)
roger5641 0:3547f7580dbd 653 {
roger5641 0:3547f7580dbd 654 if (error == -1)
roger5641 0:3547f7580dbd 655 {
roger5641 0:3547f7580dbd 656 pc.printf("A PEC error was detected in the received data");
roger5641 0:3547f7580dbd 657 }
roger5641 0:3547f7580dbd 658 }
roger5641 0:3547f7580dbd 659
roger5641 0:3547f7580dbd 660
roger5641 0:3547f7580dbd 661 //// hex conversion constants
roger5641 0:3547f7580dbd 662 //char hex_digits[16]=
roger5641 0:3547f7580dbd 663 //{
roger5641 0:3547f7580dbd 664 // '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
roger5641 0:3547f7580dbd 665 //};
roger5641 0:3547f7580dbd 666 //
roger5641 0:3547f7580dbd 667 //// global variables
roger5641 0:3547f7580dbd 668 //
roger5641 0:3547f7580dbd 669 //char hex_to_byte_buffer[5]=
roger5641 0:3547f7580dbd 670 //{
roger5641 0:3547f7580dbd 671 // '0', 'x', '0', '0', '\0'
roger5641 0:3547f7580dbd 672 //}; // buffer for ASCII hex to byte conversion
roger5641 0:3547f7580dbd 673 //char byte_to_hex_buffer[3]=
roger5641 0:3547f7580dbd 674 //{
roger5641 0:3547f7580dbd 675 // '\0','\0','\0'
roger5641 0:3547f7580dbd 676 //};
roger5641 0:3547f7580dbd 677 //
roger5641 0:3547f7580dbd 678 //char read_hex()
roger5641 0:3547f7580dbd 679 //// read 2 hex characters from the pc buffer and convert
roger5641 0:3547f7580dbd 680 //// them to a byte
roger5641 0:3547f7580dbd 681 //{
roger5641 0:3547f7580dbd 682 // byte data;
roger5641 0:3547f7580dbd 683 // hex_to_byte_buffer[2]=get_char();
roger5641 0:3547f7580dbd 684 // hex_to_byte_buffer[3]=get_char();
roger5641 0:3547f7580dbd 685 // get_char();
roger5641 0:3547f7580dbd 686 // get_char();
roger5641 0:3547f7580dbd 687 // data = strtol(hex_to_byte_buffer, NULL, 0);
roger5641 0:3547f7580dbd 688 // return(data);
roger5641 0:3547f7580dbd 689 //}
roger5641 0:3547f7580dbd 690 //
roger5641 0:3547f7580dbd 691 //char get_char()
roger5641 0:3547f7580dbd 692 //{
roger5641 0:3547f7580dbd 693 // // read a command from the pc port
roger5641 0:3547f7580dbd 694 // while (pc.readable() <= 0);
roger5641 0:3547f7580dbd 695 // return(pc.read());
roger5641 0:3547f7580dbd 696 //}
roger5641 0:3547f7580dbd 697
roger5641 0:3547f7580dbd 698