BMS

Dependencies:   bms_master mbed

Files at this revision

API Documentation at this revision

Comitter:
open4416
Date:
Mon Jan 22 03:43:00 2018 +0000
Parent:
7:5f7232441106
Commit message:
V1.00

Changed in this revision

LT_LIB.lib Show annotated file Show diff for this revision Revisions of this file
bms_master.lib Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 5f7232441106 -r 404c4d795fde LT_LIB.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LT_LIB.lib	Mon Jan 22 03:43:00 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/NTHUracing/code/LT_LIB/#6b6abf0fda1a
diff -r 5f7232441106 -r 404c4d795fde bms_master.lib
--- a/bms_master.lib	Wed Jan 17 08:28:06 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://os.mbed.com/users/roger5641/code/bms_master/#2561f59cd3dd
diff -r 5f7232441106 -r 404c4d795fde main.cpp
--- a/main.cpp	Wed Jan 17 08:28:06 2018 +0000
+++ b/main.cpp	Mon Jan 22 03:43:00 2018 +0000
@@ -1,43 +1,15 @@
 /*
-Copyright (c) 2017, Linear Technology Corp.(LTC)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-The views and conclusions contained in the software and documentation are those
-of the authors and should not be interpreted as representing official policies,
-either expressed or implied, of Linear Technology Corp.
-
-The Linear Technology Linduino is not affiliated with the official Arduino team.
-However, the Linduino is only possible because of the Arduino team's commitment
-to the open-source community.  Please, visit http://www.arduino.cc and
-http://store.arduino.cc , and consider a purchase that will help fund their
-ongoing work.
-
-Copyright 2017 Linear Technology Corp. (LTC)
- */
-
+    LTC6811-1: Battery stack monitor
+*/
 #include "mbed.h"
-#include <stdint.h>
-#include "bms_master.h"
+#include "stdint.h"
+#include "Linduino.h"
+#include "LT_SPI.h"
+#include "UserInterface.h"
+#include "LTC681x.h"
+#include "LTC6811.h"
+SPI spi(A6,A5,A4);
+DigitalOut spi_CS(A3, 1);
 
 #define ENABLED 1
 #define DISABLED 0
@@ -45,34 +17,28 @@
 #define DATALOG_ENABLED 1
 #define DATALOG_DISABLED 0
 
-DigitalOut fan1(D6); 
-DigitalOut fan2(D7); 
-DigitalOut fan3(D8); 
-DigitalOut fan4(D9); 
-
-DigitalOut led1(A1);
-DigitalOut led2(A0);
-DigitalOut led3(D3);
-DigitalOut led4(D4);
-DigitalOut led5(D5);
-
-//char get_char();
+void run_command(uint32_t cmd);
+void measurement_loop(uint8_t datalog_en);
 void print_menu();
-void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
 void print_cells(uint8_t datalog_en);
 void print_open();
+void print_aux(uint8_t datalog_en);
+void print_stat();
 void print_config();
 void print_rxconfig();
-void print_aux(uint8_t datalog_en);
-void print_stat();
+void print_pec(void);
+void serial_print_hex(uint8_t data);
 void check_error(int error);
+//char get_char();
+//void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
+
 /**********************************************************
   Setup Variables
   The following variables can be modified to
   configure the software.
 
 ***********************************************************/
-const uint8_t TOTAL_IC = 2;//!<number of ICs in the daisy chain
+const uint8_t TOTAL_IC = 1;//!<number of ICs in the daisy chain
 
 //ADC Command Configurations
 const uint8_t ADC_OPT = ADC_OPT_DISABLED; // See LTC6811_daisy.h for Options
@@ -107,11 +73,6 @@
  ******************************************************/
 
 cell_asic bms_ic[TOTAL_IC];
