Power Validation
Check for continuity between cell inputs, balance inputs, 3 V, 5 V, fused VBAT+ and fused VBAT-. All of these nets should be isolated from each other.
Connect the BMS carrier to the AFE isoSPI port A.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series, OR connect a power supply between VBAT+ and VBAT-. The power supply can be set to about 30 V with a current limit of about 100 mA.
Measure the voltage between 3 V and VBAT-, and 5 V and VBAT-. 3 V will only be powered when the LTC6811 is awake, so the LTC6811 needs to receive valid ADC commands over isoSPI every 2 s or the REFON bit can be set to 1 with the WRCFGA command, and then the 3 V net can be measured with a DMM. Otherwise, an oscilloscope can be used to measure the 3 V net after a valid ADC command is sent.
Turn off the power supply.
Battery Stack Monitor (LTC6811-1)
isoSPI Communication
Any commands sent to the LTC6811 require a PEC. Details can be found on page 53 of the datasheet and sample code on page 76. Additionally, if the LTC6811 has not received a command for 2 s, it will enter a sleep state and can be woken up by toggling the CS pin low and high before sending the command.
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Supply about 30 V between VBAT+ and VBAT-, or connect the AFE to 12 cells in series.
Send the RDCFGA command (0x00_02) from the BMS carrier to the AFE over SPI/isoSPI.
The AFE should respond by sending 6 bytes of data back to the BMS carrier:
Register | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|---|---|---|
CFGR0 Expected: | GPIO5 1 | GPIO4 1 | GPIO3 1 | GPIO2 1 | GPIO1 1 | REFON 0 | DTEN 1 | ADCOPT 0 |
CFGR1 Expected: | VUV[7] 0 | VUV[6] 0 | VUV[5] 0 | VUV[4] 0 | VUV[3] 0 | VUV[2] 0 | VUV[1] 0 | VUV[0] 0 |
CFGR2 Expected: | VOV[3] 0 | VOV[2] 0 | VOV[1] 0 | VOV[0] 0 | VUV[11] 0 | VUV[10] 0 | VUV[9] 0 | VUV[8] 0 |
CFGR3 Expected: | VOV[11] 0 | VOV[10] 0 | VOV[9] 0 | VOV[8] 0 | VOV[7] 0 | VOV[6] 0 | VOV[5] 0 | VOV[4] 0 |
CFGR4 Expected: | DCC8 0 | DCC7 0 | DCC6 0 | DCC5 0 | DCC4 0 | DCC3 0 | DCC2 0 | DCC1 0 |
CFGR5 Expected: | DCTO[3] 0 | DCTO[2] 0 | DCTO[1] 0 | DCTO[0] 0 | DCC12 0 | DCC11 0 | DCC10 0 | DCC9 0 |
Disconnect the cells from the AFE or turn off the power supply. Turn off the BMS carrier power supply.
Cell Measurements
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series.
Send two ADOW commands in filtered mode with PUP set to 1 (0x03_E8) from the BMS carrier to the AFE over SPI/isoSPI.
Wait for about 500 ms.
Send the RDCVA, RDCVB, RDCVC, and RDCVD commands (0x00_04, 0x00_06, 0x00_08, and 0x00_0A). The LTC6811 will send back 24 bytes, where each group of two bytes is the cell voltage, starting at cell 1 and increasing to cell 12. Store the result in an array, CellPU(n). The voltage of each cell is VCell(n) = CellPU(n) * 100 uV.
Send two ADOW commands in filtered mode with PUP set to 0 (0x03_C8) from the BMS carrier to the AFE over SPI/isoSPI.
Wait for about 500 ms.
Send the RDCVA, RDCVB, RDCVC, and RDCVD commands (0x00_04, 0x00_06, 0x00_08, and 0x00_0A). The LTC6811 will send back 24 bytes, where each group of two bytes is the cell voltage, starting at cell 1 and increasing to cell 12. Store the result in an array, CellPD(n). The voltage of each cell is VCell(n) = CellPD(n) * 100 uV.
Calculate CellΔ(n) = CellPU(n) - CellPD(n). If CellΔ(n+1) < -400mV for n<=11, then C(n) is open. If CellPD(12)=0, then C(12) is open.
Disconnect the cells from the AFE. Turn off the BMS carrier power supply.
Cell Balancing
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series.
Measure the cells.
Send the RDCVA, RDCVB, RDCVC, and RDCVD commands (0x00_04, 0x00_06, 0x00_08, and 0x00_0A). The LTC6811 will send back 4 groups of 6 bytes after each command, where each group of two bytes is the cell voltage, starting at cell 1 and increasing to cell 12. Store the result in an array, Cellinitial(n). The voltage of each cell is VCell(n) = Cellinitial(n) * 100 uV.
Send the WRSCTRL command (all low except 1 and 7).
Send the STSCTRL command.
Measure C1-C0, and C7-C6.
Send the CLRSCTRL command.
Repeat the last 4 steps 5 more times for each cell pair.
Send the RDCVA, RDCVB, RDCVC, and RDCVD commands (0x00_04, 0x00_06, 0x00_08, and 0x00_0A). The LTC6811 will send back 24 bytes, where each group of two bytes is the cell voltage, starting at cell 1 and increasing to cell 12. Store the result in an array, Cellfinal(n). The voltage of each cell is VCell(n) = Cellfinal(n) * 100 uV.
Compare the initial voltages to the final voltages. Each cell voltage should have decreased by the same percentage of the cell voltage (the exact amount is dependent on the discharge resistors and MOSFETs). If any cell voltage did not decrease, then that cell’s balancing is not working.
ADC Self Test
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series.
Send the STATST command with self test 1 (0x05_AF). The LTC6811 will verify the operation of the digital filters and memory and output the test results to the SC, ITMP, VA, and VD register groups (STATA and STATB).
Send the RDSTATA and RDSTATB commands (0x00_10, 0x00_12). Check if these values contain the value 0x95_65.
Send the CLRSTAT command (0x07_13).
Send the STATST command with self test 2 (0x03_C7). The LTC6811 will verify the operation of the digital filters and memory and output the test results to the SC, ITMP, VA, and VD register groups (STATA and STATB).
Send the RDSTATA and RDSTATB commands (0x00_10, 0x00_12). Check if these values contain the value 0x6A_9A.
Send the CLRSTAT command (0x07_13).
MUX Decoder Channels
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series.
Send the DIAGN command (0x07_15). Wait at least 4.5ms to ensure all channels cycled through. Alternatively, poll until command is complete.
Send the RDAUXB commands (0x00_0E). Check if bit 1 of STBR5 is 0 which indicates that the self test passed without error.
Send the CLRAUX command (0x07_12).
Self Test Cell Voltage
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series.
Send the CVST command with self test 1 (0x03_A7). The LTC6811 will verify the operation of the digital filters and memory and output the test results to the C1V to C12V register groups (CVA, CVB, CVC, CVD).
Send the RDCVA, RDCVB, RDCVC, and RDCVD commands (0x00_04, 0x00_06, 0x00_08, and 0x00_0A). Check if these values contain the value 0x95_65.
Send the CLRCELL command (0x07_11)
Send the CVST command with self test 2 (0x03_C7). The LTC6811 will verify the operation of the digital filters and memory and output the test results to the C1V to C12V register groups (CVA, CVB, CVC, CVD).
Send the RDCVA, RDCVB, RDCVC, and RDCVD commands (0x00_04, 0x00_06, 0x00_08, and 0x00_0A). Check if these values contain the value 0x6A_9A.
Send the CLRCELL command (0x07_11)
Self Test GPIOs
Connect the isoSPI port A to a BMS carrier board.
Power the BMS carrier board with 12 V.
Send the AXST command with self test 1 (0x05_A7). The LTC6811 will verify the operation of the digital filters and memory and output the test results to G1V to G5V, REF register groups (AUXA, AUXB).
Send the RDAUXA and RDAUXB commands (0x00_0C, 0x00_0E). Check if these values contain the value 0x95_65.
Send the CLRAUX command (0x07_12).
Send the CVST command with self test 2 (0x05_C7). The LTC6811 will verify the operation of the digital filters and memory and output the test results to the G1V to G5V, REF register groups (AUXA, AUXB).
Send the RDAUXA and RDAUXB commands (0x00_0C, 0x00_0E). Check if these values contain the value 0x6A_9A.
Send the CLRAUX command (0x07_12).
Multiplexer (ADG731)
Connect the BMS carrier to the AFE isoSPI port A.
Power the BMS carrier board with 12 V.
Connect the AFE to 12 cells in series, OR connect a power supply between VBAT+ and VBAT-. The power supply can be set to about 30 V with a current limit of about 100 mA. Connect resistors of known values for comparison.
Wakeup the LTC6811 by toggling the CS pin from the BMS carrier. To keep the LTC6811 awake, keep toggling the CS pin every second.
Write GPIO bits to 1 so they are not pulled low internally
Connect the P8 header junction to either oscilloscope or logic analyzer. Confirm that the SCLK signal is inverted compared to SCLK IN.
Send the WRCOMM command to initiate writing to the communication registers (0x07_21), followed by the PEC. This command expects 6 bytes to be written to the COMM registers. The 6 bytes are divided into 3 groups of 2 bytes, where the first 4 bits sent are the ICOMn[3:0] bits, followed by Dn[7:0], and finally the FCOMn[3:0] bits, where n=0, 1, 2.
The ICOM0[3:0] bits should be 0xA. This sets the GPIOs as a SPI master that toggles the CS high then low at the beginning of communications.
The D0[7:0] is the command to send to the multiplexer, which is 0b000AAAAA where AAAAA is the thermistor to measure (AAAAA can be any value from 0b00000 to 0b11111). Note that switches 17 and 18 of the MUX (address 0x10 and 0x11) correspond to PCB mounted thermistors as of version 2.0, so testing these require soldering SMD resistors to RT1 and RT2.
The FCOM[3:0] bits should be 0x9. This sets the CS high after the data is sent.
The ICOM1[3:0] bits should be set to 0xF. This ends the transmission so that the value from the ADC can be read before the next thermistor is selected. All data in the COMM registers after this nibble will be ignored so the rest of the bits can be 0.
After all the data is sent, another PEC must be sent.
Now that the data has been written to the COMM registers, it can be sent to the multiplexer using the STCOMM command, followed by the appropriate number of clock cycles.
Read the ADC value.
Receive data from the COMM registers. Compare the values with the measured values.
RDCOMM command.