foxBMS  1.6.0
The foxBMS Battery Management System API Documentation
adi_ades183x_voltages.c
Go to the documentation of this file.
1 /**
2  *
3  * @copyright © 2010 - 2023, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V.
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice, this
12  * list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  *
18  * 3. Neither the name of the copyright holder nor the names of its
19  * contributors may be used to endorse or promote products derived from
20  * this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * We kindly request you to use one or more of the following phrases to refer to
34  * foxBMS in your hardware, software, documentation or advertising materials:
35  *
36  * - ″This product uses parts of foxBMS®″
37  * - ″This product includes parts of foxBMS®″
38  * - ″This product is derived from foxBMS®″
39  *
40  */
41 
42 /**
43  * @file adi_ades183x_voltages.c
44  * @author foxBMS Team
45  * @date 2019-08-27 (date of creation)
46  * @updated 2023-10-12 (date of last update)
47  * @version v1.6.0
48  * @ingroup SOME_GROUP
49  * @prefix ADI
50  *
51  * @brief Implementation of some software
52  *
53  */
54 
55 /*========== Includes =======================================================*/
56 #include "adi_ades183x_voltages.h"
57 
58 #include "adi_ades183x_cfg.h"
59 
60 #include "adi_ades183x_buffers.h"
61 #include "adi_ades183x_commands.h"
64 #include "adi_ades183x_helpers.h"
65 #include "fassert.h"
66 
67 #include <math.h>
68 #include <stdbool.h>
69 #include <stdint.h>
70 
71 /*========== Macros and Definitions =========================================*/
72 
73 /*========== Static Constant and Variable Definitions =======================*/
74 
75 /*========== Extern Constant and Variable Definitions =======================*/
76 
77 /*========== Static Function Prototypes =====================================*/
78 
79 /**
80  * @brief Copies the related command bytes to read the average voltage
81  * registers
82  * @param commandBytesToReadVoltageRegisters command bytes to be copied
83  */
85  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters);
86 
87 /**
88  * @brief Copies the related command bytes to read the voltage registers
89  * @param commandBytesToReadVoltageRegisters command bytes to be copied
90  */
91 static void ADI_CopyCommandBytesCellVoltageRegister(ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters);
92 
93 /**
94  * @brief Copies the related command bytes to read the filtered voltage
95  * registers
96  * @param commandBytesToReadVoltageRegisters command bytes to be copied
97  */
99  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters);
100 
101 /**
102  * @brief Copies the related command bytes to read the redundant voltage
103  * registers
104  * @param commandBytesToReadVoltageRegisters command bytes to be copied
105  */
107  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters);
108 
109 /**
110  * @brief Copies the related command bytes to read the average voltage
111  * registers
112  * @param adiState state of the ADI driver
113  * @param commandBytesToReadVoltageRegisters command bytes to be copied
114  * @param storeLocation location where read data has to
115  * be stored
116  */
117 static void ADI_ReadAndStoreVoltages(
118  ADI_STATE_s *adiState,
119  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters,
120  ADI_VOLTAGE_STORE_LOCATION_e storeLocation);
121 
122 /**
123  * @brief Saves the cell voltage values read from the daisy-chain.
124  * @details There are 6 register to read _(A, B, C, D, E, F) to get all cell
125  * voltages.
126  * This function is called to store the result from the transmission
127  * buffer to the appropriate location in the driver.
128  * @param adiState state of the ADI driver
129  * @param data receive buffer
130  * @param registerSet voltage register that was read (voltage register A,
131  * B, C, D, E or F)
132  * @param storeLocation location where read data has to be stored
133  */
135  ADI_STATE_s *adiState,
136  uint8_t *data,
137  uint8_t registerSet,
138  ADI_VOLTAGE_STORE_LOCATION_e storeLocation);
139 
140 /*========== Static Function Implementations ================================*/
141 
142 static void ADI_CopyCommandBytesCellVoltageRegister(ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
143  FAS_ASSERT(commandBytesToReadVoltageRegisters != NULL_PTR);
144  ADI_CopyCommandBits(adi_cmdRdcva, commandBytesToReadVoltageRegisters->registerA);
145  ADI_CopyCommandBits(adi_cmdRdcvb, commandBytesToReadVoltageRegisters->registerB);
146  ADI_CopyCommandBits(adi_cmdRdcvc, commandBytesToReadVoltageRegisters->registerC);
147  ADI_CopyCommandBits(adi_cmdRdcvd, commandBytesToReadVoltageRegisters->registerD);
148  ADI_CopyCommandBits(adi_cmdRdcve, commandBytesToReadVoltageRegisters->registerE);
149  ADI_CopyCommandBits(adi_cmdRdcvf, commandBytesToReadVoltageRegisters->registerF);
150 }
151 
153  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
154  FAS_ASSERT(commandBytesToReadVoltageRegisters != NULL_PTR);
155  ADI_CopyCommandBits(adi_cmdRdaca, commandBytesToReadVoltageRegisters->registerA);
156  ADI_CopyCommandBits(adi_cmdRdacb, commandBytesToReadVoltageRegisters->registerB);
157  ADI_CopyCommandBits(adi_cmdRdacc, commandBytesToReadVoltageRegisters->registerC);
158  ADI_CopyCommandBits(adi_cmdRdacd, commandBytesToReadVoltageRegisters->registerD);
159  ADI_CopyCommandBits(adi_cmdRdace, commandBytesToReadVoltageRegisters->registerE);
160  ADI_CopyCommandBits(adi_cmdRdacf, commandBytesToReadVoltageRegisters->registerF);
161 }
162 
164  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
165  FAS_ASSERT(commandBytesToReadVoltageRegisters != NULL_PTR);
166  ADI_CopyCommandBits(adi_cmdRdfca, commandBytesToReadVoltageRegisters->registerA);
167  ADI_CopyCommandBits(adi_cmdRdfcb, commandBytesToReadVoltageRegisters->registerB);
168  ADI_CopyCommandBits(adi_cmdRdfcc, commandBytesToReadVoltageRegisters->registerC);
169  ADI_CopyCommandBits(adi_cmdRdfcd, commandBytesToReadVoltageRegisters->registerD);
170  ADI_CopyCommandBits(adi_cmdRdfce, commandBytesToReadVoltageRegisters->registerE);
171  ADI_CopyCommandBits(adi_cmdRdfcf, commandBytesToReadVoltageRegisters->registerF);
172 }
173 
175  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
176  FAS_ASSERT(commandBytesToReadVoltageRegisters != NULL_PTR);
177  ADI_CopyCommandBits(adi_cmdRdsva, commandBytesToReadVoltageRegisters->registerA);
178  ADI_CopyCommandBits(adi_cmdRdsvb, commandBytesToReadVoltageRegisters->registerB);
179  ADI_CopyCommandBits(adi_cmdRdsvc, commandBytesToReadVoltageRegisters->registerC);
180  ADI_CopyCommandBits(adi_cmdRdsvd, commandBytesToReadVoltageRegisters->registerD);
181  ADI_CopyCommandBits(adi_cmdRdsve, commandBytesToReadVoltageRegisters->registerE);
182  ADI_CopyCommandBits(adi_cmdRdsvf, commandBytesToReadVoltageRegisters->registerF);
183 }
184 
186  ADI_STATE_s *adiState,
187  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters,
188  ADI_VOLTAGE_STORE_LOCATION_e storeLocation) {
189  FAS_ASSERT(adiState != NULL_PTR);
190  FAS_ASSERT(commandBytesToReadVoltageRegisters != NULL_PTR);
192 
193  ADI_ReadRegister(commandBytesToReadVoltageRegisters->registerA, adi_dataReceive, adiState);
195 
196  ADI_ReadRegister(commandBytesToReadVoltageRegisters->registerB, adi_dataReceive, adiState);
198 
199  ADI_ReadRegister(commandBytesToReadVoltageRegisters->registerC, adi_dataReceive, adiState);
201 
202  ADI_ReadRegister(commandBytesToReadVoltageRegisters->registerD, adi_dataReceive, adiState);
204 
205  ADI_ReadRegister(commandBytesToReadVoltageRegisters->registerE, adi_dataReceive, adiState);
207 
208  ADI_ReadRegister(commandBytesToReadVoltageRegisters->registerF, adi_dataReceive, adiState);
210 }
211 
212 /* RequirementId: D7.1 V0R4 FUN-1.10.01.03 */
214  ADI_STATE_s *adiState,
215  uint8_t *data,
216  uint8_t registerSet,
217  ADI_VOLTAGE_STORE_LOCATION_e storeLocation) {
218  FAS_ASSERT(adiState != NULL_PTR);
219  FAS_ASSERT(data != NULL_PTR);
220  FAS_ASSERT(
221  (registerSet == ADI_RESULT_REGISTER_SET_A) || (registerSet == ADI_RESULT_REGISTER_SET_B) ||
222  (registerSet == ADI_RESULT_REGISTER_SET_C) || (registerSet == ADI_RESULT_REGISTER_SET_D) ||
223  (registerSet == ADI_RESULT_REGISTER_SET_E) || (registerSet == ADI_RESULT_REGISTER_SET_F));
225 
226  uint16_t cellOffset = 0u;
227  uint16_t registerVoltageIndex = 0u;
228  uint16_t storedVoltageIndex = 0u;
229  uint16_t rawValue = 0u;
230  int16_t signedValue = 0;
231  float_t floatVoltage = 0.0f;
232  int16_t voltage = 0;
233  uint16_t bufferLSB = 0u;
234  uint16_t bufferMSB = 0u;
235  DATA_BLOCK_CELL_VOLTAGE_s *pVoltageTable = NULL_PTR;
236  static uint16_t numberValidMeasurements = 0;
237 
238  if ((storeLocation == ADI_CELL_VOLTAGE) && (registerSet == ADI_RESULT_REGISTER_SET_A)) {
239  numberValidMeasurements = 0u;
240  }
241 
242  switch (storeLocation) {
243  case ADI_CELL_VOLTAGE:
244  pVoltageTable = adiState->data.cellVoltage;
245  break;
247  pVoltageTable = adiState->data.cellVoltageAverage;
248  break;
250  pVoltageTable = adiState->data.cellVoltageFiltered;
251  break;
253  pVoltageTable = adiState->data.cellVoltageRedundant;
254  break;
256  pVoltageTable = adiState->data.cellVoltageOpenWireEven;
257  break;
259  pVoltageTable = adiState->data.cellVoltageOpenWireOdd;
260  break;
262  pVoltageTable = adiState->data.cellVoltageAverageOpenWire;
263  break;
265  pVoltageTable = adiState->data.cellVoltageRedundantOpenWire;
266  break;
267  default: /* LCOV_EXCL_LINE */
268  FAS_ASSERT(FAS_TRAP); /* LCOV_EXCL_LINE */
269  break; /* LCOV_EXCL_LINE */
270  }
271 
272  switch (registerSet) {
273  case ADI_RESULT_REGISTER_SET_A: /* Voltage register group A: 3 voltages */
274  cellOffset = ADI_VOLTAGE_00_02_OFFSET;
275  break;
276  case ADI_RESULT_REGISTER_SET_B: /* Voltage register group B: 3 voltages */
277  cellOffset = ADI_VOLTAGE_03_05_OFFSET;
278  break;
279  case ADI_RESULT_REGISTER_SET_C: /* Voltage register group C: 3 voltages */
280  cellOffset = ADI_VOLTAGE_06_08_OFFSET;
281  break;
282  case ADI_RESULT_REGISTER_SET_D: /* Voltage register group D: 3 voltages */
283  cellOffset = ADI_VOLTAGE_09_11_OFFSET;
284  break;
285  case ADI_RESULT_REGISTER_SET_E: /* Voltage register group E: 3 voltages */
286  cellOffset = ADI_VOLTAGE_12_14_OFFSET;
287  break;
288  case ADI_RESULT_REGISTER_SET_F: /* Voltage register group F: */
289  cellOffset = ADI_VOLTAGE_15_18_OFFSET;
290  break;
291  default: /* LCOV_EXCL_LINE */
292  FAS_ASSERT(FAS_TRAP); /* LCOV_EXCL_LINE */
293  break; /* LCOV_EXCL_LINE */
294  }
295 
296  for (uint16_t m = 0u; m < ADI_N_ADI; m++) {
297  /* Parse all voltages contained in one register */
298  for (uint16_t c = 0u; c < ADI_MAX_NUMBER_OF_VOLTAGES_IN_REGISTER; c++) {
299  registerVoltageIndex = c + cellOffset;
300  if (registerVoltageIndex < ADI_MAX_SUPPORTED_CELLS) {
301  /* Check if cell voltage input is used */
302  if (adi_voltageInputsUsed[registerVoltageIndex] == 1u) {
303  /* If input used, translate number to store voltage at the appropriate location */
304  storedVoltageIndex = ADI_GetStoredVoltageIndex(registerVoltageIndex);
305  if (storedVoltageIndex < BS_NR_OF_CELL_BLOCKS_PER_MODULE) {
306  bufferMSB = (uint16_t)(data
308  (m * ADI_MAX_REGISTER_SIZE_IN_BYTES) + 1u]);
309  bufferLSB = (uint16_t)(data
312  rawValue = bufferLSB | (bufferMSB << ADI_BYTE_SHIFT);
313  signedValue = (int16_t)rawValue;
314  floatVoltage =
317  voltage = (int16_t)floatVoltage; /* Unit mV */
318 
319  pVoltageTable->cellVoltage_mV[adiState->currentString][m][storedVoltageIndex] = voltage;
320  /* RequirementId: D7.1 V0R4 SIF-4.40.01.01 */
321  /* Check that register does not contain cleared value */
322  if (rawValue != ADI_REGISTER_CLEARED_VALUE) {
324  true;
325  } else {
327  false;
328  }
329 
330  if (storeLocation == ADI_CELL_VOLTAGE) {
331  if (ADI_EvaluateDiagnosticCellVoltages(adiState, m) == false) {
332  adiState->data.cellVoltage->invalidCellVoltage[adiState->currentString][m] |=
333  (0x01u << storedVoltageIndex);
334  } else {
335  adiState->data.cellVoltage->invalidCellVoltage[adiState->currentString][m] &=
336  (~0x01u << storedVoltageIndex);
337  numberValidMeasurements++;
338  }
339  }
340  }
341  }
342  }
343  }
344  }
345  if ((storeLocation == ADI_CELL_VOLTAGE) && (registerSet == ADI_RESULT_REGISTER_SET_F)) {
346  adiState->data.cellVoltage->nrValidCellVoltages[adiState->currentString] = numberValidMeasurements;
347  }
348 }
349 
350 /*========== Extern Function Implementations ================================*/
351 /* RequirementId: D7.1 V0R4 FUN-1.10.01.01 */
352 extern void ADI_GetVoltages(
353  ADI_STATE_s *adiState,
354  ADI_VOLTAGE_REGISTER_TYPE_e registerType,
355  ADI_VOLTAGE_STORE_LOCATION_e storeLocation) {
356  FAS_ASSERT(adiState != NULL_PTR);
357  FAS_ASSERT(
358  (registerType == ADI_CELL_VOLTAGE_REGISTER) || (registerType == ADI_AVERAGE_CELL_VOLTAGE_REGISTER) ||
359  (registerType == ADI_FILTERED_CELL_VOLTAGE_REGISTER) || (registerType == ADI_REDUNDANT_CELL_VOLTAGE_REGISTER));
361 
362  ADI_COMMAND_READ_REGISTERS_s commandBytesToReadVoltageRegisters = {
363  .registerA = {0},
364  .registerB = {0},
365  .registerC = {0},
366  .registerD = {0},
367  .registerE = {0},
368  .registerF = {0},
369  };
370 
371  switch (registerType) {
373  ADI_CopyCommandBytesCellVoltageRegister(&commandBytesToReadVoltageRegisters);
374  break;
376  ADI_CopyCommandBytesAverageCellVoltageRegisters(&commandBytesToReadVoltageRegisters);
377  break;
379  ADI_CopyCommandBytesFilteredCellVoltageRegisters(&commandBytesToReadVoltageRegisters);
380  break;
382  ADI_CopyCommandBytesRedundantCellVoltageRegisters(&commandBytesToReadVoltageRegisters);
383  break;
384  default: /* LCOV_EXCL_LINE */
385  FAS_ASSERT(FAS_TRAP); /* LCOV_EXCL_LINE */
386  break; /* LCOV_EXCL_LINE */
387  }
388  ADI_ReadAndStoreVoltages(adiState, &commandBytesToReadVoltageRegisters, storeLocation);
389 }
390 
391 extern uint16_t ADI_GetStoredVoltageIndex(uint16_t registerVoltageIndex) {
392  FAS_ASSERT(registerVoltageIndex < ADI_MAX_SUPPORTED_CELLS);
393 
394  uint16_t storedVoltageIndex = 0u;
395  for (uint8_t c = 0; c < registerVoltageIndex; c++) {
396  if (adi_voltageInputsUsed[c] == 1u) {
397  storedVoltageIndex++;
398  }
399  }
400  return storedVoltageIndex;
401 }
402 
404  FAS_ASSERT(adiState != NULL_PTR);
405 
407  /**
408  * SM_VCELL_RED: Cell Voltage Measurement Redundancy
409  * Set RD bit to enable redundant cell voltage measurements
410  */
414  /* Restart measurement: do not reset IIR filter to keep current filtered values */
417  ADI_TransmitCommand(adi_command, adiState);
419 }
420 
422  FAS_ASSERT(adiState != NULL_PTR);
423 
425  /* Start one single-shot measurement without redundancy, after the measurements are stopped */
431  ADI_TransmitCommand(adi_command, adiState);
433 }
434 
435 /*========== Externalized Static Function Implementations (Unit Test) =======*/
436 #ifdef UNITY_UNIT_TEST
437 
438 extern void TEST_ADI_CopyCommandBytesCellVoltageRegister(
439  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
440  ADI_CopyCommandBytesCellVoltageRegister(commandBytesToReadVoltageRegisters);
441 }
442 
443 extern void TEST_ADI_CopyCommandBytesAverageCellVoltageRegisters(
444  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
445  ADI_CopyCommandBytesAverageCellVoltageRegisters(commandBytesToReadVoltageRegisters);
446 }
447 
448 extern void TEST_ADI_CopyCommandBytesFilteredCellVoltageRegisters(
449  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
450  ADI_CopyCommandBytesFilteredCellVoltageRegisters(commandBytesToReadVoltageRegisters);
451 }
452 
453 extern void TEST_ADI_CopyCommandBytesRedundantCellVoltageRegisters(
454  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters) {
455  ADI_CopyCommandBytesRedundantCellVoltageRegisters(commandBytesToReadVoltageRegisters);
456 }
457 
458 extern void TEST_ADI_ReadAndStoreVoltages(
459  ADI_STATE_s *adiState,
460  ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters,
461  ADI_VOLTAGE_STORE_LOCATION_e storeLocation) {
462  ADI_ReadAndStoreVoltages(adiState, commandBytesToReadVoltageRegisters, storeLocation);
463 }
464 
465 extern void TEST_ADI_SaveRxToCellVoltageBuffer(
466  ADI_STATE_s *adiState,
467  uint8_t *data,
468  uint8_t registerSet,
469  ADI_VOLTAGE_STORE_LOCATION_e storeLocation) {
470  ADI_SaveRxToCellVoltageBuffer(adiState, data, registerSet, storeLocation);
471 }
472 #endif
const uint8_t adi_voltageInputsUsed[ADI_MAX_SUPPORTED_CELLS]
#define ADI_MAX_SUPPORTED_CELLS
uint16_t adi_command[ADI_COMMAND_DEFINITION_LENGTH]
uint8_t adi_dataReceive[BS_NR_OF_MODULES_PER_STRING *ADI_MAX_REGISTER_SIZE_IN_BYTES]
Header for the buffers used by the driver for the ADI analog front-end.
Header for the configuration for the ADI analog front-end.
const uint16_t adi_cmdAdcv[ADI_COMMAND_DEFINITION_LENGTH]
Header file of some software.
const uint16_t adi_cmdRdcva[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdsva[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdsvb[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdsvf[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdacf[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdcvd[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdsvd[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdfcb[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdsve[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdfce[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdfcf[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdfcd[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdacc[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdaca[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdcvb[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdace[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdfcc[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdfca[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdsvc[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdcvf[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdacd[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdacb[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdcve[ADI_COMMAND_DEFINITION_LENGTH]
const uint16_t adi_cmdRdcvc[ADI_COMMAND_DEFINITION_LENGTH]
Header file of some software.
#define ADI_MEASUREMENT_RESTART_WAIT_TIME_ms
#define ADI_RESULT_REGISTER_SET_A
ADI_VOLTAGE_REGISTER_TYPE_e
@ ADI_CELL_VOLTAGE_REGISTER
@ ADI_FILTERED_CELL_VOLTAGE_REGISTER
@ ADI_AVERAGE_CELL_VOLTAGE_REGISTER
@ ADI_REDUNDANT_CELL_VOLTAGE_REGISTER
#define ADI_BYTE_SHIFT
#define ADI_VOLTAGE_CONVERSION_FACTOR
#define ADI_ADCV_RSTF_POS
#define ADI_ADCV_RSTF_LEN
#define ADI_RAW_VOLTAGE_SIZE_IN_BYTES
#define ADI_RESULT_REGISTER_SET_C
#define ADI_VOLTAGE_CONVERSION_UNIT
#define ADI_ADCV_RD_LEN
#define ADI_N_ADI
#define ADI_MAX_NUMBER_OF_VOLTAGES_IN_REGISTER
#define ADI_RESULT_REGISTER_SET_D
#define ADI_VOLTAGE_06_08_OFFSET
#define ADI_ADCV_OW01_POS
#define ADI_VOLTAGE_15_18_OFFSET
#define ADI_MEASUREMENT_STOP_WAIT_TIME_ms
#define ADI_ADCV_RD_POS
#define ADI_MAX_REGISTER_SIZE_IN_BYTES
#define ADI_VOLTAGE_00_02_OFFSET
#define ADI_RESULT_REGISTER_SET_E
#define ADI_ADCV_DCP_LEN
#define ADI_REGISTER_CLEARED_VALUE
#define ADI_VOLTAGE_CONVERSION_OFFSET
#define ADI_VOLTAGE_12_14_OFFSET
#define ADI_VOLTAGE_03_05_OFFSET
#define ADI_ADCV_CONT_POS
#define ADI_ADCV_CONT_LEN
#define ADI_ADCV_OW01_LEN
ADI_VOLTAGE_STORE_LOCATION_e
@ ADI_AVERAGE_CELL_VOLTAGE
@ ADI_REDUNDANT_CELL_VOLTAGE
@ ADI_FILTERED_CELL_VOLTAGE
@ ADI_CELL_VOLTAGE_AVERAGE_OPEN_WIRE
@ ADI_VOLTAGE_STORE_LOCATION_E_MAX
@ ADI_CELL_VOLTAGE_OPEN_WIRE_ODD
@ ADI_CELL_VOLTAGE
@ ADI_CELL_VOLTAGE_OPEN_WIRE_EVEN
@ ADI_CELL_VOLTAGE_REDUNDANT_OPEN_WIRE
#define ADI_VOLTAGE_09_11_OFFSET
#define ADI_ADCV_DCP_POS
#define ADI_RESULT_REGISTER_SET_B
#define ADI_RESULT_REGISTER_SET_F
Headers for the diagnostic driver for the ADI analog front-end.
bool ADI_EvaluateDiagnosticCellVoltages(ADI_STATE_s *adiState, uint16_t moduleNumber)
Evaluate diagnostic for cell voltage measurement.
void ADI_WriteCommandConfigurationBits(uint16_t *configuredCommand, uint8_t position, uint8_t length, uint16_t configuration)
write configuration bits in commands (e.g., channel in ADAX command).
void ADI_ReadRegister(uint16_t *registerToRead, uint8_t *data, ADI_STATE_s *adiState)
send command to the ades183x daisy-chain to read a register.
void ADI_TransmitCommand(uint16_t *command, ADI_STATE_s *adiState)
send command to the ades183x daisy-chain (e.g., start voltage measurement).
void ADI_Wait(uint32_t waitTime)
wait for a certain number of milliseconds
void ADI_CopyCommandBits(const uint16_t *sourceCommand, uint16_t *destinationCommand)
copy command bits in variables.
Headers for the diagnostic driver for the ADI analog front-end.
void ADI_StopContinuousCellVoltageMeasurements(ADI_STATE_s *adiState)
Stop cell voltage measurement.
static void ADI_CopyCommandBytesAverageCellVoltageRegisters(ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters)
Copies the related command bytes to read the average voltage registers.
static void ADI_ReadAndStoreVoltages(ADI_STATE_s *adiState, ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters, ADI_VOLTAGE_STORE_LOCATION_e storeLocation)
Copies the related command bytes to read the average voltage registers.
static void ADI_CopyCommandBytesRedundantCellVoltageRegisters(ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters)
Copies the related command bytes to read the redundant voltage registers.
void ADI_GetVoltages(ADI_STATE_s *adiState, ADI_VOLTAGE_REGISTER_TYPE_e registerType, ADI_VOLTAGE_STORE_LOCATION_e storeLocation)
Reads and stores cell voltages.
uint16_t ADI_GetStoredVoltageIndex(uint16_t registerVoltageIndex)
Converts index of read voltages.
void ADI_RestartContinuousCellVoltageMeasurements(ADI_STATE_s *adiState)
Restart cell voltage measurement.
static void ADI_CopyCommandBytesCellVoltageRegister(ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters)
Copies the related command bytes to read the voltage registers.
static void ADI_CopyCommandBytesFilteredCellVoltageRegisters(ADI_COMMAND_READ_REGISTERS_s *commandBytesToReadVoltageRegisters)
Copies the related command bytes to read the filtered voltage registers.
static void ADI_SaveRxToCellVoltageBuffer(ADI_STATE_s *adiState, uint8_t *data, uint8_t registerSet, ADI_VOLTAGE_STORE_LOCATION_e storeLocation)
Saves the cell voltage values read from the daisy-chain.
Header file of some software.
#define BS_NR_OF_CELL_BLOCKS_PER_MODULE
number of cells per module
Assert macro implementation.
#define FAS_ASSERT(x)
Assertion macro that asserts that x is true.
Definition: fassert.h:255
#define FAS_TRAP
Define that evaluates to essential boolean false thus tripping an assert.
Definition: fassert.h:129
#define NULL_PTR
Null pointer.
Definition: fstd_types.h:77
uint16_t registerA[ADI_COMMAND_DEFINITION_LENGTH]
uint16_t registerF[ADI_COMMAND_DEFINITION_LENGTH]
uint16_t registerB[ADI_COMMAND_DEFINITION_LENGTH]
uint16_t registerD[ADI_COMMAND_DEFINITION_LENGTH]
uint16_t registerC[ADI_COMMAND_DEFINITION_LENGTH]
uint16_t registerE[ADI_COMMAND_DEFINITION_LENGTH]
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageRedundant
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageFiltered
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltage
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageAverageOpenWire
ADI_ERROR_TABLE_s * errorTable
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageOpenWireEven
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageAverage
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageRedundantOpenWire
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageOpenWireOdd
bool voltageRegisterContentIsNotStuck[BS_NR_OF_STRINGS][ADI_N_ADI]
int16_t cellVoltage_mV[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING][BS_NR_OF_CELL_BLOCKS_PER_MODULE]
Definition: database_cfg.h:139
uint64_t invalidCellVoltage[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
Definition: database_cfg.h:142
uint16_t nrValidCellVoltages[BS_NR_OF_STRINGS]
Definition: database_cfg.h:143