-void run_command(uint32_t cmd);
-void measurement_loop(uint8_t datalog_en);
-void print_pec(void);
-void serial_print_hex(uint8_t data);
-
 
 /*!*********************************************************************
   \brief main loop
@@ -119,25 +80,14 @@
 int main(void)
 {
     pc.baud(115200);
-    CS_PIN = 1;
-    spi.format(8,3);
-    spi.frequency(1000000);  // 1MHz clock rate
-    
-    led1 = 1;
-    led2 = 0;
-    led3 = 1;
-    led4 = 1;
-    led5 = 1;
-    
+    spi_enable();
     LTC681x_init_cfg(TOTAL_IC, bms_ic);
-    LTC681x_reset_crc_count(TOTAL_IC,bms_ic);
+    LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
     LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
     print_menu();
-    
-    while(1)
-    {      
-        if (pc.readable())           // Check for user input
-        {
+
+    while(1) {
+        if (pc.readable()) {         // Check for user input
             uint32_t user_command;
             user_command = read_int();      // Read the user command
             pc.printf("%d\n",user_command);
@@ -146,274 +96,262 @@
     }
 }
 
-
 /*!*****************************************
   \brief executes the user command
 *******************************************/
 
 void run_command(uint32_t cmd)
 {
-  int8_t error = 0;
-  uint32_t conv_time = 0;
-//  uint32_t user_command;
-  int8_t readIC=0;
-  char input = 0;
-  switch (cmd)
-  {
+    int8_t error = 0;
+    uint32_t conv_time = 0;
+//    uint32_t user_command;
+    int8_t readIC=0;
+    char input = 0;
+    switch (cmd) {
 
-    case 1: // Write Configuration Register
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_wrcfg(TOTAL_IC,bms_ic);
-      print_config();
-      break;
+        case 1: // Write Configuration Register
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_wrcfg(TOTAL_IC,bms_ic);
+            print_config();
+            break;
 
-    case 2: // Read Configuration Register
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_rdcfg(TOTAL_IC,bms_ic);
-      check_error(error);
-      print_rxconfig();
-      break;
+        case 2: // Read Configuration Register
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
+            check_error(error);
+            print_rxconfig();
+            break;
 
-    case 3: // Start Cell ADC Measurement
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
-      conv_time = LTC681x_pollAdc();
-      pc.printf("cell conversion completed in:");
-      pc.printf("%.1f",((float)conv_time/1000));
-      pc.printf("mS");
-      pc.printf("\n\r");
-      break;
+        case 3: // Start Cell ADC Measurement
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
+            conv_time = LTC6811_pollAdc();
+            pc.printf("cell conversion completed in:");
+            pc.printf("%.1f",((float)conv_time/1000));
+            pc.printf("mS\n");
+            break;
 
-    case 4: // Read Cell Voltage Registers
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_rdcv(0, TOTAL_IC,bms_ic); // Set to read back all cell voltage registers
-      check_error(error);
-      print_cells(DATALOG_DISABLED);
-      break;
+        case 4: // Read Cell Voltage Registers
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_rdcv(0, TOTAL_IC,bms_ic); // Set to read back all cell voltage registers
+            check_error(error);
+            print_cells(DATALOG_DISABLED);
+            break;
 
-    case 5: // Start GPIO ADC Measurement
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT);
-      LTC681x_pollAdc();
-      pc.printf("aux conversion completed");
-      pc.printf("\n\r");
-      break;
+        case 5: // Start GPIO ADC Measurement
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT);
+            LTC6811_pollAdc();
+            pc.printf("aux conversion completed\n");
+            pc.printf("\n");
+            break;
 
-    case 6: // Read AUX Voltage Registers
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-      check_error(error);
-      print_aux(DATALOG_DISABLED);
-      break;
+        case 6: // Read AUX Voltage Registers
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
+            check_error(error);
+            print_aux(DATALOG_DISABLED);
+            break;
 
-    case 7: // Start Status ADC Measurement
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT);
-      LTC681x_pollAdc();
-      pc.printf("stat conversion completed");
-      pc.printf("\n\r");
-      break;
+        case 7: // Start Status ADC Measurement
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT);
+            LTC6811_pollAdc();
+            pc.printf("stat conversion completed\n");
+            pc.printf("\n");
+            break;
 
-    case 8: // Read Status registers
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-      check_error(error);
-      print_stat();
-      break;
+        case 8: // Read Status registers
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
+            check_error(error);
+            print_stat();
+            break;
 
-    case 9: // Loop Measurements
-      pc.printf("transmit 'm' to quit");
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_wrcfg(TOTAL_IC,bms_ic);
-      while (input != 'm')
-      {
-        if (pc.readable() > 0)
-        {
-          input = read_char();
-        }
+        case 9: // Loop Measurements
+            pc.printf("transmit 'm' to quit\n");
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_wrcfg(TOTAL_IC,bms_ic);
+            while (input != 'm') {
+                if (pc.readable()) {
+                    input = read_char();
+                }
 
-        measurement_loop(DATALOG_DISABLED);
+                measurement_loop(DATALOG_DISABLED);
 
-        wait_ms(MEASUREMENT_LOOP_TIME);
-      }
-      //print_menu();
-      break;
+                wait_ms(MEASUREMENT_LOOP_TIME);
+            }
+            //print_menu();
+            break;
 
-    case 10: // Run open wire self test
-      print_pec();
+        case 10: // Run open wire self test
+            print_pec();
 
-      break;
+            break;
 
-    case 11: // Read in raw configuration data
-      LTC681x_reset_crc_count(TOTAL_IC,bms_ic);
-      break;
+        case 11: // Read in raw configuration data
+            LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
+            break;
 
-    case 12:  // Run the ADC/Memory Self Test
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_run_cell_adc_st(CELL,ADC_CONVERSION_MODE,bms_ic);
-      pc.printf("%d",error);
-      pc.printf(" : errors detected in Digital Filter and CELL Memory \n");
+        case 12:  // Run the ADC/Memory Self Test
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_run_cell_adc_st(CELL,ADC_CONVERSION_MODE,bms_ic);
+            pc.printf("%d", error);
+            pc.printf(" : errors detected in Digital Filter and CELL Memory\n");
 
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_run_cell_adc_st(AUX,ADC_CONVERSION_MODE, bms_ic);
-      pc.printf("%d",error);
-      pc.printf(" : errors detected in Digital Filter and AUX Memory \n");
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_run_cell_adc_st(AUX,ADC_CONVERSION_MODE, bms_ic);
+            pc.printf("%d",error);
+            pc.printf(" : errors detected in Digital Filter and AUX Memory\n");
 
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_run_cell_adc_st(STAT,ADC_CONVERSION_MODE, bms_ic);
-      pc.printf("%d",error);
-      pc.printf(" : errors detected in Digital Filter and STAT Memory \n");
-      print_menu();
-      break;
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_run_cell_adc_st(STAT,ADC_CONVERSION_MODE, bms_ic);
+            pc.printf("%d",error);
+            pc.printf(" : errors detected in Digital Filter and STAT Memory\n");
+            print_menu();
+            break;
 
-    case 13: // Enable a discharge transistor
-      pc.printf("Please enter the Spin number");
-      readIC = (int8_t)read_int();
-      LTC6811_set_discharge(readIC,TOTAL_IC,bms_ic);
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_wrcfg(TOTAL_IC,bms_ic);
-      print_config();
-      break;
+        case 13: // Enable a discharge transistor
+            pc.printf("Please enter the Spin number\n");
+            readIC = (int8_t)read_int();
+            LTC6811_set_discharge(readIC,TOTAL_IC,bms_ic);
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_wrcfg(TOTAL_IC,bms_ic);
+            print_config();
+            break;
 
-    case 14: // Clear all discharge transistors
-      clear_discharge(TOTAL_IC,bms_ic);
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_wrcfg(TOTAL_IC,bms_ic);
-      print_config();
-      break;
+        case 14: // Clear all discharge transistors
+            clear_discharge(TOTAL_IC,bms_ic);
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_wrcfg(TOTAL_IC,bms_ic);
+            print_config();
+            break;
+
+        case 15: // Clear all ADC measurement registers
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_clrcell();
+            LTC6811_clraux();
+            LTC6811_clrstat();
+            pc.printf("All Registers Cleared\n");
+            break;
 
