62 #pragma diag_suppress 232
108 .pMuxSequenceStart = {0},
247 static void N775_Wait(uint32_t milliseconds);
259 uint8_t deviceAddress = m + 1u;
260 uint16_t balancingState = 0u;
264 balancingState |= 1u << c;
288 MC33775_BAL_TMR_CH_ALL_OFFSET,
289 (MC33775_BAL_TMR_CH_ALL_PWM_PWM100_ENUM_VAL << MC33775_BAL_TMR_CH_ALL_PWM_POS) |
296 MC33775_BAL_GLOB_CFG_OFFSET,
297 (MC33775_BAL_GLOB_CFG_BALEN_ENABLED_ENUM_VAL << MC33775_BAL_GLOB_CFG_BALEN_POS) |
298 (MC33775_BAL_GLOB_CFG_TMRBALEN_STOP_ENUM_VAL << MC33775_BAL_GLOB_CFG_TMRBALEN_POS),
305 uint16_t primaryRawValues[20] = {0u};
306 uint16_t secondaryRawValues[4] = {0u};
307 uint16_t currentRawValue = 0u;
308 int16_t primaryValues[20] = {0u};
309 int16_t secondaryValues[4] = {0u};
310 int16_t currentValue = 0u;
315 bool gpio03Error =
false;
316 bool gpio47Error =
false;
321 MC33775_ALLM_APP_CTRL_OFFSET,
322 (1u << MC33775_ALLM_APP_CTRL_PAUSEBAL_POS) | (0x3FFu << MC33775_PRMM_APP_CTRL_CAPVC_POS) |
323 (MC33775_PRMM_APP_CTRL_VCOLNUM_DISABLED_ENUM_VAL << MC33775_PRMM_APP_CTRL_VCOLNUM_POS),
330 MC33775_ALLM_APP_CTRL_OFFSET,
331 (0u << MC33775_ALLM_APP_CTRL_PAUSEBAL_POS) | (0x3FFu << MC33775_PRMM_APP_CTRL_CAPVC_POS) |
332 (MC33775_PRMM_APP_CTRL_VCOLNUM_DISABLED_ENUM_VAL << MC33775_PRMM_APP_CTRL_VCOLNUM_POS),
338 uint8_t deviceAddress = m + 1u;
340 deviceAddress, 20, 4u, MC33775_PRMM_APP_VC_CNT_OFFSET, primaryRawValues, pState);
342 deviceAddress, 4, 4u, MC33775_SECM_APP_AIN4_OFFSET, secondaryRawValues, pState);
344 retValSupplyCurrent =
353 primaryValues[cb + 1u] = (int16_t)primaryRawValues[cb + 1u];
355 (((float_t)primaryValues[cb + 1u]) * 154.0e-6f * 1000.0f);
360 for (uint8_t g = 0u; g < 4u; g++) {
363 primaryValues[g + 16u] = (int16_t)primaryRawValues[g + 16u];
366 (((float_t)primaryValues[g + 16u]) * 154.0e-6f * 1000.0f);
374 primaryValues[15u] = (int16_t)primaryRawValues[15u];
376 (((float_t)primaryValues[15u]) * 2.58e-3f * 1000.0f);
384 for (uint8_t g = 4u; g < 8u; g++) {
386 secondaryValues[g - 4u] = (int16_t)secondaryRawValues[g - 4u];
389 (((float_t)secondaryValues[g - 4u]) * 154.0e-6f * 1000.0f);
400 if (gpio03Error ==
false) {
410 if ((gpio03Error ==
false) && (gpio47Error ==
false)) {
427 currentValue = (int16_t)currentRawValue;
429 (((float_t)currentValue) * 7.69e-6f * 1000.0f);
442 uint16_t readValue = 0u;
443 uint16_t uid[3u] = {0};
452 MC33775_SYS_MODE_OFFSET,
453 (MC33775_SYS_MODE_TARGETMODE_DEEPSLEEP_ENUM_VAL << MC33775_SYS_MODE_TARGETMODE_POS),
470 MC33775_SYS_COM_CFG_OFFSET,
472 (MC33775_SYS_COM_CFG_BUSFW_ENABLED_ENUM_VAL << MC33775_SYS_COM_CFG_BUSFW_POS),
491 MC33775_SYS_COM_TO_CFG_OFFSET,
500 for (uint8_t j = 0u; j <= 3u; j++) {
518 switch (returnedValue) {
567 uint16_t iterator = 0;
569 for (uint8_t stringNumber = 0u; stringNumber <
BS_NR_OF_STRINGS; stringNumber++) {
626 MC33775_I2C_CFG_OFFSET,
627 (MC33775_I2C_CFG_EN_ENABLED_ENUM_VAL << MC33775_I2C_CFG_EN_POS) +
628 (MC33775_I2C_CFG_CLKSEL_F_400K_ENUM_VAL << MC33775_I2C_CFG_CLKSEL_POS),
660 uint16_t readValue = 0u;
661 uint8_t dataI2c = 0u;
689 MC33775_I2C_DATA0_OFFSET,
690 (addressI2c_write << MC33775_I2C_DATA0_BYTE0_POS) | (dataI2c << MC33775_I2C_DATA0_BYTE1_POS),
696 MC33775_I2C_DATA1_OFFSET,
697 (addressI2c_read << MC33775_I2C_DATA1_BYTE2_POS) | (
N775_I2C_DUMMY_BYTE << MC33775_I2C_DATA1_BYTE3_POS),
703 MC33775_I2C_CTRL_OFFSET,
705 ((MC33775_I2C_CTRL_STPAFTER_STOP_ENUM_VAL << MC33775_I2C_CTRL_STPAFTER_POS) +
719 }
while ((readValue & MC33775_I2C_STAT_PENDING_MSK) && (returnedValue ==
N775_COMMUNICATION_OK) && (tries > 0u));
729 readValue = readValue >> MC33775_I2C_DATA1_BYTE3_POS;
733 if (readValue == dataI2c) {
767 MC33775_ALLM_CFG_OFFSET,
776 uint8_t i2cAddressByte = 0u;
777 uint16_t readValue = 0u;
786 i2cAddressByte = (transactionData.deviceAddress << 1u) & 0xFEu;
788 uint8_t registerIncrement = 0u;
789 uint16_t registerStartAddress = 0u;
790 uint16_t dataToWrite = 0u;
791 uint8_t byteIndex = 0u;
792 uint8_t bytesWritten = 0u;
793 uint8_t msbIndex = 1u;
794 uint8_t lsbIndex = 1u;
796 switch (transactionData.transferType) {
803 transactionData.module + 1u,
804 MC33775_I2C_DATA0_OFFSET,
805 (i2cAddressByte << MC33775_I2C_DATA0_BYTE0_POS) |
806 (transactionData.writeData[0u] << MC33775_I2C_DATA0_BYTE1_POS),
809 if (transactionData.writeDataLength > 1u) {
811 registerStartAddress = MC33775_I2C_DATA1_OFFSET;
812 registerIncrement = 0u;
815 while (byteIndex < transactionData.writeDataLength) {
818 if ((byteIndex % 2u) != 0u) {
819 dataToWrite |= (uint16_t)(transactionData.writeData[byteIndex]) & 0xFFu;
822 dataToWrite |= ((uint16_t)(transactionData.writeData[byteIndex]) << 8u) & 0xFF00u;
826 if ((bytesWritten == 2u) || (byteIndex == transactionData.writeDataLength)) {
828 transactionData.module + 1u,
829 registerStartAddress + registerIncrement,
841 transactionData.module + 1u,
842 MC33775_I2C_CTRL_OFFSET,
844 ((transactionData.writeDataLength + 1u) << MC33775_I2C_CTRL_START_POS) |
845 ((MC33775_I2C_CTRL_STPAFTER_STOP_ENUM_VAL << MC33775_I2C_CTRL_STPAFTER_POS) +
846 (0u << MC33775_I2C_CTRL_RDAFTER_POS)),
852 transactionData.module + 1u, MC33775_I2C_STAT_OFFSET, &readValue, pState);
875 transactionData.module + 1u,
876 MC33775_I2C_DATA0_OFFSET,
877 i2cAddressByte << MC33775_I2C_DATA0_BYTE0_POS,
882 transactionData.module + 1u,
883 MC33775_I2C_CTRL_OFFSET,
885 ((transactionData.readDataLength + 1u) << MC33775_I2C_CTRL_START_POS) |
886 ((1u << MC33775_I2C_CTRL_STPAFTER_POS) + (0u << MC33775_I2C_CTRL_RDAFTER_POS)),
892 transactionData.module + 1u, MC33775_I2C_STAT_OFFSET, &readValue, pState);
898 nack = readValue & MC33775_I2C_STAT_NACKRCV_MSK;
900 uint16_t readData[13u] = {0u};
903 uint16_t nrOfRegisterToRead = (transactionData.readDataLength / 2u) + 1u;
905 transactionData.module + 1u,
908 MC33775_I2C_DATA0_OFFSET,
913 transactionData.readData[0u] = (uint8_t)((readData[0u] & 0xFF00) >> 8u);
917 while (byteIndex < transactionData.readDataLength) {
919 if ((byteIndex % 2u) != 0u) {
920 transactionData.readData[byteIndex] = (uint8_t)(readData[lsbIndex] & 0xFFu);
923 transactionData.readData[byteIndex] = (uint8_t)((readData[msbIndex] & 0xFF00u) >> 8u);
943 transactionData.module + 1u,
944 MC33775_I2C_DATA0_OFFSET,
945 ((i2cAddressByte |
N775_I2C_WRITE) << MC33775_I2C_DATA0_BYTE0_POS) |
946 (transactionData.writeData[0u] << MC33775_I2C_DATA0_BYTE1_POS),
949 if (transactionData.writeDataLength > 1u) {
951 registerStartAddress = MC33775_I2C_DATA1_OFFSET;
952 registerIncrement = 0u;
955 transactionData.writeData[transactionData.writeDataLength] = i2cAddressByte |
N775_I2C_READ;
956 while (byteIndex < (transactionData.writeDataLength + 1)) {
959 if ((byteIndex % 2u) != 0u) {
960 dataToWrite |= (uint16_t)(transactionData.writeData[byteIndex]) & 0xFFu;
963 dataToWrite |= ((uint16_t)(transactionData.writeData[byteIndex]) << 8u) & 0xFF00u;
967 if ((bytesWritten == 2u) || (byteIndex == (transactionData.writeDataLength + 1))) {
969 transactionData.module + 1u,
970 registerStartAddress + registerIncrement,
980 transactionData.module + 1u,
981 MC33775_I2C_DATA1_OFFSET,
982 ((i2cAddressByte |
N775_I2C_READ) << MC33775_I2C_DATA1_BYTE2_POS),
989 transactionData.module + 1u,
990 MC33775_I2C_CTRL_OFFSET,
993 ((transactionData.writeDataLength + transactionData.readDataLength + 2u)
994 << MC33775_I2C_CTRL_START_POS) |
995 ((1u << MC33775_I2C_CTRL_STPAFTER_POS) +
996 ((1u + transactionData.writeDataLength) << MC33775_I2C_CTRL_RDAFTER_POS)),
1002 transactionData.module + 1u, MC33775_I2C_STAT_OFFSET, &readValue, pState);
1008 nack = readValue & MC33775_I2C_STAT_NACKRCV_MSK;
1010 uint16_t readData[13u] = {0u};
1012 uint16_t registerOffset = MC33775_I2C_DATA0_OFFSET;
1014 registerOffset += (transactionData.writeDataLength + 2u) / 2u;
1017 uint16_t nrOfRegisterToRead = 0u;
1018 if ((transactionData.writeDataLength % 2u) == 0u) {
1019 nrOfRegisterToRead = (transactionData.readDataLength + 1u) / 2u;
1021 nrOfRegisterToRead = (transactionData.readDataLength / 2u) + 1u;
1025 transactionData.module + 1u, nrOfRegisterToRead, 4u, registerOffset, readData, pState);
1033 if (((transactionData.writeDataLength + 1) % 2u) != 0u) {
1037 while (byteIndex < transactionData.readDataLength) {
1039 if ((byteIndex % 2u) == 0u) {
1040 transactionData.readData[byteIndex] = (uint8_t)(readData[lsbIndex] & 0xFFu);
1043 transactionData.readData[byteIndex] =
1044 (uint8_t)((readData[msbIndex] & 0xFF00u) >> 8u);
1053 while (byteIndex < transactionData.readDataLength) {
1055 if ((byteIndex % 2u) != 0u) {
1056 transactionData.readData[byteIndex] = (uint8_t)(readData[lsbIndex] & 0xFFu);
1059 transactionData.readData[byteIndex] =
1060 (uint8_t)((readData[msbIndex] & 0xFF00u) >> 8u);
1098 FAS_ASSERT((dataLength > 0u) && (dataLength <= 13u));
1102 transactionData.
module = module;
1112 for (uint8_t i = 0u; i < dataLength; i++) {
1113 pData[i] = transactionData.readData[i];
1127 FAS_ASSERT((dataLength > 0u) && (dataLength <= 13u));
1131 transactionData.
module = module;
1135 for (uint8_t i = 0u; i < dataLength; i++) {
1136 transactionData.
writeData[i] = pData[i];
1156 uint8_t deviceAddress,
1157 uint8_t *pDataWrite,
1158 uint8_t writeDataLength,
1160 uint8_t readDataLength) {
1165 FAS_ASSERT((uint16_t)(writeDataLength + readDataLength) <= 12u);
1169 transactionData.
module = module;
1174 for (uint8_t i = 0u; i < writeDataLength; i++) {
1175 transactionData.
writeData[i] = pDataWrite[i];
1183 for (uint8_t i = 0u; i < readDataLength; i++) {
1184 pDataRead[i] = transactionData.readData[i];
1198 bool retval =
false;
1264 #ifdef UNITY_UNIT_TEST
1265 extern void TEST_N775_BalanceControl(
N775_STATE_s *pState) {
1268 extern void TEST_N775_BalanceSetup(
N775_STATE_s *pState) {
1271 extern void TEST_N775_CaptureMeasurement(
N775_STATE_s *pState) {
1280 extern void TEST_N775_IncrementMuxIndex(
N775_STATE_s *pState) {
1283 extern void TEST_N775_IncrementStringSequence(
N775_STATE_s *pState) {
1286 extern void TEST_N775_Initialize(
N775_STATE_s *pState) {
1289 extern void TEST_N775_InitializeDatabase(
N775_STATE_s *pState) {
1292 extern void TEST_N775_InitializeI2c(
N775_STATE_s *pState) {
1295 extern void TEST_N775_ResetStringSequence(
N775_STATE_s *pState) {
1298 extern void TEST_N775_ResetMuxIndex(
N775_STATE_s *pState) {
1301 extern void TEST_N775_SetFirstMeasurementCycleFinished(
N775_STATE_s *pState) {
1307 extern void TEST_N775_StartMeasurement(
N775_STATE_s *pState) {
1313 extern void TEST_N775_Wait(uint32_t milliseconds) {
@ AFE_I2C_TRANSFER_TYPE_WRITE
@ AFE_I2C_TRANSFER_TYPE_WRITEREAD
@ AFE_I2C_TRANSFER_TYPE_READ_SUCCESS
@ AFE_I2C_TRANSFER_TYPE_WRITE_FAIL
@ AFE_I2C_TRANSFER_TYPE_READ
@ AFE_I2C_TRANSFER_TYPE_WRITE_SUCCESS
@ AFE_I2C_TRANSFER_TYPE_READ_FAIL
Headers for the driver for the general DMA module of monitoring ICs.
#define BS_NR_OF_CELL_BLOCKS_PER_MODULE
number of cells per module
#define BS_NR_OF_STRINGS
Number of parallel strings in the battery pack.
#define BS_NR_OF_TEMP_SENSORS_PER_MODULE
number of temperature sensors per battery module
#define BS_NR_OF_GPIOS_PER_MODULE
Defines the number of GPIOs.
#define BS_NR_OF_CELL_BLOCKS_PER_STRING
#define BS_NR_OF_MODULES_PER_STRING
number of modules in a string
#define DATA_READ_DATA(...)
#define DATA_WRITE_DATA(...)
@ DATA_BLOCK_ID_BALANCING_CONTROL
@ DATA_BLOCK_ID_CELL_TEMPERATURE_BASE
@ DATA_BLOCK_ID_OPEN_WIRE_BASE
@ DATA_BLOCK_ID_SLAVE_CONTROL
@ DATA_BLOCK_ID_CELL_VOLTAGE_BASE
@ DATA_BLOCK_ID_ALL_GPIO_VOLTAGES_BASE
@ DATA_BLOCK_ID_BALANCING_FEEDBACK_BASE
Assert macro implementation.
#define FAS_ASSERT(x)
Assertion macro that asserts that x is true.
#define FAS_TRAP
Define that evaluates to essential boolean false thus tripping an assert.
Definition of foxBMS standard types.
#define NULL_PTR
Null pointer.
Header of task driver implementation.
OS_QUEUE ftsk_afeFromI2cQueue
volatile bool ftsk_allQueuesCreated
OS_QUEUE ftsk_afeToI2cQueue
Headers for the driver for the MCU module.
N775_COMMUNICATION_STATUS_e N775_CommunicationRead(uint16_t deviceAddress, uint16_t registerAddress, uint16_t *pValue, N775_STATE_s *pState)
Read a value from a specific register in a specific device.
N775_COMMUNICATION_STATUS_e N775_CommunicationReadMultiple(uint16_t deviceAddress, uint16_t numberOfItems, uint16_t responseLength, uint16_t registerAddress, uint16_t *pValues, N775_STATE_s *pState)
Read multiple values from specific registers in a specific device.
void N775_ResetMessageCounter(uint16_t deviceAddress, uint8_t string)
Reset the message counter for one or all devices.
void N775_CommunicationWrite(uint16_t deviceAddress, uint16_t registerAddress, uint16_t value, SPI_INTERFACE_CONFIG_s *pSpiInterface)
Write a value into a specific register in a specific device.
Header for the low level driver for the MC33775A.
enum N775_COMMUNICATION_STATUS N775_COMMUNICATION_STATUS_e
@ N775_COMMUNICATION_ERROR_WRONG_CRC
@ N775_COMMUNICATION_ERROR_TIMEOUT
static DATA_BLOCK_SLAVE_CONTROL_s n775_slaveControl
STD_RETURN_TYPE_e N775_I2cWriteRead(uint8_t module, uint8_t deviceAddress, uint8_t *pDataWrite, uint8_t writeDataLength, uint8_t *pDataRead, uint8_t readDataLength)
trigger a read on the I2C bus of the slave, first write address of register to read.
bool N775_IsFirstMeasurementCycleFinished(N775_STATE_s *pState)
gets the measurement initialization status.
static void N775_StartMeasurement(N775_STATE_s *pState)
starts the measurement.
static N775_ERROR_TABLE_s n775_errorTable
static STD_RETURN_TYPE_e N775_TransmitI2c(N775_STATE_s *pState)
transmit over I2C on NXP slave.
N775_STATE_s n775_stateBase
static DATA_BLOCK_ALL_GPIO_VOLTAGES_s n775_allGpioVoltage
static void N775_SetFirstMeasurementCycleFinished(N775_STATE_s *pState)
sets the measurement initialization status.
static DATA_BLOCK_MIN_MAX_s n775_minMax
static void N775_ResetStringSequence(N775_STATE_s *pState)
reset index in string sequence.
static DATA_BLOCK_CELL_TEMPERATURE_s n775_cellTemperature
static void N775_InitializeDatabase(N775_STATE_s *pState)
in the database, initializes the fields related to the N775 driver.
static void N775_ResetMuxIndex(N775_STATE_s *pState)
resets index in mux sequence.
static DATA_BLOCK_CELL_VOLTAGE_s n775_cellVoltage
static void N775_BalanceSetup(N775_STATE_s *pState)
setups balancing.
static void N775_IncrementStringSequence(N775_STATE_s *pState)
increments index in string sequence.
static void N775_CaptureMeasurement(N775_STATE_s *pState)
captures the measurement.
void N775_Measure(N775_STATE_s *pState)
trigger function for the N775 driver state machine.
static void N775_IncrementMuxIndex(N775_STATE_s *pState)
updates index in mux sequence.
static DATA_BLOCK_BALANCING_CONTROL_s n775_balancingControl
static DATA_BLOCK_OPEN_WIRE_s n775_openWire
static void N775_ErrorHandling(N775_STATE_s *pState, N775_COMMUNICATION_STATUS_e returnedValue, uint8_t module)
handles error when doing measurements.
static N775_SUPPLY_CURRENT_s n775_supplyCurrent
STD_RETURN_TYPE_e N775_I2cRead(uint8_t module, uint8_t deviceAddress, uint8_t *pData, uint8_t dataLength)
trigger a read on the I2C bus of the slave.
static void N775_Wait(uint32_t milliseconds)
waits for a definite amount of time in ms.
static void N775_InitializeI2c(N775_STATE_s *pState)
init I2C for the N775 slaves.
static STD_RETURN_TYPE_e N775_Enumerate(N775_STATE_s *pState)
enumerates the N775 slaves.
static void N775_BalanceControl(N775_STATE_s *pState)
manages balancing.
STD_RETURN_TYPE_e N775_I2cWrite(uint8_t module, uint8_t deviceAddress, uint8_t *pData, uint8_t dataLength)
trigger a write on the I2C bus of the slave.
static STD_RETURN_TYPE_e N775_SetMuxChannel(N775_STATE_s *pState)
sets mux channel.
static void N775_Initialize(N775_STATE_s *pState)
initializes the N775 driver.
static DATA_BLOCK_BALANCING_FEEDBACK_s n775_balancingFeedback
Headers for the driver for the MC33775A analog front-end.
N775_MUX_CH_CFG_s n775_muxSequence[N775_MUX_SEQUENCE_LENGTH]
int16_t N775_ConvertVoltagesToTemperatures(uint16_t adcVoltage_mV)
converts a raw voltage from multiplexer to a temperature value in deci °C.
#define N775_I2C_NR_BYTES_FOR_MUX_WRITE
#define N775_I2C_NR_BYTES_TO_SWITCH_TO_READ_FOR_UX_READ
#define N775_MEASUREMENT_CAPTURE_TIME_MS
#define N775_INVALID_REGISTER_VALUE
#define N775_I2C_DUMMY_BYTE
#define N775_CHECK_SUPPLY_CURRENT
#define N775_TIMEOUT_SWITCH
#define N775_TIMEOUT_TO_SLEEP_10MS
#define N775_CHECK_MUX_STATE
#define N775_DEFAULT_CHAIN_ADDRESS
#define N775_MUXED_TEMP_GPIO_POSITION
#define N775_MEASUREMENT_READY_TIME_MS
#define N775_MUX_SEQUENCE_LENGTH
#define N775_I2C_FINISHED_TIMEOUT_ms
#define N775_ADG728_ADDRESS_UPPERBITS
#define N775_BROADCAST_ADDRESS
#define N775_USE_MUX_FOR_TEMP
#define N775_PRE_BALANCING_TIMER
#define N775_BALPAUSELEN_10US
#define N775_GLOBAL_BALANCING_TIMER
#define N775_WAKEUP_TIME_MS
#define N775_TIME_AFTER_MEASUREMENT_START_MS
#define N775_ALL_CHANNEL_BALANCING_TIMER
#define N775_FLAG_READY_TRIES
Declaration of the OS wrapper interface.
OS_STD_RETURN_e OS_ReceiveFromQueue(OS_QUEUE xQueue, void *const pvBuffer, uint32_t ticksToWait)
Receive an item from a queue.
void OS_DelayTaskUntil(uint32_t *pPreviousWakeTime, uint32_t milliseconds)
Delay a task until a specified time.
void OS_ExitTaskCritical(void)
Exit Critical interface function for use in FreeRTOS-Tasks and FreeRTOS-ISR.
void OS_EnterTaskCritical(void)
Enter Critical interface function for use in FreeRTOS-Tasks and FreeRTOS-ISR.
OS_STD_RETURN_e OS_SendToBackOfQueue(OS_QUEUE xQueue, const void *const pvItemToQueue, uint32_t ticksToWait)
Post an item to the back the provided queue.
uint32_t OS_GetTickCount(void)
Returns OS based system tick value.
Headers for the driver for the SPI module.
SPI_INTERFACE_CONFIG_s spi_nxp775InterfaceTx[BS_NR_OF_STRINGS]
SPI_INTERFACE_CONFIG_s spi_nxp775InterfaceRx[BS_NR_OF_STRINGS]
AFE_I2C_TRANSFER_TYPE_e transferType
int16_t gpioVoltages_mV[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING *BS_NR_OF_GPIOS_PER_MODULE]
DATA_BLOCK_HEADER_s header
DATA_BLOCK_HEADER_s header
uint8_t balancingState[BS_NR_OF_STRINGS][BS_NR_OF_CELL_BLOCKS_PER_STRING]
DATA_BLOCK_HEADER_s header
int16_t cellTemperature_ddegC[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING][BS_NR_OF_TEMP_SENSORS_PER_MODULE]
DATA_BLOCK_HEADER_s header
int16_t cellVoltage_mV[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING][BS_NR_OF_CELL_BLOCKS_PER_MODULE]
DATA_BLOCK_HEADER_s header
uint32_t moduleVoltage_mV[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
int16_t minimumTemperature_ddegC[BS_NR_OF_STRINGS]
uint16_t nrSensorMinimumTemperature[BS_NR_OF_STRINGS]
uint16_t nrModuleMinimumTemperature[BS_NR_OF_STRINGS]
uint16_t nrModuleMaximumTemperature[BS_NR_OF_STRINGS]
int16_t maximumTemperature_ddegC[BS_NR_OF_STRINGS]
uint16_t nrSensorMaximumTemperature[BS_NR_OF_STRINGS]
uint16_t nrCellMaximumCellVoltage[BS_NR_OF_STRINGS]
uint16_t nrCellMinimumCellVoltage[BS_NR_OF_STRINGS]
DATA_BLOCK_HEADER_s header
uint16_t nrModuleMinimumCellVoltage[BS_NR_OF_STRINGS]
uint16_t nrModuleMaximumCellVoltage[BS_NR_OF_STRINGS]
int16_t maximumCellVoltage_mV[BS_NR_OF_STRINGS]
int16_t minimumCellVoltage_mV[BS_NR_OF_STRINGS]
DATA_BLOCK_HEADER_s header
DATA_BLOCK_HEADER_s header
DATA_BLOCK_BALANCING_CONTROL_s * balancingControl
uint64_t uid[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
N775_ERROR_TABLE_s * errorTable
DATA_BLOCK_CELL_TEMPERATURE_s * cellTemperature
DATA_BLOCK_ALL_GPIO_VOLTAGES_s * allGpioVoltage
N775_SUPPLY_CURRENT_s * supplyCurrent
DATA_BLOCK_MIN_MAX_s * minMax
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltage
bool mux1IsOK[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
bool crcIsValid[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
bool mux0IsOk[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
bool communicationOk[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
bool noCommunicationTimeout[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
bool mux2IsOK[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
bool mux3IsOK[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]
SPI_INTERFACE_CONFIG_s * pSpiRxSequenceStart
SPI_INTERFACE_CONFIG_s * pSpiTxSequenceStart
N775_MUX_CH_CFG_s * pMuxSequence[BS_NR_OF_STRINGS]
bool firstMeasurementMade
SPI_INTERFACE_CONFIG_s * pSpiTxSequence
SPI_INTERFACE_CONFIG_s * pSpiRxSequence
uint8_t currentMux[BS_NR_OF_STRINGS]
N775_MUX_CH_CFG_s * pMuxSequenceStart[BS_NR_OF_STRINGS]
uint16_t current[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING]