foxBMS  1.6.0
The foxBMS Battery Management System API Documentation
adi_ades183x_defs.h
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_defs.h
44  * @author foxBMS Team
45  * @date 2015-09-01 (date of creation)
46  * @updated 2023-10-12 (date of last update)
47  * @version v1.6.0
48  * @ingroup DRIVERS
49  * @prefix ADI
50  *
51  * @brief Headers for the driver for the ades183x analog front-end.
52  *
53  */
54 
55 #ifndef FOXBMS__ADI_ADES183X_DEFS_H_
56 #define FOXBMS__ADI_ADES183X_DEFS_H_
57 
58 /*========== Includes =======================================================*/
59 #if defined(FOXBMS_AFE_DRIVER_ADI_ADES1830)
60 #include "adi_ades1830_defs.h"
61 #endif
62 
63 #include "battery_system_cfg.h"
64 
65 #include "database.h"
66 #include "spi.h"
67 
68 #include <stdint.h>
69 
70 /*========== Macros and Definitions =========================================*/
71 
72 /** used to determine if a PEC fault should be injected in the register write function */
73 typedef enum {
78 
79 /** used to determine which voltage register has to be read */
80 typedef enum {
87 
88 /** used to determine where read voltages have to be stored */
89 typedef enum {
100 
101 /** used to determine which voltage register has to be read */
102 typedef enum {
107 
108 /** used to determine where read voltages have to be stored */
109 typedef enum {
115 
116 /* configuration sanitation */
117 #if BS_NR_OF_CELL_BLOCKS_PER_MODULE > ADI_MAX_SUPPORTED_CELLS
118 #error "Number of cell blocks per module cannot be higher than maximum number of cells per module"
119 #endif
120 #if BS_NR_OF_GPIOS_PER_MODULE != ADI_TOTAL_GPIO_NUMBER
121 #error "Number of GPIOs must be 10"
122 #endif
123 #if BS_NR_OF_TEMP_SENSORS_PER_MODULE > BS_NR_OF_GPIOS_PER_MODULE
124 #error "Number of temperature sensors cannot be higher than number of GPIOs"
125 #endif
126 
127 /**
128  * Default configuration
129  * @{
130  */
131 #define ADI_DEFAULT_CTH_COMPARISON_THRESHOLD (ADI_COMPARISON_THRESHOLD_9_1_mV)
132 #define ADI_DEFAULT_REFON_SETUP (1u)
133 #define ADI_DEFAULT_FLAG_D_SETUP (ADI_FLAG_D_DEFAULT)
134 #define ADI_DEFAULT_OWA_SETUP (0u)
135 #define ADI_DEFAULT_OWRNG_SETUP (0u)
136 #define ADI_DEFAULT_SOAKON_SETUP (0u)
137 #define ADI_DEFAULT_GPO_1_8_SETUP (0xFFu)
138 #define ADI_DEFAULT_GPO_9_10_SETUP (0x03u)
139 #define ADI_DEFAULT_IIR_SETUP (ADI_IIR_FILTER_PARAMETER_32)
140 #define ADI_DEFAULT_COMM_BK_SETUP (0u)
141 #define ADI_DEFAULT_MUTE_ST_SETUP (0u)
142 #define ADI_DEFAULT_SNAP_ST_SETUP (0u)
143 #define ADI_DEFAULT_VUV_0_7_SETUP (0u)
144 #define ADI_DEFAULT_VUV_8_11_SETUP (0x8u)
145 #define ADI_DEFAULT_VOV_0_3_SETUP (0xFu)
146 #define ADI_DEFAULT_VOV_4_11_SETUP (0x7Fu)
147 #define ADI_DEFAULT_DCT0_0_5_SETUP (0u)
148 #define ADI_DEFAULT_DTRNG_SETUP (0u)
149 #define ADI_DEFAULT_DTMEN_SETUP (0u)
150 #define ADI_DEFAULT_DCC_1_8_SETUP (0u)
151 #define ADI_DEFAULT_DCC_9_16_SETUP (0u)
152 /**@}*/
153 
154 /* First wait this time after issuing ADAX command for all channels */
155 #define ADI_WAIT_TIME_1_FOR_ADAX_FULL_CYCLE (10u)
156 /* Retrieve voltages, then wait this time, all channels will have been measured */
157 #define ADI_WAIT_TIME_2_FOR_ADAX_FULL_CYCLE (8u)
158 
159 /* When OW check activated for cell N, cell N voltage must be reduced compared to the
160  value without check activated. This value for the reduction arises from the voltage
161  divider formed by the 470 Ohm resistor activated for the check between cell N and
162  cell N-1 and the input RC filter resistances. */
163 #define ADI_NO_OW_CELL_VOLTAGE_REDUCTION (9.0f / 10.0f)
164 /* Margin for the check of the voltage reduction */
165 #define ADI_OW_CELL_VOLTAGE_REDUCTION_MARGIN_mV (1000.0f)
166 /* Margin for the check of the voltage reduction during OW latent fault check */
167 #define ADI_OW_LATENT_CHECK_MARGIN (0.95f)
168 
169 /* Mask to select even cells, AFE starts counting from 1 */
170 #define ADI_ODD_CELLS_MASK (0x5555u)
171 /* Mask to select odd cells, AFE starts counting from 1 */
172 #define ADI_EVEN_CELLS_MASK (0xAAAAu)
173 
174 /* TODO: check reduction */
175 /* When OW check activated for GPIO, GPIO voltage must be reduced compared to the
176  value without check activated. This value for the reduction arises from the voltage
177  divider formed by the pull-up resistor activated for the check and the input RC
178  filter resistances. */
179 #define ADI_NO_OW_GPIO_VOLTAGE_REDUCTION (10.0f / 12.0f)
180 /* Margin for the check of the voltage reduction */
181 #define ADI_OW_GPIO_VOLTAGE_REDUCTION_MARGIN_mV (1000.0f)
182 
183 /* Number of DCC bits in one byte of configuration register group B*/
184 #define ADI_CFGRB_NUMBER_OF_DCC_BITS_PER_BYTE (8u)
185 
186 /* IC maximum wake-up time */
187 #define ADI_T_WAKE_us (500u)
188 /* IC maximum ready time */
189 #define ADI_T_READY_us (10u)
190 /* T_wake is max 500 us, wait time set for ADI_N_ADI ICs */
191 #define ADI_DAISY_CHAIN_WAKE_UP_TIME_us (ADI_N_ADI * ADI_T_WAKE_us)
192 /* T_ready is max 10 us, wait time set for ADI_N_ADI ICs */
193 #define ADI_DAISY_CHAIN_READY_TIME_us (ADI_N_ADI * ADI_T_READY_us)
194 /* Conversion coefficient for us to ms */
195 #define ADI_COEFFICIENT_US_TO_MS (1000u)
196 
197 /** Timeout in milliseconds for interrupt-based SPI transmission. */
198 #define ADI_TRANSMISSION_TIMEOUT (10u)
199 
200 /** isoSPI wakeup time */
201 #define ADI_SPI_WAKEUP_WAIT_TIME_US (100u)
202 
203 /** Number of used ADI ICs */
204 /* Start auxiliary channel number */
205 #define ADI_START_AUX_CHANNEL (1u)
206 
207 /** Number of used ADI ICs */
208 #define ADI_N_ADI (BS_NR_OF_MODULES_PER_STRING)
209 
210 /* Maximum value for cell voltages */
211 #define ADI_MAX_CELL_VOLTAGE_mV (4500)
212 /* Minimum value for cell voltages */
213 #define ADI_MIN_CELL_VOLTAGE_mV (2000)
214 
215 /* Comparison threshold between auxiliary and redundant auxiliary measurements */
216 #define ADI_AUXILIARY_COMPARISON_THRESHOLD_mV (9)
217 /* Minimum value for GPIO voltages (given in SM) */
218 #define ADI_MIN_GPIO_VOLTAGE_mV (100)
219 
220 /* Maximum value for digital supply voltage VD */
221 #define ADI_MAX_VD_mV (3528.0f)
222 /* Minimum value for digital supply voltage VD */
223 #define ADI_MIN_VD_mV (2754.0f)
224 /* Maximum value for analog supply voltage VA */
225 #define ADI_MAX_VA_mV (5486.0f)
226 /* Minimum value for analog supply voltage VA */
227 #define ADI_MIN_VA_mV (4512.0f)
228 /* Maximum value for secondary reference voltage VREF2 */
229 #define ADI_MAX_VREF2_mV (3015.0f)
230 /* Minimum value for secondary reference voltage VREF2 */
231 #define ADI_MIN_VREF2_mV (2985.0f)
232 /* Maximum value for die temperature ITMP */
233 #define ADI_MAX_ITMP_degC (125.0f)
234 /* Minimum value for die temperature ITMP */
235 #define ADI_MIN_ITMP_degC (-40.0f)
236 
237 /* Threshold for diagnostic when oscillator is set to run faster */
238 #define ADI_OSCILLATOR_FASTER_THRESHOLD (70u)
239 /* Threshold for diagnostic when oscillator is set to run slower */
240 #define ADI_OSCILLATOR_SLOWER_THRESHOLD (52u)
241 
242 /**
243  * Values used for PEC latent fault check
244  * @{
245  */
246 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA0_BYTE0 (1u)
247 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA0_BYTE1 (2u)
248 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA0_BYTE2 (3u)
249 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA0_BYTE3 (4u)
250 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA0_BYTE4 (5u)
251 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA0_BYTE5 (6u)
252 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA1_BYTE0 (7u)
253 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA1_BYTE1 (8u)
254 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA1_BYTE2 (9u)
255 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA1_BYTE3 (10u)
256 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA1_BYTE4 (11u)
257 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA1_BYTE5 (12u)
258 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA2_BYTE0 (13u)
259 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA2_BYTE1 (14u)
260 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA2_BYTE2 (15u)
261 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA2_BYTE3 (16u)
262 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA2_BYTE4 (17u)
263 #define ADI_PEC_LATENT_FAULT_CHECK_TESTDATA2_BYTE5 (18u)
264 /**@}*/
265 
266 /**
267  * Values to write in FLAG_D bits in configuration register A
268  * to activate diagnostics
269  * @{
270  */
271 #define ADI_FLAG_D_DEFAULT (0x00u) /* 0b00000000u */
272 #define ADI_FLAG_D_UV_CHECK (0x04u) /* 0b00000100u */
273 #define ADI_FLAG_D_OV_CHECK (0x0Cu) /* 0b00001100u */
274 #define ADI_FLAG_D_OSC_FASTER (0x01u) /* 0b00000001u */
275 #define ADI_FLAG_D_OSC_SLOWER (0x02u) /* 0b00000010u */
276 #define ADI_FLAG_D_FORCE_THSD (0x10u) /* 0b00010000u */
277 #define ADI_FLAG_D_FORCE_TMODCHK (0x80u) /* 0b10000000u */
278 #define ADI_FLAG_D_INDUCE_ECC_ERROR (0x60u) /* 0b01100000u */
279 /**@}*/
280 
281 /**
282  * Maximum queue timeout time in milliseconds
283  */
284 #define ADI_QUEUE_TIMEOUT_MS ((TickType_t)0u)
285 
286 /**
287  * voltage conversion coefficients
288  * @{
289  */
290 #define ADI_VOLTAGE_CONVERSION_FACTOR (150e-6f)
291 #define ADI_VOLTAGE_CONVERSION_UNIT (1000.0f)
292 #define ADI_VOLTAGE_CONVERSION_OFFSET (1500.0f)
293 /**@}*/
294 
295 /**
296  * die temperature conversion coefficients
297  * @{
298  */
299 #define ADI_DIE_TEMPERATURE_VOLTAGE_OFFSET (1.5f)
300 #define ADI_DIE_TEMPERATURE_KELVIN_OFFSET (273.0f)
301 #define ADI_DIE_TEMPERATURE_SCALING_FACTOR (7.5f)
302 /**@}*/
303 
304 /* Define to shift a full byte*/
305 #define ADI_BYTE_SHIFT (8u)
306 /* Define to select complete PEC10 without command counter */
307 #define ADI_PEC10_FULL_EXCLUDE_COMMAND_COUNTER (0x3Fu)
308 /* Define to select PEC10 bit8 and bit9 without command counter */
309 #define ADI_PEC10_MSB_EXCLUDE_COMMAND_COUNTER (0x3u)
310 /* Mask to select one byte */
311 #define ADI_ONE_BYTE_MASK (0xFFu)
312 /* Maximum size of a register */
313 #define ADI_MAX_REGISTER_SIZE_IN_BYTES (6u)
314 /* Size of command plus associated PEC in bytes */
315 #define ADI_COMMAND_AND_PEC_SIZE_IN_BYTES (4u)
316 /* Size of command in bytes */
317 #define ADI_COMMAND_SIZE_IN_BYTES (2u)
318 /* Size of PEC in bytes */
319 #define ADI_PEC_SIZE_IN_BYTES (2u)
320 /* Maximum position of a bit in a bytes */
321 #define ADI_MAX_BIT_POSITION_IN_BYTE (7u)
322 /* Size of a raw voltage measurement in bytes*/
323 #define ADI_RAW_VOLTAGE_SIZE_IN_BYTES (2u)
324 /* Maximum number of voltages per register */
325 #define ADI_MAX_NUMBER_OF_VOLTAGES_IN_REGISTER (3u)
326 /* Maximum number of GPIO voltages per register */
327 #define ADI_MAX_NUMBER_OF_GPIO_VOLTAGES_IN_REGISTER (3u)
328 /* Number of GPIO voltages in AUX register D */
329 #define ADI_NUMBER_OF_GPIO_VOLTAGES_IN_REGISTER_D (1u)
330 /* Number of bytes used to compute PEC */
331 #define ADI_SIZE_OF_DATA_FOR_PEC_COMPUTATION (6u)
332 /* Number of bytes used to compute PEC */
333 #define ADI_SIZE_OF_DATA_FOR_PEC_COMPUTATION_WITH_COUNTER (7u)
334 
335 /**
336  * Number of Bytes to be transmitted in daisy-chain
337  * For first 4 Bytes:
338  * - 2 Bytes: command
339  * - 2 Bytes: CRC
340  * Following Bytes: Data
341  * - 6 Bytes data per IC
342  * - 2 Bytes CRC per IC
343  */
344 #define ADI_N_BYTES_FOR_DATA_TRANSMISSION \
345  (ADI_COMMAND_AND_PEC_SIZE_IN_BYTES + ((ADI_MAX_REGISTER_SIZE_IN_BYTES + ADI_PEC_SIZE_IN_BYTES) * ADI_N_ADI))
346 
347 /**
348  * Offset to select voltages of specific voltage register
349  * in a table containing all voltages in a linear fashion
350  * @{
351  */
352 #define ADI_VOLTAGE_00_02_OFFSET (0u)
353 #define ADI_VOLTAGE_03_05_OFFSET (3u)
354 #define ADI_VOLTAGE_06_08_OFFSET (6u)
355 #define ADI_VOLTAGE_09_11_OFFSET (9u)
356 #define ADI_VOLTAGE_12_14_OFFSET (12u)
357 #define ADI_VOLTAGE_15_18_OFFSET (15u)
358 /**@}*/
359 
360 /**
361  * position of command bytes and PEC bytes in frame
362  * @{
363  */
364 #define ADI_COMMAND_FIRST_BYTE_POSITION (0u)
365 #define ADI_COMMAND_SECOND_BYTE_POSITION (1u)
366 #define ADI_COMMAND_PEC_FIRST_BYTE_POSITION (2u)
367 #define ADI_COMMAND_PEC_SECOND_BYTE_POSITION (3u)
368 /**@}*/
369 
370 /**
371  * position of PEC bytes in data frame
372  * @{
373  */
374 #define ADI_DATA_PEC_FIRST_BYTE_POSITION (0u)
375 #define ADI_DATA_PEC_SECOND_BYTE_POSITION (1u)
376 /**@}*/
377 
378 /**
379  * COMM definitions
380  * @{
381  */
382 #define ADI_ICOM_START (0x60u)
383 #define ADI_ICOM_STOP (0x10u)
384 #define ADI_ICOM_BLANK (0x00u)
385 #define ADI_ICOM_NO_TRANSMIT (0x70u)
386 #define ADI_FCOM_MASTER_ACK (0x00u)
387 #define ADI_FCOM_MASTER_NACK (0x08u)
388 #define ADI_FCOM_MASTER_NACK_STOP (0x09u)
389 /**@}*/
390 
391 /* RequirementId: D7.1 V0R4 SIF-4.30.03.01 */
392 /** error table for the driver */
393 typedef struct {
394  bool spiIsOk[BS_NR_OF_STRINGS];
395  /* RequirementId: D7.1 V0R4 SIF-4.10.02.02 */
396  /* RequirementId: D7.1 V0R4 SIF-4.20.03.01 */
397  bool crcIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
398  bool commandCounterIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
399  /* RequirementId: D7.1 V0R4 SIF-4.20.02.01 */
400  bool configurationAIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
401  bool configurationBIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
402  /* RequirementId: D7.1 V0R4 SIF-4.40.01.03 */
403  bool voltageRegisterContentIsNotStuck[BS_NR_OF_STRINGS][ADI_N_ADI];
404  /* RequirementId: D7.1 V0R4 SIF-4.40.02.03 */
405  bool auxiliaryRegisterContentIsNotStuck[BS_NR_OF_STRINGS][ADI_N_ADI];
406  bool adcComparisonIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
407  bool compFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
408  bool spiFltFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
409  bool filteredVoltageRangeIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
410  bool evenWireIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
411  bool oddWireIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
412  bool evenWireHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
413  bool oddWireHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
414  bool adcCompFlagsHaveNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
415  bool auxComparisonIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
416  bool auxVoltageRangeIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
417  bool analogSupplyOvervoltageFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
418  bool analogSupplyUndervoltageFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
419  bool digitalSupplyOvervoltageFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
420  bool digitalSupplyUndervoltageFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
421  bool vdeFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
422  bool oscchkFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
423  bool analogSupplyOvervoltageFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
424  bool analogSupplyUndervoltageFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
425  bool digitalSupplyOvervoltageFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
426  bool digitalSupplyUndervoltageFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
427  bool vdeFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
428  bool vdelFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
429  bool analogSupplyRangeIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
430  bool digitalSupplyRangeIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
431  bool vresRangeIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
432  bool dieTemperatureIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
433  bool oscchkFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
434  bool ocCounterFasterFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
435  bool ocCounterSlowerFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
436  bool ocCounterNormalFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
437  bool thsdFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
438  bool tmodchkFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
439  bool tmodchkFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
440  bool cmedFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
441  bool smedFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
442  bool sleepFlagIsCleared[BS_NR_OF_STRINGS][ADI_N_ADI];
443  bool cmedFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
444  bool smedFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
445  bool initResetAuxValuesAreOk[BS_NR_OF_STRINGS][ADI_N_ADI];
446  bool initClearedAuxValuesAreOk[BS_NR_OF_STRINGS][ADI_N_ADI];
447  bool pecCheckHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
448  bool compareLogicFaultFlagHasNoLatentFault[BS_NR_OF_STRINGS][ADI_N_ADI];
449  /* RequirementId: D7.1 V0R4 SIF-4.40.01.03 */
450  bool noClockFreezeDetectorIsOk[BS_NR_OF_STRINGS][ADI_N_ADI];
452 
453 /** Define used to access bytes in answer frames */
454 #define ADI_FIRST_DATA_BYTE_POSITION_IN_TRANSMISSION_FRAME (4u)
455 
456 /** Defines to access voltage register set */
457 /**@{*/
458 #define ADI_RESULT_REGISTER_SET_A (0u)
459 #define ADI_RESULT_REGISTER_SET_B (1u)
460 #define ADI_RESULT_REGISTER_SET_C (2u)
461 #define ADI_RESULT_REGISTER_SET_D (3u)
462 #define ADI_RESULT_REGISTER_SET_E (4u)
463 #define ADI_RESULT_REGISTER_SET_F (5u)
464 /**@}*/
465 
466 /** Generic defines to access the bytes of a register set */
467 /**@{*/
468 #define ADI_REGISTER_OFFSET0 (0u)
469 #define ADI_REGISTER_OFFSET1 (1u)
470 #define ADI_REGISTER_OFFSET2 (2u)
471 #define ADI_REGISTER_OFFSET3 (3u)
472 #define ADI_REGISTER_OFFSET4 (4u)
473 #define ADI_REGISTER_OFFSET5 (5u)
474 /**@}*/
475 
476 /* 16 bit-values in registers are often stored as two bytes, so the higher byte
477  must be shifted by 8 bits to reconstruct the value */
478 #define ADI_DATA_BUFFER_OFFSET_IN_BITS (8u)
479 
480 /** Defines for to access auxiliary register set */
481 /**@{*/
482 #define ADI_AUXILIARY_RESULT_REGISTER_SET_A (0u)
483 #define ADI_AUXILIARY_RESULT_REGISTER_SET_B (1u)
484 #define ADI_AUXILIARY_RESULT_REGISTER_SET_C (2u)
485 #define ADI_AUXILIARY_RESULT_REGISTER_SET_D (3u)
486 #define ADI_AUXILIARY_RESULT_REGISTER_SET_E (4u)
487 /**@}*/
488 
489 /** Mask to select command counter value in received data */
490 #define ADI_COMMAND_COUNTER_MASK (0xFCu)
491 /** Position of command counter in answer byte */
492 #define ADI_COMMAND_COUNTER_POSITION (2u)
493 
494 /** Command counter loops back to start value when incremented further after having reached this value */
495 #define ADI_COMMAND_COUNTER_MAX_VALUE (63u)
496 /** Command counter loops back to this value when incremented further after having reached max value */
497 #define ADI_COMMAND_COUNTER_RESTART_VALUE (1u)
498 /** Command counter loops set to this value after power cycling, transition to sleep or with RSTCC command */
499 #define ADI_COMMAND_COUNTER_RESET_VALUE (0u)
500 
501 /** In command definitions, first byte value put at first position */
502 #define ADI_COMMAND_BYTE0_POSITION (0u)
503 /** In command definitions, second byte value put at second position */
504 #define ADI_COMMAND_BYTE1_POSITION (1u)
505 /** In command definitions, INC value put at third position */
506 #define ADI_COMMAND_INC_POSITION (2u)
507 /** In definition of command, position of the length of the data */
508 #define ADI_COMMAND_DATA_LENGTH_POSITION (3u)
509 
510 /* C-ADC vs S-ADC comparison voltage threshold */
511 #define ADI_COMPARISON_THRESHOLD_5_1_mV (0x00u) /* 0b000u */
512 #define ADI_COMPARISON_THRESHOLD_8_1_mV (0x01u) /* 0b001u */
513 #define ADI_COMPARISON_THRESHOLD_9_1_mV (0x02u) /* 0b010u */
514 #define ADI_COMPARISON_THRESHOLD_10_05_mV (0x03u) /* 0b011u */
515 #define ADI_COMPARISON_THRESHOLD_15_mV (0x04u) /* 0b100u */
516 #define ADI_COMPARISON_THRESHOLD_19_95_mV (0x05u) /* 0b101u */
517 #define ADI_COMPARISON_THRESHOLD_25_05_mV (0x06u) /* 0b110u */
518 #define ADI_COMPARISON_THRESHOLD_45_05_mV (0x07u) /* 0b111u */
519 
520 /* IIR filter setting */
521 #define ADI_IIR_FILTER_DISABLED (0x00u) /* 0b000u */
522 #define ADI_IIR_FILTER_PARAMETER_2 (0x01u) /* 0b001u */
523 #define ADI_IIR_FILTER_PARAMETER_4 (0x02u) /* 0b010u */
524 #define ADI_IIR_FILTER_PARAMETER_8 (0x03u) /* 0b011u */
525 #define ADI_IIR_FILTER_PARAMETER_16 (0x04u) /* 0b100u */
526 #define ADI_IIR_FILTER_PARAMETER_32 (0x05u) /* 0b101u */
527 #define ADI_IIR_FILTER_PARAMETER_128 (0x06u) /* 0b110u */
528 #define ADI_IIR_FILTER_PARAMETER_256 (0x07u) /* 0b111u */
529 
530 /** Time to wait for the IIR filter to settle after it was reset and preloaded with samples */
531 #define ADI_IIR_SETTLING_TIME_ms (5u)
532 
533 /** Time to wait after restarting measurements */
534 #define ADI_MEASUREMENT_RESTART_WAIT_TIME_ms (1u)
535 
536 /** Time to wait after stopping measurements */
537 #define ADI_MEASUREMENT_STOP_WAIT_TIME_ms (1u)
538 
539 /** Time to balance after having stopped measurement and before restarting them */
540 #define ADI_BALANCING_TIME_ms (20u)
541 
542 /* Time in ms needed for a redundant ADC measurement */
543 #define ADI_REDUNDANT_ADC_MEASUREMENT_TIME_ms (8u)
544 
545 /* Time in ms needed for a redundant ADC measurement in OW latent fault check */
546 #define ADI_OW_LATENT_FAULT_MEASUREMENT_TIME_ms (16u)
547 
548 /* Commands are made out of 11 bits according to data sheet */
549 #define ADI_COMMAND_CODE_LENGTH (11u)
550 
551 /* Each command is defined through 4 bytes: 2 command bytes, 1 command counter byte, 1 length byte */
552 #define ADI_COMMAND_DEFINITION_LENGTH (4u)
553 
554 /* Value used as initialization when creating a mask to set configuration bits in commands */
555 #define ADI_COMMAND_MASK_SEED (0xFFFFu)
556 
557 /* Value used as initialization when creating a mask to set bits in data written to the AFEs */
558 #define ADI_DATA_MASK_SEED (0xFFFFu)
559 
560 /* Reset value of registers */
561 #define ADI_REGISTER_POR_VALUE (0x7FFFu)
562 
563 /* Value of registers after a clear command was issued */
564 #define ADI_REGISTER_CLEARED_VALUE (0x8000u)
565 
566 /* Time to wait for reference to be on, max 4.5ms */
567 #define ADI_TREFUP_ms (5u)
568 
569 /* Time to wait after soft reset */
570 #define ADI_TSOFTRESET_ms (50u)
571 
572 /**
573  * ades183x command definitions
574  * @{
575  */
576 /** Start cell voltage conversion */
577 #define ADI_ADCV_BYTE0 (0x02u) /* Table 52 - */
578 #define ADI_ADCV_BYTE1 (0x60u)
579 #define ADI_ADCV_INC (1u)
580 #define ADI_ADCV_LEN (0u)
581 /**/
582 #define ADI_ADCV_RD_POS (8u)
583 #define ADI_ADCV_RD_LEN (1u)
584 #define ADI_ADCV_CONT_POS (7u)
585 #define ADI_ADCV_CONT_LEN (1u)
586 #define ADI_ADCV_DCP_POS (4u)
587 #define ADI_ADCV_DCP_LEN (1u)
588 #define ADI_ADCV_RSTF_POS (2u)
589 #define ADI_ADCV_RSTF_LEN (1u)
590 #define ADI_ADCV_OW01_POS (0u)
591 #define ADI_ADCV_OW01_LEN (2u)
592 /**/
593 /** Start redundant cell voltage conversion */
594 #define ADI_ADSV_BYTE0 (0x01u)
595 #define ADI_ADSV_BYTE1 (0x68u)
596 #define ADI_ADSV_INC (1u)
597 #define ADI_ADSV_LEN (0u)
598 /**/
599 #define ADI_ADSV_CONT_POS (7u)
600 #define ADI_ADSV_CONT_LEN (1u)
601 #define ADI_ADSV_DCP_POS (4u)
602 #define ADI_ADSV_DCP_LEN (1u)
603 #define ADI_ADSV_OW01_POS (0u)
604 #define ADI_ADSV_OW01_LEN (2u)
605 /** Start GPIO voltage conversion */
606 #define ADI_ADAX_BYTE0 (0x04u)
607 #define ADI_ADAX_BYTE1 (0x10u)
608 #define ADI_ADAX_INC (1u)
609 #define ADI_ADAX_LEN (0u)
610 /**/
611 #define ADI_ADAX_OW_POS (8u)
612 #define ADI_ADAX_OW_LEN (1u)
613 #define ADI_ADAX_PUP_POS (7u)
614 #define ADI_ADAX_PUP_LEN (1u)
615 #define ADI_ADAX_CH4_POS (6u)
616 #define ADI_ADAX_CH4_LEN (1u)
617 #define ADI_ADAX_CH03_POS (0u)
618 #define ADI_ADAX_CH03_LEN (4u)
619 /** Start redundant GPIO voltage conversion */
620 #define ADI_ADAX2_BYTE0 (0x04u)
621 #define ADI_ADAX2_BYTE1 (0x00u)
622 #define ADI_ADAX2_INC (1u)
623 #define ADI_ADAX2_LEN (0u)
624 /**/
625 #define ADI_ADAX2_CH03_POS (0u)
626 #define ADI_ADAX2_CH03_LEN (4u)
627 /** Write configuration registers */
628 #define ADI_WRCFGA_BYTE0 (0x00u)
629 #define ADI_WRCFGA_BYTE1 (0x01u)
630 #define ADI_WRCFGA_INC (1u)
631 #define ADI_WRCFGA_LEN (6u)
632 /**/
633 #define ADI_WRCFGB_BYTE0 (0x00u)
634 #define ADI_WRCFGB_BYTE1 (0x24u)
635 #define ADI_WRCFGB_INC (1u)
636 #define ADI_WRCFGB_LEN (6u)
637 /** Read configuration registers */
638 #define ADI_RDCFGA_BYTE0 (0x00u)
639 #define ADI_RDCFGA_BYTE1 (0x02u)
640 #define ADI_RDCFGA_INC (0u)
641 #define ADI_RDCFGA_LEN (6u)
642 /**/
643 #define ADI_RDCFGB_BYTE0 (0x00u)
644 #define ADI_RDCFGB_BYTE1 (0x26u)
645 #define ADI_RDCFGB_INC (0u)
646 #define ADI_RDCFGB_LEN (6u)
647 /** Read cell voltage registers */
648 #define ADI_RDCVA_BYTE0 (0x00u)
649 #define ADI_RDCVA_BYTE1 (0x04u)
650 #define ADI_RDCVA_INC (0u)
651 #define ADI_RDCVA_LEN (6u)
652 /**/
653 #define ADI_RDCVB_BYTE0 (0x00u)
654 #define ADI_RDCVB_BYTE1 (0x06u)
655 #define ADI_RDCVB_INC (0u)
656 #define ADI_RDCVB_LEN (6u)
657 /**/
658 #define ADI_RDCVC_BYTE0 (0x00u)
659 #define ADI_RDCVC_BYTE1 (0x08u)
660 #define ADI_RDCVC_INC (0u)
661 #define ADI_RDCVC_LEN (6u)
662 /**/
663 #define ADI_RDCVD_BYTE0 (0x00u)
664 #define ADI_RDCVD_BYTE1 (0x0Au)
665 #define ADI_RDCVD_INC (0u)
666 #define ADI_RDCVD_LEN (6u)
667 /**/
668 #define ADI_RDCVE_BYTE0 (0x00u)
669 #define ADI_RDCVE_BYTE1 (0x09u)
670 #define ADI_RDCVE_INC (0u)
671 #define ADI_RDCVE_LEN (6u)
672 /**/
673 #define ADI_RDCVF_BYTE0 (0x00u)
674 #define ADI_RDCVF_BYTE1 (0x0Bu)
675 #define ADI_RDCVF_INC (0u)
676 #define ADI_RDCVF_LEN (6u)
677 /** Read averaged voltage registers */
678 #define ADI_RDACA_BYTE0 (0x00u)
679 #define ADI_RDACA_BYTE1 (0x44u)
680 #define ADI_RDACA_INC (0u)
681 #define ADI_RDACA_LEN (6u)
682 /**/
683 #define ADI_RDACB_BYTE0 (0x00u)
684 #define ADI_RDACB_BYTE1 (0x46u)
685 #define ADI_RDACB_INC (0u)
686 #define ADI_RDACB_LEN (6u)
687 /**/
688 #define ADI_RDACC_BYTE0 (0x00u)
689 #define ADI_RDACC_BYTE1 (0x48u)
690 #define ADI_RDACC_INC (0u)
691 #define ADI_RDACC_LEN (6u)
692 /**/
693 #define ADI_RDACD_BYTE0 (0x00u)
694 #define ADI_RDACD_BYTE1 (0x4Au)
695 #define ADI_RDACD_INC (0u)
696 #define ADI_RDACD_LEN (6u)
697 /**/
698 #define ADI_RDACE_BYTE0 (0x00u)
699 #define ADI_RDACE_BYTE1 (0x49u)
700 #define ADI_RDACE_INC (0u)
701 #define ADI_RDACE_LEN (6u)
702 /**/
703 #define ADI_RDACF_BYTE0 (0x00u)
704 #define ADI_RDACF_BYTE1 (0x4Bu)
705 #define ADI_RDACF_INC (0u)
706 #define ADI_RDACF_LEN (6u)
707 /** Read filtered voltage registers */
708 #define ADI_RDFCA_BYTE0 (0x00u)
709 #define ADI_RDFCA_BYTE1 (0x12u)
710 #define ADI_RDFCA_INC (0u)
711 #define ADI_RDFCA_LEN (6u)
712 /**/
713 #define ADI_RDFCB_BYTE0 (0x00u)
714 #define ADI_RDFCB_BYTE1 (0x13u)
715 #define ADI_RDFCB_INC (0u)
716 #define ADI_RDFCB_LEN (6u)
717 /**/
718 #define ADI_RDFCC_BYTE0 (0x00u)
719 #define ADI_RDFCC_BYTE1 (0x14u)
720 #define ADI_RDFCC_INC (0u)
721 #define ADI_RDFCC_LEN (6u)
722 /**/
723 #define ADI_RDFCD_BYTE0 (0x00u)
724 #define ADI_RDFCD_BYTE1 (0x15u)
725 #define ADI_RDFCD_INC (0u)
726 #define ADI_RDFCD_LEN (6u)
727 /**/
728 #define ADI_RDFCE_BYTE0 (0x00u)
729 #define ADI_RDFCE_BYTE1 (0x16u)
730 #define ADI_RDFCE_INC (0u)
731 #define ADI_RDFCE_LEN (6u)
732 /**/
733 #define ADI_RDFCF_BYTE0 (0x00u)
734 #define ADI_RDFCF_BYTE1 (0x17u)
735 #define ADI_RDFCF_INC (0u)
736 #define ADI_RDFCF_LEN (6u)
737 /** Read redundant voltage registers */
738 #define ADI_RDSVA_BYTE0 (0x00u)
739 #define ADI_RDSVA_BYTE1 (0x03u)
740 #define ADI_RDSVA_INC (0u)
741 #define ADI_RDSVA_LEN (6u)
742 /**/
743 #define ADI_RDSVB_BYTE0 (0x00u)
744 #define ADI_RDSVB_BYTE1 (0x05u)
745 #define ADI_RDSVB_INC (0u)
746 #define ADI_RDSVB_LEN (6u)
747 /**/
748 #define ADI_RDSVC_BYTE0 (0x00u)
749 #define ADI_RDSVC_BYTE1 (0x07u)
750 #define ADI_RDSVC_INC (0u)
751 #define ADI_RDSVC_LEN (6u)
752 /**/
753 #define ADI_RDSVD_BYTE0 (0x00u)
754 #define ADI_RDSVD_BYTE1 (0x0Du)
755 #define ADI_RDSVD_INC (0u)
756 #define ADI_RDSVD_LEN (6u)
757 /**/
758 #define ADI_RDSVE_BYTE0 (0x00u)
759 #define ADI_RDSVE_BYTE1 (0x0Eu)
760 #define ADI_RDSVE_INC (0u)
761 #define ADI_RDSVE_LEN (6u)
762 /**/
763 #define ADI_RDSVF_BYTE0 (0x00u)
764 #define ADI_RDSVF_BYTE1 (0x0Fu)
765 #define ADI_RDSVF_INC (0u)
766 #define ADI_RDSVF_LEN (6u)
767 /** Snapshot commands */
768 #define ADI_SNAPSHOT_BYTE0 (0x00u)
769 #define ADI_SNAPSHOT_BYTE1 (0x2Du)
770 #define ADI_SNAPSHOT_INC (1u)
771 #define ADI_SNAPSHOT_LEN (0u)
772 #define ADI_UNSNAPSHOT_BYTE0 (0x00u)
773 #define ADI_UNSNAPSHOT_BYTE1 (0x2Fu)
774 #define ADI_UNSNAPSHOT_INC (1u)
775 #define ADI_UNSNAPSHOT_LEN (0u)
776 /** Read auxiliary registers */
777 #define ADI_RDAUXA_BYTE0 (0x00u)
778 #define ADI_RDAUXA_BYTE1 (0x19u)
779 #define ADI_RDAUXA_INC (0u)
780 #define ADI_RDAUXA_LEN (6u)
781 /**/
782 #define ADI_RDAUXB_BYTE0 (0x00u)
783 #define ADI_RDAUXB_BYTE1 (0x1Au)
784 #define ADI_RDAUXB_INC (0u)
785 #define ADI_RDAUXB_LEN (6u)
786 /**/
787 #define ADI_RDAUXC_BYTE0 (0x00u)
788 #define ADI_RDAUXC_BYTE1 (0x1Bu)
789 #define ADI_RDAUXC_INC (0u)
790 #define ADI_RDAUXC_LEN (6u)
791 /**/
792 #define ADI_RDAUXD_BYTE0 (0x00u)
793 #define ADI_RDAUXD_BYTE1 (0x1Fu)
794 #define ADI_RDAUXD_INC (0u)
795 #define ADI_RDAUXD_LEN (6u)
796 /**/
797 #define ADI_RDAUXE_BYTE0 (0x00u)
798 #define ADI_RDAUXE_BYTE1 (0x36u)
799 #define ADI_RDAUXE_INC (0u)
800 #define ADI_RDAUXE_LEN (6u)
801 /** Read redundant auxiliary registers */
802 #define ADI_RDRAXA_BYTE0 (0x00u)
803 #define ADI_RDRAXA_BYTE1 (0x1Cu)
804 #define ADI_RDRAXA_INC (0u)
805 #define ADI_RDRAXA_LEN (6u)
806 /**/
807 #define ADI_RDRAXB_BYTE0 (0x00u)
808 #define ADI_RDRAXB_BYTE1 (0x1Du)
809 #define ADI_RDRAXB_INC (0u)
810 #define ADI_RDRAXB_LEN (6u)
811 /**/
812 #define ADI_RDRAXC_BYTE0 (0x00u)
813 #define ADI_RDRAXC_BYTE1 (0x1Eu)
814 #define ADI_RDRAXC_INC (0u)
815 #define ADI_RDRAXC_LEN (6u)
816 /**/
817 #define ADI_RDRAXD_BYTE0 (0x00u)
818 #define ADI_RDRAXD_BYTE1 (0x25u)
819 #define ADI_RDRAXD_INC (0u)
820 #define ADI_RDRAXD_LEN (6u)
821 /** Clear AUX registers */
822 #define ADI_CLRAUX_BYTE0 (0x07u)
823 #define ADI_CLRAUX_BYTE1 (0x12u)
824 #define ADI_CLRAUX_INC (1u)
825 #define ADI_CLRAUX_LEN (0u)
826 /** Write PWM registers */
827 #define ADI_WRPWMA_BYTE0 (0x00u)
828 #define ADI_WRPWMA_BYTE1 (0x20u)
829 #define ADI_WRPWMA_INC (1u)
830 #define ADI_WRPWMA_LEN (6u)
831 #define ADI_WRPWMB_BYTE0 (0x00u)
832 #define ADI_WRPWMB_BYTE1 (0x21u)
833 #define ADI_WRPWMB_INC (1u)
834 #define ADI_WRPWMB_LEN (6u)
835 /** Read PWM registers */
836 #define ADI_RDPWMA_BYTE0 (0x00u)
837 #define ADI_RDPWMA_BYTE1 (0x22u)
838 #define ADI_RDPWMA_INC (0u)
839 #define ADI_RDPWMA_LEN (6u)
840 #define ADI_RDPWMB_BYTE0 (0x00u)
841 #define ADI_RDPWMB_BYTE1 (0x23u)
842 #define ADI_RDPWMB_INC (0u)
843 #define ADI_RDPWMB_LEN (6u)
844 /** Mute discharge */
845 #define ADI_MUTE_BYTE0 (0x00u)
846 #define ADI_MUTE_BYTE1 (0x28u)
847 #define ADI_MUTE_INC (1u)
848 #define ADI_MUTE_LEN (0u)
849 /** Unmute discharge */
850 #define ADI_UNMUTE_BYTE0 (0x00u)
851 #define ADI_UNMUTE_BYTE1 (0x29u)
852 #define ADI_UNMUTE_INC (1u)
853 #define ADI_UNMUTE_LEN (0u)
854 /** Clear command counter */
855 #define ADI_RSTCC_BYTE0 (0x00u)
856 #define ADI_RSTCC_BYTE1 (0x2Eu)
857 #define ADI_RSTCC_INC (0u)
858 #define ADI_RSTCC_LEN (0u)
859 /** Clear cell registers */
860 #define ADI_CLRCELL_BYTE0 (0x07u)
861 #define ADI_CLRCELL_BYTE1 (0x11u)
862 #define ADI_CLRCELL_INC (1u)
863 #define ADI_CLRCELL_LEN (0u)
864 /** Clear flags in Status Register Group C */
865 #define ADI_CLRFLAG_BYTE0 (0x07u)
866 #define ADI_CLRFLAG_BYTE1 (0x17u)
867 #define ADI_CLRFLAG_INC (1u)
868 #define ADI_CLRFLAG_LEN (6u)
869 /**/
870 #define ADI_CLRFLAG_DATA_LENGTH (6u)
871 /** Read status register */
872 #define ADI_RDSTATA_BYTE0 (0x00u)
873 #define ADI_RDSTATA_BYTE1 (0x30u)
874 #define ADI_RDSTATA_INC (0u)
875 #define ADI_RDSTATA_LEN (6u)
876 /**/
877 #define ADI_RDSTATB_BYTE0 (0x00u)
878 #define ADI_RDSTATB_BYTE1 (0x31u)
879 #define ADI_RDSTATB_INC (0u)
880 #define ADI_RDSTATB_LEN (6u)
881 /**/
882 #define ADI_RDSTATC_BYTE0 (0x00u)
883 #define ADI_RDSTATC_BYTE1 (0x32u)
884 #define ADI_RDSTATC_INC (0u)
885 #define ADI_RDSTATC_LEN (6u)
886 /**/
887 #define ADI_RDSTATC_ERR_POS (6u)
888 #define ADI_RDSTATC_ERR_LEN (1u)
889 /**/
890 #define ADI_RDSTATD_BYTE0 (0x00u)
891 #define ADI_RDSTATD_BYTE1 (0x33u)
892 #define ADI_RDSTATD_INC (0u)
893 #define ADI_RDSTATD_LEN (6u)
894 /**/
895 #define ADI_RDSTATE_BYTE0 (0x00u)
896 #define ADI_RDSTATE_BYTE1 (0x34u)
897 #define ADI_RDSTATE_INC (0u)
898 #define ADI_RDSTATE_LEN (6u)
899 /** Read serial ID */
900 #define ADI_RDSID_BYTE0 (0x00u)
901 #define ADI_RDSID_BYTE1 (0x2Cu)
902 #define ADI_RDSID_INC (0u)
903 #define ADI_RDSID_LEN (6u)
904 /** Soft Reset */
905 #define ADI_SRST_BYTE0 (0x00u)
906 #define ADI_SRST_BYTE1 (0x27u)
907 #define ADI_SRST_INC (0u)
908 #define ADI_SRST_LEN (0u)
909 /**@}*/
910 
911 /* Configuration Register A */
912 /* CFGRA0 */
913 #define ADI_CFGRA0_CTH_0_2_POS (0u)
914 #define ADI_CFGRA0_CTH_0_2_MASK (0x7u)
915 #define ADI_CFGRA0_REFON_POS (7u)
916 #define ADI_CFGRA0_REFON_MASK (0x80u)
917 /* CFGRA1 */
918 #define ADI_CFGRA1_FLAG_D_0_7_POS (0u)
919 #define ADI_CFGRA1_FLAG_D_0_7_MASK (0xFFu)
920 /* CFGRA2 */
921 #define ADI_CFGRA2_OWA_0_2_POS (3u)
922 #define ADI_CFGRA2_OWA_0_2_MASK (0x38u)
923 #define ADI_CFGRA2_OWRNG_POS (6u)
924 #define ADI_CFGRA2_OWRNG_MASK (0x40u)
925 #define ADI_CFGRA2_SOAKON_POS (7u)
926 #define ADI_CFGRA2_SOAKON_MASK (0x80u)
927 /* CFGRA3 */
928 #define ADI_CFGRA3_GPO_1_8_POS (0u)
929 #define ADI_CFGRA3_GPO_1_8_MASK (0xFFu)
930 /* CFGRA4 */
931 #define ADI_CFGRA4_GPO_9_10_POS (0u)
932 #define ADI_CFGRA4_GPO_9_10_MASK (0x3u)
933 /* CFGRA5 */
934 #define ADI_CFGRA5_FC_0_2_POS (0u)
935 #define ADI_CFGRA5_FC_0_2_MASK (0x7u)
936 #define ADI_CFGRA5_COMM_BK_POS (3u)
937 #define ADI_CFGRA5_COMM_BK_MASK (0x8u)
938 #define ADI_CFGRA5_MUTE_ST_POS (4u)
939 #define ADI_CFGRA5_MUTE_ST_MASK (0x10u)
940 #define ADI_CFGRA5_SNAP_ST_POS (5u)
941 #define ADI_CFGRA5_SNAP_ST_MASK (0x20u)
942 
943 /* Configuration Register B */
944 /* CFGRB0 */
945 #define ADI_CFGRB0_VUV_0_7_POS (0u)
946 #define ADI_CFGRB0_VUV_0_7_MASK (0xFFu)
947 /* CFGRB1 */
948 #define ADI_CFGRB1_VUV_8_11_POS (0u)
949 #define ADI_CFGRB1_VUV_8_11_MASK (0xFu)
950 #define ADI_CFGRB1_VOV_0_3_POS (4u)
951 #define ADI_CFGRB1_VOV_0_3_MASK (0xF0u)
952 /* CFGRB2 */
953 #define ADI_CFGRB2_VOV_4_11_POS (0u)
954 #define ADI_CFGRB2_VOV_4_11_MASK (0xFFu)
955 /* CFGRB3 */
956 #define ADI_CFGRB3_DCT0_0_5_POS (0u)
957 #define ADI_CFGRB3_DCT0_0_5_MASK (0x3Fu)
958 #define ADI_CFGRB3_DTRNG_POS (6u)
959 #define ADI_CFGRB3_DTRNG_MASK (0x40u)
960 #define ADI_CFGRB3_DTMEN_POS (7u)
961 #define ADI_CFGRB3_DTMEN_MASK (0x80u)
962 /* CFGRB4 */
963 #define ADI_CFGRB4_DCC_1_8_POS (0u)
964 #define ADI_CFGRB4_DCC_1_8_MASK (0xFFu)
965 /* CFGRB5 */
966 #define ADI_CFGRB5_DCC_9_16_POS (0u)
967 #define ADI_CFGRB5_DCC_9_16_MASK (0xFFu)
968 
969 /* Status Register A */
970 /* STAR0 */
971 #define ADI_STAR0_VREF2_0_7_POS (0u)
972 #define ADI_STAR0_VREF2_0_7_MASK (0xFFu)
973 /* STAR1 */
974 #define ADI_STAR1_VREF2_8_15_POS (0u)
975 #define ADI_STAR1_VREF2_8_15_MASK (0xFFu)
976 /* STAR2 */
977 #define ADI_STAR2_ITMP_0_7_POS (0u)
978 #define ADI_STAR2_ITMP_0_7_MASK (0xFFu)
979 /* STAR3 */
980 #define ADI_STAR3_ITMP_8_15_POS (0u)
981 #define ADI_STAR3_ITMP_8_15_MASK (0xFFu)
982 
983 /* Status Register B */
984 /* STBR0 */
985 #define ADI_STBR0_VD_0_7_POS (0u)
986 #define ADI_STBR0_VD_0_7_MASK (0xFFu)
987 /* STBR1 */
988 #define ADI_STBR1_VD_8_15_POS (0u)
989 #define ADI_STBR1_VD_8_15_MASK (0xFFu)
990 /* STBR2 */
991 #define ADI_STBR2_VA_0_7_POS (0u)
992 #define ADI_STBR2_VA_0_7_MASK (0xFFu)
993 /* STBR3 */
994 #define ADI_STBR3_VA_8_15_POS (0u)
995 #define ADI_STBR3_VA_8_15_MASK (0xFFu)
996 /* STBR4 */
997 #define ADI_STBR4_VRES_0_7_POS (0u)
998 #define ADI_STBR4_VRES_0_7_MASK (0xFFu)
999 /* STBR5 */
1000 #define ADI_STBR5_VRES_8_15_POS (0u)
1001 #define ADI_STBR5_VRES_8_15_MASK (0xFFu)
1002 
1003 /* Status Register C */
1004 /* STCR0 */
1005 #define ADI_STCR0_CS1FLT_POS (0u)
1006 #define ADI_STCR0_CS1FLT_MASK (0x01u)
1007 #define ADI_STCR0_CS2FLT_POS (1u)
1008 #define ADI_STCR0_CS2FLT_MASK (0x02u)
1009 #define ADI_STCR0_CS3FLT_POS (2u)
1010 #define ADI_STCR0_CS3FLT_MASK (0x04u)
1011 #define ADI_STCR0_CS4FLT_POS (3u)
1012 #define ADI_STCR0_CS4FLT_MASK (0x08u)
1013 #define ADI_STCR0_CS5FLT_POS (4u)
1014 #define ADI_STCR0_CS5FLT_MASK (0x10u)
1015 #define ADI_STCR0_CS6FLT_POS (5u)
1016 #define ADI_STCR0_CS6FLT_MASK (0x20u)
1017 #define ADI_STCR0_CS7FLT_POS (6u)
1018 #define ADI_STCR0_CS7FLT_MASK (0x40u)
1019 #define ADI_STCR0_CS8FLT_POS (7u)
1020 #define ADI_STCR0_CS8FLT_MASK (0x80u)
1021 /* STCR1 */
1022 #define ADI_STCR1_CS9FLT_POS (0u)
1023 #define ADI_STCR1_CS9FLT_MASK (0x01u)
1024 #define ADI_STCR1_CS10FLT_POS (1u)
1025 #define ADI_STCR1_CS10FLT_MASK (0x02u)
1026 #define ADI_STCR1_CS11FLT_POS (2u)
1027 #define ADI_STCR1_CS11FLT_MASK (0x04u)
1028 #define ADI_STCR1_CS12FLT_POS (3u)
1029 #define ADI_STCR1_CS12FLT_MASK (0x08u)
1030 #define ADI_STCR1_CS13FLT_POS (4u)
1031 #define ADI_STCR1_CS13FLT_MASK (0x10u)
1032 #define ADI_STCR1_CS14FLT_POS (5u)
1033 #define ADI_STCR1_CS14FLT_MASK (0x20u)
1034 #define ADI_STCR1_CS15FLT_POS (6u)
1035 #define ADI_STCR1_CS15FLT_MASK (0x40u)
1036 #define ADI_STCR1_CS16FLT_POS (7u)
1037 #define ADI_STCR1_CS16FLT_MASK (0x80u)
1038 /* STCR2 */
1039 #define ADI_STCR2_CT_6_10_POS (0u)
1040 #define ADI_STCR2_CT_6_10_MASK (0x1Fu)
1041 /* STCR3 */
1042 #define ADI_STCR3_CTS_0_1_POS (0u)
1043 #define ADI_STCR3_CTS_0_1_MASK (0x03u)
1044 #define ADI_STCR3_CT_0_5_POS (2u)
1045 #define ADI_STCR3_CT_0_5_MASK (0xFCu)
1046 /* STCR4 */
1047 #define ADI_STCR4_SMED_POS (0u)
1048 #define ADI_STCR4_SMED_MASK (0x01u)
1049 #define ADI_STCR4_SED_POS (1u)
1050 #define ADI_STCR4_SED_MASK (0x02u)
1051 #define ADI_STCR4_CMED_POS (2u)
1052 #define ADI_STCR4_CMED_MASK (0x04u)
1053 #define ADI_STCR4_CED_POS (3u)
1054 #define ADI_STCR4_CED_MASK (0x08u)
1055 #define ADI_STCR4_VD_UV_POS (4u)
1056 #define ADI_STCR4_VD_UV_MASK (0x10u)
1057 #define ADI_STCR4_VD_OV_POS (5u)
1058 #define ADI_STCR4_VD_OV_MASK (0x20u)
1059 #define ADI_STCR4_VA_UV_POS (6u)
1060 #define ADI_STCR4_VA_UV_MASK (0x40u)
1061 #define ADI_STCR4_VA_OV_POS (7u)
1062 #define ADI_STCR4_VA_OV_MASK (0x80u)
1063 /* STCR5 */
1064 #define ADI_STCR5_OSCCHK_POS (0u)
1065 #define ADI_STCR5_OSCCHK_MASK (0x01u)
1066 #define ADI_STCR5_TMODCHK_POS (1u)
1067 #define ADI_STCR5_TMODCHK_MASK (0x02u)
1068 #define ADI_STCR5_THSD_POS (2u)
1069 #define ADI_STCR5_THSD_MASK (0x04u)
1070 #define ADI_STCR5_SLEEP_POS (3u)
1071 #define ADI_STCR5_SLEEP_MASK (0x08u)
1072 #define ADI_STCR5_SPIFLT_POS (4u)
1073 #define ADI_STCR5_SPIFLT_MASK (0x10u)
1074 #define ADI_STCR5_COMP_POS (5u)
1075 #define ADI_STCR5_COMP_MASK (0x20u)
1076 #define ADI_STCR5_VDE_POS (6u)
1077 #define ADI_STCR5_VDE_MASK (0x40u)
1078 #define ADI_STCR5_VDEL_POS (7u)
1079 #define ADI_STCR5_VDEL_MASK (0x80u)
1080 
1081 /* Status Register D */
1082 /* STDR0 */
1083 #define ADI_STDR0_C1UV_POS (0u)
1084 #define ADI_STDR0_C1UV_MASK (0x01u)
1085 #define ADI_STDR0_C1OV_POS (1u)
1086 #define ADI_STDR0_C1OV_MASK (0x02u)
1087 #define ADI_STDR0_C2UV_POS (2u)
1088 #define ADI_STDR0_C2UV_MASK (0x04u)
1089 #define ADI_STDR0_C2OV_POS (3u)
1090 #define ADI_STDR0_C2OV_MASK (0x08u)
1091 #define ADI_STDR0_C3UV_POS (4u)
1092 #define ADI_STDR0_C3UV_MASK (0x10u)
1093 #define ADI_STDR0_C3OV_POS (5u)
1094 #define ADI_STDR0_C3OV_MASK (0x20u)
1095 #define ADI_STDR0_C4UV_POS (6u)
1096 #define ADI_STDR0_C4UV_MASK (0x40u)
1097 #define ADI_STDR0_C4OV_POS (7u)
1098 #define ADI_STDR0_C4OV_MASK (0x80u)
1099 /* STDR1 */
1100 #define ADI_STDR1_C5UV_POS (0u)
1101 #define ADI_STDR1_C5UV_MASK (0x01u)
1102 #define ADI_STDR1_C50OV_POS (1u)
1103 #define ADI_STDR1_C50OV_MASK (0x02u)
1104 #define ADI_STDR1_C6UV_POS (2u)
1105 #define ADI_STDR1_C6UV_MASK (0x04u)
1106 #define ADI_STDR1_C6OV_POS (3u)
1107 #define ADI_STDR1_C6OV_MASK (0x08u)
1108 #define ADI_STDR1_C7UV_POS (4u)
1109 #define ADI_STDR1_C7UV_MASK (0x10u)
1110 #define ADI_STDR1_C7OV_POS (5u)
1111 #define ADI_STDR1_C7OV_MASK (0x20u)
1112 #define ADI_STDR1_C8UV_POS (6u)
1113 #define ADI_STDR1_C8UV_MASK (0x40u)
1114 #define ADI_STDR1_C8OV_POS (7u)
1115 #define ADI_STDR1_C8OV_MASK (0x80u)
1116 /* STDR2 */
1117 #define ADI_STDR2_C9UV_POS (0u)
1118 #define ADI_STDR2_C9UV_MASK (0x01u)
1119 #define ADI_STDR2_C9OV_POS (1u)
1120 #define ADI_STDR2_C9OV_MASK (0x02u)
1121 #define ADI_STDR2_C10UV_POS (2u)
1122 #define ADI_STDR2_C10UV_MASK (0x04u)
1123 #define ADI_STDR2_C10OV_POS (3u)
1124 #define ADI_STDR2_C10OV_MASK (0x08u)
1125 #define ADI_STDR2_C11UV_POS (4u)
1126 #define ADI_STDR2_C11UV_MASK (0x10u)
1127 #define ADI_STDR2_C11OV_POS (5u)
1128 #define ADI_STDR2_C11OV_MASK (0x20u)
1129 #define ADI_STDR2_C12UV_POS (6u)
1130 #define ADI_STDR2_C12UV_MASK (0x40u)
1131 #define ADI_STDR2_C12OV_POS (7u)
1132 #define ADI_STDR2_C12OV_MASK (0x80u)
1133 /* STDR3 */
1134 #define ADI_STDR3_C13UV_POS (0u)
1135 #define ADI_STDR3_C13UV_MASK (0x01u)
1136 #define ADI_STDR3_C13OV_POS (1u)
1137 #define ADI_STDR3_C13OV_MASK (0x02u)
1138 #define ADI_STDR3_C14UV_POS (2u)
1139 #define ADI_STDR3_C14UV_MASK (0x04u)
1140 #define ADI_STDR3_C14OV_POS (3u)
1141 #define ADI_STDR3_C14OV_MASK (0x08u)
1142 #define ADI_STDR3_C15UV_POS (4u)
1143 #define ADI_STDR3_C15UV_MASK (0x10u)
1144 #define ADI_STDR3_C15OV_POS (5u)
1145 #define ADI_STDR3_C15OV_MASK (0x20u)
1146 #define ADI_STDR3_C16UV_POS (6u)
1147 #define ADI_STDR3_C16UV_MASK (0x40u)
1148 #define ADI_STDR3_C16OV_POS (7u)
1149 #define ADI_STDR3_C16OV_MASK (0x80u)
1150 /* STDR5 */
1151 #define ADI_STDR5_OC_CNTR_0_7_POS (0u)
1152 #define ADI_STDR5_OC_CNTR_0_7_MASK (0xFFu)
1153 
1154 /* Status Register E */
1155 /* STER4 */
1156 #define ADI_STER4_GPI_1_8_POS (0u)
1157 #define ADI_STER4_GPI_1_8_MASK (0xFFu)
1158 /* STER5 */
1159 #define ADI_STER5_GPI_9_10_POS (0u)
1160 #define ADI_STER5_GPI_9_10_MASK (0x03u)
1161 #define ADI_STER5_REV_0_3_POS (4u)
1162 #define ADI_STER5_REV_0_3_MASK (0xF0u)
1163 
1164 /*========== Extern Constant and Variable Declarations ======================*/
1165 
1166 /** Used to choose which configuration register must be addressed */
1167 typedef enum {
1172 
1173 /* If needed, add definition of database entries here */
1174 
1175 /** This struct contains pointer to used data buffers */
1176 typedef struct {
1177  uint16_t *txBuffer;
1178  uint16_t *rxBuffer;
1193  uint8_t commandCounter[BS_NR_OF_STRINGS][ADI_N_ADI];
1195 } ADI_DATA_s;
1196 
1197 /**
1198  * This structure contains all the variables relevant for the ades183x state machine.
1199  * The user can get the current state of the ades183x state machine with this variable
1200  */
1201 typedef struct {
1202  bool measurementStarted; /*!< flag indicates that the driver has received the request to start measurements */
1203  bool firstMeasurementMade; /*!< flag indicates if first measurement cycle was completed for all strings */
1204  bool firstDiagnosticMade; /*!< flag indicates if all diagnostics made at least one time for all strings */
1205  uint8_t spiNumberInterfaces; /*!< number of SPI channels that have to be measured */
1206  uint8_t currentString; /*!< string currently being addressed */
1207  uint8_t redundantAuxiliaryChannel
1208  [BS_NR_OF_STRINGS]; /*!< auxiliary channel for which a redundant measurement must be made */
1209  uint64_t serialId[BS_NR_OF_STRINGS][ADI_N_ADI]; /*!< serial ID of the IC */
1210  uint8_t revision[BS_NR_OF_STRINGS][ADI_N_ADI]; /*!< revision of the IC */
1211  ADI_DATA_s data; /*!< contains pointers to the local data buffer */
1212 } ADI_STATE_s;
1213 
1214 /*========== Extern Function Prototypes =====================================*/
1215 
1216 /*========== Externalized Static Functions Prototypes (Unit Test) ===========*/
1217 #ifdef UNITY_UNIT_TEST
1218 #endif
1219 
1220 #endif /* FOXBMS__ADI_ADES183X_DEFS_H_ */
Headers for the driver for the ADES1830 analog front-end.
ADI_VOLTAGE_REGISTER_TYPE_e
@ ADI_CELL_VOLTAGE_REGISTER
@ ADI_VOLTAGE_REGISTER_TYPE_E_MAX
@ ADI_FILTERED_CELL_VOLTAGE_REGISTER
@ ADI_AVERAGE_CELL_VOLTAGE_REGISTER
@ ADI_REDUNDANT_CELL_VOLTAGE_REGISTER
#define ADI_N_ADI
ADI_CFG_REGISTER_SET_e
@ ADI_CFG_REGISTER_SET_B
@ ADI_CFG_REGISTER_SET_A
@ ADI_CFG_REGISTER_SET_E_MAX
ADI_AUXILIARY_REGISTER_TYPE_e
@ ADI_REDUNDANT_AUXILIARY_REGISTER
@ ADI_AUXILIARY_REGISTER_TYPE_E_MAX
@ ADI_AUXILIARY_REGISTER
ADI_PEC_FAULT_INJECTION_e
@ ADI_PEC_NO_FAULT_INJECTION
@ ADI_COMMAND_PEC_FAULT_INJECTION
@ ADI_DATA_PEC_FAULT_INJECTION
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
ADI_AUXILIARY_STORE_LOCATION_e
@ ADI_AUXILIARY_VOLTAGE
@ ADI_AUXILIARY_VOLTAGE_OPEN_WIRE
@ ADI_AUXILIARY_STORE_LOCATION_E_MAX
@ ADI_REDUNDANT_AUXILIARY_VOLTAGE
Configuration of the battery system (e.g., number of battery modules, battery cells,...
#define BS_NR_OF_STRINGS
Number of parallel strings in the battery pack.
Database module header.
Headers for the driver for the SPI module.
uint16_t * rxBuffer
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageRedundant
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageFiltered
DATA_BLOCK_ALL_GPIO_VOLTAGES_s * allGpioVoltagesRedundant
DATA_BLOCK_BALANCING_CONTROL_s * balancingControl
DATA_BLOCK_CELL_TEMPERATURE_s * cellTemperature
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltage
DATA_BLOCK_ALL_GPIO_VOLTAGES_s * allGpioVoltages
DATA_BLOCK_ALL_GPIO_VOLTAGES_s * allGpioVoltageOpenWire
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageAverageOpenWire
ADI_ERROR_TABLE_s * errorTable
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageOpenWireEven
uint16_t * txBuffer
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageAverage
DATA_BLOCK_OPEN_WIRE_s * openWire
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageRedundantOpenWire
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltageOpenWireOdd
uint8_t spiNumberInterfaces