-    case 15: // Clear all ADC measurement registers
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_clrcell();
-      LTC681x_clraux();
-      LTC681x_clrstat();
-      pc.printf("All Registers Cleared\n");
-      break;
-
-    case 16: // Run the Mux Decoder Self Test
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_diagn();
-      wait_ms(5);
-      error = LTC681x_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-      check_error(error);
-      error = 0;
-      for (int ic = 0; ic<TOTAL_IC; ic++)
-      {
-        if (bms_ic[ic].stat.mux_fail[0] != 0) error++;
-      }
-      if (error==0) pc.printf("Mux Test: PASS ");
-      else pc.printf("Mux Test: FAIL ");
+        case 16: // Run the Mux Decoder Self Test
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_diagn();
+            wait_ms(5);
+            error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
+            check_error(error);
+            error = 0;
+            for (int ic = 0;
+                    ic<TOTAL_IC;
+                    ic++) {
+                if (bms_ic[ic].stat.mux_fail[0] != 0) error++;
+            }
+            if (error==0) pc.printf("Mux Test: PASS\n");
+            else pc.printf("Mux Test: FAIL\n");
 
-      break;
+            break;
 
-    case 17: // Run ADC Overlap self test
-      wakeup_sleep(TOTAL_IC);
-      error = (int8_t)LTC681x_run_adc_overlap(TOTAL_IC,bms_ic);
-      if (error==0) pc.printf("Overlap Test: PASS ");
-      else pc.printf("Overlap Test: FAIL");
-      break;
+        case 17: // Run ADC Overlap self test
+            wakeup_sleep(TOTAL_IC);
+            error = (int8_t)LTC6811_run_adc_overlap(TOTAL_IC,bms_ic);
+            if (error==0) pc.printf("Overlap Test: PASS\n");
+            else pc.printf("Overlap Test: FAIL\n");
+            break;
 
-    case 18: // Run ADC Redundancy self test
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_run_adc_redundancy_st(ADC_CONVERSION_MODE,AUX,TOTAL_IC, bms_ic);
-      pc.printf("%d",error);
-      pc.printf(" : errors detected in AUX Measurement \n");
+        case 18: // Run ADC Redundancy self test
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,AUX,TOTAL_IC, bms_ic);
+            pc.printf("%d",error);
+            pc.printf(" : errors detected in AUX Measurement\n");
 
-      wakeup_sleep(TOTAL_IC);
-      error = LTC681x_run_adc_redundancy_st(ADC_CONVERSION_MODE,STAT,TOTAL_IC, bms_ic);
-      pc.printf("%d",error);
-      pc.printf(" : errors detected in STAT Measurement \n");
-      break;
-
-    case 19:
-      LTC681x_run_openwire(TOTAL_IC, bms_ic);
-      print_open();
-      break;
+            wakeup_sleep(TOTAL_IC);
+            error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,STAT,TOTAL_IC, bms_ic);
+            pc.printf("%d",error);
+            pc.printf(" : errors detected in STAT Measurement\n");
+            break;
 
-    case 20: //Datalog print option Loop Measurements
-      pc.printf("transmit 'm' to quit");
-      wakeup_sleep(TOTAL_IC);
-      LTC681x_wrcfg(TOTAL_IC,bms_ic);
-      while (input != 'm')
-      {
-        if (pc.readable() > 0)
-        {
-          input = read_char();
-        }
+        case 19:
+            LTC6811_run_openwire(TOTAL_IC, bms_ic);
+            print_open();
+            break;
 
-        measurement_loop(DATALOG_ENABLED);
+        case 20: //Datalog print option Loop Measurements
+            pc.printf("transmit 'm' to quit\n");
+            wakeup_sleep(TOTAL_IC);
+            LTC6811_wrcfg(TOTAL_IC,bms_ic);
+            while (input != 'm') {
+                if (pc.readable()) {
+                    input = read_char();
+                }
 
-        wait_ms(MEASUREMENT_LOOP_TIME);
-      }
-      print_menu();
-      break;
+                measurement_loop(DATALOG_ENABLED);
+
+                wait_ms(MEASUREMENT_LOOP_TIME);
+            }
+            print_menu();
+            break;
 
-    case 'm': //prints menu
-      print_menu();
-      break;
+        case 'm': //prints menu
+            print_menu();
+            break;
 
-    default:
-      pc.printf("Incorrect Option\n");
-      break;
-  }
+        default:
+            pc.printf("Incorrect Option\n");
+            break;
+    }
 }
 
 void measurement_loop(uint8_t datalog_en)
 {
-  int8_t error = 0;
-  if (WRITE_CONFIG == ENABLED)
-  {
-    wakeup_sleep(TOTAL_IC);
-    LTC681x_wrcfg(TOTAL_IC,bms_ic);
-    print_config();
-  }
+    int8_t error = 0;
+    if (WRITE_CONFIG == ENABLED) {
+        wakeup_sleep(TOTAL_IC);
+        LTC6811_wrcfg(TOTAL_IC,bms_ic);
+        print_config();
+    }
 
-  if (READ_CONFIG == ENABLED)
-  {
-    wakeup_sleep(TOTAL_IC);
-    error = LTC681x_rdcfg(TOTAL_IC,bms_ic);
-    check_error(error);
-    print_rxconfig();
-  }
+    if (READ_CONFIG == ENABLED) {
+        wakeup_sleep(TOTAL_IC);
+        error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
+        check_error(error);
+        print_rxconfig();
+    }
 
-  if (MEASURE_CELL == ENABLED)
-  {
-    wakeup_idle(TOTAL_IC);
-    LTC681x_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
-    LTC681x_pollAdc();
-    wakeup_idle(TOTAL_IC);
-    error = LTC681x_rdcv(0, TOTAL_IC,bms_ic);
-    check_error(error);
-    print_cells(datalog_en);
+    if (MEASURE_CELL == ENABLED) {
+        wakeup_idle(TOTAL_IC);
+        LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
+        LTC6811_pollAdc();
+        wakeup_idle(TOTAL_IC);
+        error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
+        check_error(error);
+        print_cells(datalog_en);
 
-  }
+    }
 
-  if (MEASURE_AUX == ENABLED)
-  {
-    wakeup_idle(TOTAL_IC);
-    LTC681x_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
-    LTC681x_pollAdc();
-    wakeup_idle(TOTAL_IC);
-    error = LTC681x_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-    check_error(error);
-    print_aux(datalog_en);
-  }
+    if (MEASURE_AUX == ENABLED) {
+        wakeup_idle(TOTAL_IC);
+        LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
+        LTC6811_pollAdc();
+        wakeup_idle(TOTAL_IC);
+        error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
+        check_error(error);
+        print_aux(datalog_en);
+    }
 
-  if (MEASURE_STAT == ENABLED)
-  {
-    wakeup_idle(TOTAL_IC);
-    LTC681x_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
-    LTC681x_pollAdc();
-    wakeup_idle(TOTAL_IC);
-    error = LTC681x_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-    check_error(error);
-    print_stat();
-  }
+    if (MEASURE_STAT == ENABLED) {
+        wakeup_idle(TOTAL_IC);
+        LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
+        LTC6811_pollAdc();
+        wakeup_idle(TOTAL_IC);
+        error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
+        check_error(error);
+        print_stat();
+    }
 
-  if (PRINT_PEC == ENABLED)
-  {
-    print_pec();
-  }
+    if (PRINT_PEC == ENABLED) {
+        print_pec();
+    }
 
 }
 
@@ -423,200 +361,150 @@
 ***********************************/
 void print_menu()
 {
-  pc.printf("Please enter LTC6811 Command\n");
-  pc.printf("Write Configuration: 1            | Reset PEC Counter: 11\n");
-  pc.printf("Read Configuration: 2             | Run ADC Self Test: 12\n");
-  pc.printf("Start Cell Voltage Conversion: 3  | Set Discharge: 13\n");
-  pc.printf("Read Cell Voltages: 4             | Clear Discharge: 14\n");
-  pc.printf("Start Aux Voltage Conversion: 5   | Clear Registers: 15\n");
-  pc.printf("Read Aux Voltages: 6              | Run Mux Self Test: 16\n");
-  pc.printf("Start Stat Voltage Conversion: 7  | Run ADC overlap Test: 17\n");
-  pc.printf("Read Stat Voltages: 8             | Run Digital Redundancy Test: 18\n");
-  pc.printf("loop Measurements: 9              | Run Open Wire Test: 19\n");
-  pc.printf("Read PEC Errors: 10               |  Loop measurements with datalog output: 20\n");
-  pc.printf("\r");
-  pc.printf("Please enter command: \n");
-  pc.printf("\r");
+    pc.printf("Please enter LTC6811 Command\n");
+    pc.printf("Write Configuration: 1            | Reset PEC Counter: 11\n");
+    pc.printf("Read Configuration: 2             | Run ADC Self Test: 12\n");
+    pc.printf("Start Cell Voltage Conversion: 3  | Set Discharge: 13\n");
+    pc.printf("Read Cell Voltages: 4             | Clear Discharge: 14\n");
+    pc.printf("Start Aux Voltage Conversion: 5   | Clear Registers: 15\n");
+    pc.printf("Read Aux Voltages: 6              | Run Mux Self Test: 16\n");
+    pc.printf("Start Stat Voltage Conversion: 7  | Run ADC overlap Test: 17\n");
+    pc.printf("Read Stat Voltages: 8             | Run Digital Redundancy Test: 18\n");
+    pc.printf("loop Measurements: 9              | Run Open Wire Test: 19\n");
+    pc.printf("Read PEC Errors: 10               |  Loop measurements with datalog output: 20\n");
+    pc.printf("\n");
+    pc.printf("Please enter command:\n");
+    pc.printf("\n");
 }
 
 /*!************************************************************
-  \brief Prints cell voltage codes to the pc port
+  \brief Prints cell voltage codes to the serial port
  *************************************************************/
 void print_cells(uint8_t datalog_en)
 {
-  for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++)
-  {
-    if (datalog_en == 0)
-    {
-      pc.printf(" IC ");
-      pc.printf("%d",current_ic+1);
-      pc.printf(", ");
-      for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++)
-      {
+    for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
 
-        pc.printf(" C");
-        pc.printf("%d",i+1);
-        pc.printf(":");
-        pc.printf("%.4f",bms_ic[current_ic].cells.c_codes[i]*0.0001);
-        pc.printf(",");
-      }
-      pc.printf("\r");
-    }
-    else
-    {
-      pc.printf("Cells, ");
-      for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++)
-      {
-        pc.printf("%.4f",bms_ic[current_ic].cells.c_codes[i]*0.0001);
-        pc.printf(",");
-      }
+        if (datalog_en == 0) {
+            pc.printf("IC%d, ", current_ic+1);
+            for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
+                pc.printf("C%d:", i+1);
+                pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001);
+            }
+            pc.printf("\n");
+        } else {
+            pc.printf("Cells, ");
+            for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
+                pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
+            }
+        }
 
     }
-  }
-  pc.printf("\n\r");
+    pc.printf("\n");
 }
 
 /*!****************************************************************************
-  \brief Prints Open wire test results to the pc port
+  \brief Prints Open wire test results to the serial port
  *****************************************************************************/
 void print_open()
 {
-  for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++)
-  {
-    if (bms_ic[current_ic].system_open_wire == 0)
-    {
-      pc.printf("No Opens Detected on IC: ");
-      pc.printf("%d",current_ic+1);
-      pc.printf("\n\r");
+    for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
+        if (bms_ic[current_ic].system_open_wire == 0) {
+            pc.printf("No Opens Detected on IC%d\n", current_ic+1);
+        } else {
+            for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++) {
+                if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0) {
+                    pc.printf("There is an open wire on IC%d Channel: %d\n", current_ic + 1, cell);
+                }
+            }
+        }
     }
-    else
-    {
-      for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++)
-      {
-        if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0)
-        {
-          pc.printf("There is an open wire on IC: ");
-          pc.printf("%d",current_ic + 1);
-          pc.printf(" Channel: ");
-          pc.printf("%d",cell);
-          pc.printf("\n\r");
-        }
-      }
-    }
-  }
-  pc.printf("\n\r");
 }
 
 /*!****************************************************************************
-  \brief Prints GPIO voltage codes and Vref2 voltage code onto the pc port
+  \brief Prints GPIO voltage codes and Vref2 voltage code onto the serial port
  *****************************************************************************/
 void print_aux(uint8_t datalog_en)
 {
-  for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++)
-  {
-    if (datalog_en == 0)
-    {
-      pc.printf(" IC ");
-      pc.printf("%d",current_ic+1);
-      for (int i=0; i < 5; i++)
-      {
-        pc.printf(" GPIO-");
-        pc.printf("%d",i+1);
-        pc.printf(":");
-        pc.printf("%.4f",bms_ic[current_ic].aux.a_codes[i]*0.0001);
-        pc.printf(",");
-      }
-      pc.printf(" Vref2");
-      pc.printf(":");
-      pc.printf("%.4f",bms_ic[current_ic].aux.a_codes[5]*0.0001);
-      pc.printf("\n\r");
+
+    for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
+        if (datalog_en == 0) {
+            pc.printf(" IC%d", current_ic+1);
+            for (int i=0; i < 5; i++) {
+                pc.printf(" GPIO-%d:%.4f,", i+1, bms_ic[current_ic].aux.a_codes[i]*0.0001);
+            }
+            pc.printf("Vref2:%.4f\n", bms_ic[current_ic].aux.a_codes[5]*0.0001);
+        } else {
+            pc.printf("AUX, ");
+            for (int i=0; i < 6; i++) {
+                pc.printf("%.4f,", bms_ic[current_ic].aux.a_codes[i]*0.0001);
+            }
+        }
     }
-    else
-    {
-      pc.printf("AUX, ");
-
-      for (int i=0; i < 6; i++)
-      {
-        pc.printf("%.4f",bms_ic[current_ic].aux.a_codes[i]*0.0001);
-        pc.printf(",");
-      }
-    }
-  }
-  pc.printf("\n\r");
+    pc.printf("\n");
 }
 
 /*!****************************************************************************
-  \brief Prints Status voltage codes and Vref2 voltage code onto the pc port
+  \brief Prints Status voltage codes and Vref2 voltage code onto the serial port
  *****************************************************************************/
 void print_stat()
 {
-  for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++)
-  {
-    pc.printf(" IC ");
-    pc.printf("%d",current_ic+1);
-    pc.printf(" SOC:");
-    pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
-    pc.printf(",");
-    pc.printf(" Itemp:");
-    pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[1]*0.0001);
-    pc.printf(",");
-    pc.printf(" VregA:");
-    pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[2]*0.0001);
-    pc.printf(",");
-    pc.printf(" VregD:");
-    pc.printf("%.4f",bms_ic[current_ic].stat.stat_codes[3]*0.0001);
-    pc.printf("\r");
-  }
-  pc.printf("\n\r");
+
+    for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
+        pc.printf("IC%d", current_ic+1);
+        pc.printf(" SOC:%.4f,", bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
+        pc.printf(" Itemp:%.4f,", bms_ic[current_ic].stat.stat_codes[1]*0.0001);
+        pc.printf(" VregA:%.4f,", bms_ic[current_ic].stat.stat_codes[2]*0.0001);
+        pc.printf(" VregD:%.4f\n", bms_ic[current_ic].stat.stat_codes[3]*0.0001);
+    }
+
+    pc.printf("\n");
 }
 
 /*!******************************************************************************
  \brief Prints the configuration data that is going to be written to the LTC6811
- to the pc port.
+ to the serial port.
  ********************************************************************************/
 void print_config()
 {
-  int cfg_pec;
+    int cfg_pec;
 
-  pc.printf("Written Configuration: ");
-  for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++)
-  {
-    pc.printf(" IC ");
-    pc.printf("%d",current_ic+1);
-    pc.printf(": ");
-    pc.printf("0x");
-    serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
-    pc.printf(", 0x");
-    serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
-    pc.printf(", 0x");
-    serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
-    pc.printf(", 0x");
-    serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
-    pc.printf(", 0x");
-    serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
-    pc.printf(", 0x");
-    serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
-    pc.printf(", Calculated PEC: 0x");
-    cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
-    serial_print_hex((uint8_t)(cfg_pec>>8));
-    pc.printf(", 0x");
-    serial_print_hex((uint8_t)(cfg_pec));
-    pc.printf("\r");
-  }
-  pc.printf("\n\r");
+    pc.printf("Written Configuration: \n");
+    for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
+        pc.printf(" IC ");
+        pc.printf("%d", current_ic+1);
+        pc.printf(": ");
+        pc.printf("0x");
+        serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
+        pc.printf(", 0x");
+        serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
+        pc.printf(", 0x");
+        serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
+        pc.printf(", 0x");
+        serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
+        pc.printf(", 0x");
+        serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
+        pc.printf(", 0x");
+        serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
+        pc.printf(", Calculated PEC: 0x");
+        cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
+        serial_print_hex((uint8_t)(cfg_pec>>8));
+        pc.printf(", 0x");
+        serial_print_hex((uint8_t)(cfg_pec));
+        pc.printf("\n");
+    }
+    pc.printf("\n");
 }
 
 /*!*****************************************************************
  \brief Prints the configuration data that was read back from the
- LTC6811 to the pc port.
+ LTC6811 to the serial port.
  *******************************************************************/
 void print_rxconfig()
 {
     pc.printf("Received Configuration ");
-    for (int current_ic=0; current_ic<TOTAL_IC; current_ic++)
-    {
+    for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
         pc.printf(" IC ");
-        pc.printf("%d",current_ic+1);
+        pc.printf("%d", current_ic+1);
         pc.printf(": 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
         pc.printf(", 0x");
@@ -633,40 +521,70 @@
         serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
         pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
-        pc.printf("\r");
+        pc.printf("\n");
     }
-    pc.printf("\n\r");
+    pc.printf("\n");
 }
 
 void print_pec()
 {
-  for (int current_ic=0; current_ic<TOTAL_IC; current_ic++)
-  {
-    pc.printf("");
-    pc.printf("%d",bms_ic[current_ic].crc_count.pec_count);
-    pc.printf(" : PEC Errors Detected on IC");
-    pc.printf("%d",current_ic+1);
-  }
-  pc.printf("\n\r");
+    for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
+        pc.printf("\n%d", bms_ic[current_ic].crc_count.pec_count);
+        pc.printf(" : PEC Errors Detected on IC");
+        pc.printf("%d\n", current_ic+1);
+    }
 }
 
 
 void serial_print_hex(uint8_t data)
 {
-  if (data< 16)
-  {
-    pc.printf("0");
-    pc.printf("%X",data);
-  }
-  else
-    pc.printf("%X",data);
+    if (data < 16) {
+        pc.printf("0x0%X", data);
+    } else
+        pc.printf("0x%X", data);
 }
 
 //Function to check error flag and print PEC error message
 void check_error(int error)
 {
-  if (error == -1)
-  {
-    pc.printf("A PEC error was detected in the received data\n");
-  }
+    if (error == -1) {
+        pc.printf("A PEC error was detected in the received data");
+    }
 }
+
+
+// hex conversion constants
+char hex_digits[16]= {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+};
+
+// global variables
+
+char hex_to_byte_buffer[5]= {
+    '0', 'x', '0', '0', '\0'
+};               // buffer for ASCII hex to byte conversion
+char byte_to_hex_buffer[3]= {
+    '\0','\0','\0'
+};
+
+//char read_hex()
+//// read 2 hex characters from the serial buffer and convert
+//// them to a byte
+//{
+//    byte data;
+//    hex_to_byte_buffer[2]=get_char();
+//    hex_to_byte_buffer[3]=get_char();
+//    get_char();
+//    get_char();
+//    data = strtol(hex_to_byte_buffer, NULL, 0);
+//    return(data);
+//}
+//
+//char get_char()
+//{
+//    // read a command from the serial port
+//    while (pc.readable() == 0);
+//    return(Serial.read());
+//}
+
+
diff -r 5f7232441106 -r 404c4d795fde mbed.bld
--- a/mbed.bld	Wed Jan 17 08:28:06 2018 +0000
+++ b/mbed.bld	Mon Jan 22 03:43:00 2018 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/fb8e0ae1cceb
\ No newline at end of file
+https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e
\ No newline at end of file