61 #include "HL_system.h"
77 #define LTC_PORT_EXPANDER_TI_INPUT_REG_ADR (0x00u)
78 #define LTC_PORT_EXPANDER_TI_OUTPUT_REG_ADR (0x01u)
79 #define LTC_PORT_EXPANDER_TI_CONFIG_REG_ADR (0x03u)
86 #define LTC_ICOM_START (0x60u)
87 #define LTC_ICOM_STOP (0x10u)
88 #define LTC_ICOM_BLANK (0x00u)
89 #define LTC_ICOM_NO_TRANSMIT (0x70u)
90 #define LTC_FCOM_MASTER_ACK (0x00u)
91 #define LTC_FCOM_MASTER_NACK (0x08u)
92 #define LTC_FCOM_MASTER_NACK_STOP (0x09u)
96 #define LTC_MAX_SUPPORTED_CELLS (12u)
103 #pragma SET_DATA_SECTION(".sharedRAM")
106 #pragma SET_DATA_SECTION()
129 .minimumPlausibleVoltage_mV = 0,
145 .numberOfMeasuredMux = 32,
147 .ErrRetryCounter = 0,
148 .ErrRequestCounter = 0,
149 .VoltageSampleTime = 0,
151 .commandDataTransferTime = 3,
152 .commandTransferTime = 3,
153 .gpioClocksTransferTime = 3,
156 .muxmeas_nr_end = {0},
157 .first_measurement_made =
false,
161 .transmit_ongoing =
false,
183 .requestedString = 0u,
218 {0x69, 0x18, 0x0F, 0xF0, 0x0F, 0xF9};
221 {0x64, 0x18, 0x0F, 0xF9, 0x7F, 0xF9};
225 {0x03, 0x60, 0xF4, 0x6C};
227 {0x03, 0x70, 0xAF, 0x42};
229 {0x03, 0xE0, 0xB0, 0x4A};
231 {0x03, 0xF0, 0xEB, 0x64};
233 {0x02, 0xE0, 0x38, 0x06};
235 {0x02, 0xF0, 0x63, 0x28};
237 {0x02, 0xE1, 0xb3, 0x34};
257 {0x05, 0xE0, 0x97, 0x86};
295 uint16_t timer_ms_ok,
297 uint8_t substate_nok,
298 uint16_t timer_ms_nok);
305 uint32_t frameLength,
307 uint8_t stringNumber);
314 uint32_t frameLength);
334 uint8_t stringNumber);
339 uint8_t stringNumber);
343 uint16_t *DataBufferSPI_RX_with_PEC,
344 uint8_t stringNumber);
350 uint32_t frameLength);
356 uint32_t frameLength);
363 uint32_t frameLength,
372 uint32_t frameLength,
379 uint32_t frameLength,
387 uint32_t frameLength);
395 uint32_t frameLength,
402 uint32_t frameLength);
408 uint32_t frameLength,
417 uint32_t frameLength,
426 uint8_t stringNumber);
445 for (uint8_t stringNumber = 0u; stringNumber <
BS_NR_OF_STRINGS; stringNumber++) {
519 ltc_state->
state = state;
521 ltc_state->
timer = timer_ms;
548 uint16_t timer_ms_ok,
550 uint8_t substate_nok,
551 uint16_t timer_ms_nok) {
573 int32_t stringVoltage_mV = 0;
574 uint16_t numberValidMeasurements = 0;
599 numberValidMeasurements++;
625 uint16_t numberValidMeasurements = 0;
641 numberValidMeasurements++;
677 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
678 const uint16_t val_i = DataBufferSPI_RX[8u + (1u * i * 8u)] |
679 (DataBufferSPI_RX[8u + (1u * i * 8u) + 1u] << 8u);
740 return ltc_state->
state;
794 uint8_t tmpbusID = 0;
807 if (ltc_state->
timer > 0u) {
808 if ((--ltc_state->
timer) > 0u) {
815 if (ltc_state->
timer > 0u) {
816 if ((--ltc_state->
timer) > 0u) {
824 if (continueFunction ==
STD_OK) {
825 switch (ltc_state->
state) {
836 ltc_state->
adcMode = tmpadcMode;
2941 uint8_t stringNumber) {
2942 uint16_t val_ui = 0;
2943 int16_t temperature_ddegC = 0;
2944 uint8_t sensor_idx = 0;
2946 uint16_t buffer_LSB = 0;
2947 uint16_t buffer_MSB = 0;
2951 if (muxseqptr->
muxCh != 0xFF) {
2953 if ((muxseqptr->
muxID == 1) || (muxseqptr->
muxID == 2)) {
2954 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
2955 if (muxseqptr->
muxID == 1) {
2956 ch_idx = 0 + muxseqptr->
muxCh;
2958 ch_idx = 8 + muxseqptr->
muxCh;
2961 if (ch_idx < (2u * 8u)) {
2962 val_ui = *((uint16_t *)(&pRxBuff[6u + (1u * i * 8u)]));
2968 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
2969 buffer_MSB = pRxBuff[4u + (i * 8u) + 1u];
2970 buffer_LSB = pRxBuff[4u + (i * 8u)];
2971 val_ui = buffer_LSB | (buffer_MSB << 8);
2987 (~(1u << sensor_idx));
3019 uint8_t registerSet,
3020 uint8_t stringNumber) {
3021 uint16_t cellOffset = 0;
3022 uint16_t voltage_index = 0;
3023 uint16_t val_ui = 0;
3024 uint16_t voltage = 0;
3025 uint32_t bitmask = 0;
3026 uint16_t buffer_LSB = 0;
3027 uint16_t buffer_MSB = 0;
3028 bool continueFunction =
true;
3030 if (registerSet == 0u) {
3033 }
else if (registerSet == 1u) {
3036 }
else if (registerSet == 2u) {
3039 }
else if (registerSet == 3u) {
3042 }
else if (registerSet == 4u) {
3045 }
else if (registerSet == 5u) {
3049 continueFunction =
false;
3052 if (continueFunction ==
true) {
3054 bitmask |= 0x07u << cellOffset;
3057 if (cellOffset == 0u) {
3062 for (uint16_t m = 0u; m <
LTC_N_LTC; m++) {
3063 uint16_t incrementations = 0u;
3066 for (uint8_t c = 0u; c < 3u; c++) {
3068 voltage_index = c + cellOffset;
3071 buffer_MSB = pRxBuff[4u + (2u * c) + (m * 8u) + 1u];
3072 buffer_LSB = pRxBuff[4u + (2u * c) + (m * 8u)];
3073 val_ui = buffer_LSB | (buffer_MSB << 8u);
3075 voltage = ((val_ui)) * 100e-6f * 1000.0f;
3129 uint8_t registerSet,
3130 uint8_t stringNumber) {
3131 uint8_t i_offset = 0;
3132 uint32_t bitmask = 0;
3133 uint16_t buffer_LSB = 0;
3134 uint16_t buffer_MSB = 0;
3136 if (registerSet == 0u) {
3139 bitmask = 0x07u << i_offset;
3141 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3147 buffer_MSB = pRxBuff[4u + (i * 8u) + 1u];
3148 buffer_LSB = pRxBuff[4u + (i * 8u)];
3151 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3153 buffer_MSB = pRxBuff[6u + (i * 8u) + 1u];
3154 buffer_LSB = pRxBuff[6u + (i * 8u)];
3157 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3159 buffer_MSB = pRxBuff[8u + (i * 8u) + 1u];
3160 buffer_LSB = pRxBuff[8u + (i * 8u)];
3163 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3169 }
else if (registerSet == 1u) {
3172 bitmask = 0x03u << i_offset;
3174 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3180 buffer_MSB = pRxBuff[4u + (i * 8u) + 1u];
3181 buffer_LSB = pRxBuff[4u + (i * 8u)];
3184 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3186 buffer_MSB = pRxBuff[6u + (i * 8u) + 1u];
3187 buffer_LSB = pRxBuff[6u + (i * 8u)];
3190 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3196 }
else if (registerSet == 2u) {
3199 bitmask = 0x07u << i_offset;
3201 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3207 buffer_MSB = pRxBuff[4u + (i * 8u) + 1u];
3208 buffer_LSB = pRxBuff[4u + (i * 8u)];
3211 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3213 buffer_MSB = pRxBuff[6u + (i * 8u) + 1u];
3214 buffer_LSB = pRxBuff[6u + (i * 8u)];
3217 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3219 buffer_MSB = pRxBuff[8u + (i * 8u) + 1u];
3220 buffer_LSB = pRxBuff[8u + (i * 8u)];
3223 ((buffer_LSB | (buffer_MSB << 8u))) / 10u;
3229 }
else if (registerSet == 3u) {
3232 bitmask = 0x01u << i_offset;
3234 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3242 *((uint16_t *)(&pRxBuff[4u + (i * 8u)])) / 10u;
3328 uint32_t frameLength) {
3331 uint8_t PEC_Check[6];
3332 uint16_t PEC_result = 0;
3342 for (uint16_t i = 0u; i <
LTC_N_LTC; i++) {
3344 pTxBuff[4u + (i * 8u)] = 0xFC;
3345 pTxBuff[5u + (i * 8u)] = 0x00;
3346 pTxBuff[6u + (i * 8u)] = 0x00;
3347 pTxBuff[7u + (i * 8u)] = 0x00;
3348 pTxBuff[8u + (i * 8u)] = 0x00;
3349 pTxBuff[9u + (i * 8u)] = 0x00;
3351 PEC_Check[0] = pTxBuff[4u + (i * 8u)];
3352 PEC_Check[1] = pTxBuff[5u + (i * 8u)];
3353 PEC_Check[2] = pTxBuff[6u + (i * 8u)];
3354 PEC_Check[3] = pTxBuff[7u + (i * 8u)];
3355 PEC_Check[4] = pTxBuff[8u + (i * 8u)];
3356 PEC_Check[5] = pTxBuff[9u + (i * 8u)];
3358 PEC_result = LTC_pec15_calc(6, PEC_Check);
3359 pTxBuff[10u + (i * 8u)] = (PEC_result >> 8u) & 0xFFu;
3360 pTxBuff[11u + (i * 8u)] = PEC_result & 0xFFu;
3390 uint32_t frameLength,
3391 uint8_t registerSet,
3392 uint8_t stringNumber) {
3395 uint8_t PEC_Check[6];
3396 uint16_t PEC_result = 0;
3400 if (registerSet == 0u) {
3409 pTxBuff[4u + (i * 8u)] = 0xFC;
3410 pTxBuff[5u + (i * 8u)] = 0x00;
3411 pTxBuff[6u + (i * 8u)] = 0x00;
3412 pTxBuff[7u + (i * 8u)] = 0x00;
3413 pTxBuff[8u + (i * 8u)] = 0x00;
3414 pTxBuff[9u + (i * 8u)] = 0x00;
3418 pTxBuff[8u + (i * 8u)] |= 0x01u;
3422 pTxBuff[8u + (i * 8u)] |= 0x02u;
3426 pTxBuff[8u + (i * 8u)] |= 0x04u;
3430 pTxBuff[8u + (i * 8u)] |= 0x08u;
3434 pTxBuff[8u + (i * 8u)] |= 0x10u;
3438 pTxBuff[8u + (i * 8u)] |= 0x20u;
3442 pTxBuff[8u + (i * 8u)] |= 0x40u;
3446 pTxBuff[8u + (i * 8u)] |= 0x80u;
3450 pTxBuff[9u + (i * 8u)] |= 0x01u;
3454 pTxBuff[9u + (i * 8u)] |= 0x02u;
3458 pTxBuff[9u + (i * 8u)] |= 0x04u;
3462 pTxBuff[9u + (i * 8u)] |= 0x08u;
3465 PEC_Check[0] = pTxBuff[4u + (i * 8u)];
3466 PEC_Check[1] = pTxBuff[5u + (i * 8u)];
3467 PEC_Check[2] = pTxBuff[6u + (i * 8u)];
3468 PEC_Check[3] = pTxBuff[7u + (i * 8u)];
3469 PEC_Check[4] = pTxBuff[8u + (i * 8u)];
3470 PEC_Check[5] = pTxBuff[9u + (i * 8u)];
3472 PEC_result = LTC_pec15_calc(6, PEC_Check);
3473 pTxBuff[10u + (i * 8u)] = (PEC_result >> 8u) & 0xFFu;
3474 pTxBuff[11u + (i * 8u)] = PEC_result & 0xFFu;
3477 }
else if (registerSet == 1u) {
3486 pTxBuff[4u + (i * 8u)] = 0x0F;
3487 pTxBuff[5u + (i * 8u)] = 0x00;
3488 pTxBuff[6u + (i * 8u)] = 0x00;
3489 pTxBuff[7u + (i * 8u)] = 0x00;
3490 pTxBuff[8u + (i * 8u)] = 0x00;
3491 pTxBuff[9u + (i * 8u)] = 0x00;
3495 pTxBuff[4u + (i * 8u)] |= 0x10u;
3499 pTxBuff[4u + (i * 8u)] |= 0x20u;
3503 pTxBuff[4u + (i * 8u)] |= 0x40u;
3508 pTxBuff[4u + (i * 8u)] |= 0x80u;
3512 pTxBuff[5u + (i * 8u)] |= 0x01u;
3516 pTxBuff[5u + (i * 8u)] |= 0x02u;
3520 PEC_Check[0] = pTxBuff[4u + (i * 8u)];
3521 PEC_Check[1] = pTxBuff[5u + (i * 8u)];
3522 PEC_Check[2] = pTxBuff[6u + (i * 8u)];
3523 PEC_Check[3] = pTxBuff[7u + (i * 8u)];
3524 PEC_Check[4] = pTxBuff[8u + (i * 8u)];
3525 PEC_Check[5] = pTxBuff[9u + (i * 8u)];
3527 PEC_result = LTC_pec15_calc(6, PEC_Check);
3528 pTxBuff[10u + (i * 8u)] = (PEC_result >> 8u) & 0xFFu;
3529 pTxBuff[11u + (i * 8u)] = PEC_result & 0xFFu;
3547 for (uint8_t stringNumber = 0u; stringNumber <
BS_NR_OF_STRINGS; stringNumber++) {
3548 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3756 }
else if (PUP == 1u) {
3786 uint16_t *DataBufferSPI_RX_with_PEC,
3787 uint8_t stringNumber) {
3790 uint16_t PEC_result = 0;
3791 uint8_t PEC_Check[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3794 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3795 PEC_Check[0] = DataBufferSPI_RX_with_PEC[4u + (i * 8u)];
3796 PEC_Check[1] = DataBufferSPI_RX_with_PEC[5u + (i * 8u)];
3797 PEC_Check[2] = DataBufferSPI_RX_with_PEC[6u + (i * 8u)];
3798 PEC_Check[3] = DataBufferSPI_RX_with_PEC[7u + (i * 8u)];
3799 PEC_Check[4] = DataBufferSPI_RX_with_PEC[8u + (i * 8u)];
3800 PEC_Check[5] = DataBufferSPI_RX_with_PEC[9u + (i * 8u)];
3802 PEC_result = LTC_pec15_calc(6, PEC_Check);
3803 PEC_TX[0] = (uint8_t)((PEC_result >> 8u) & 0xFFu);
3804 PEC_TX[1] = (uint8_t)(PEC_result & 0xFFu);
3807 if ((PEC_TX[0] != DataBufferSPI_RX_with_PEC[10u + (i * 8u)]) ||
3808 (PEC_TX[1] != DataBufferSPI_RX_with_PEC[11u + (i * 8u)])) {
3851 uint32_t frameLength) {
3862 pTxBuff[0] = Command[0];
3863 pTxBuff[1] = Command[1];
3864 pTxBuff[2] = Command[2];
3865 pTxBuff[3] = Command[3];
3900 uint32_t frameLength) {
3903 uint16_t PEC_result = 0;
3904 uint8_t PEC_Check[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3906 pTxBuff[0] = Command[0];
3907 pTxBuff[1] = Command[1];
3908 pTxBuff[2] = Command[2];
3909 pTxBuff[3] = Command[3];
3912 for (uint16_t i = 0u; i <
LTC_N_LTC; i++) {
3913 PEC_Check[0] = pTxBuff[4u + (i * 8u)];
3914 PEC_Check[1] = pTxBuff[5u + (i * 8u)];
3915 PEC_Check[2] = pTxBuff[6u + (i * 8u)];
3916 PEC_Check[3] = pTxBuff[7u + (i * 8u)];
3917 PEC_Check[4] = pTxBuff[8u + (i * 8u)];
3918 PEC_Check[5] = pTxBuff[9u + (i * 8u)];
3920 PEC_result = LTC_pec15_calc(6, PEC_Check);
3921 pTxBuff[10u + (i * 8u)] = (PEC_result >> 8u) & 0xFFu;
3922 pTxBuff[11u + (i * 8u)] = PEC_result & 0xFFu;
3942 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
3943 #if SLAVE_BOARD_VERSION == 2u
3946 uint8_t address = 0x98u | ((mux % 4u) << 1u);
3947 uint8_t data = 1u << (channel % 8u);
3948 if (channel == 0xFFu) {
3955 uint8_t address = 0x90u | ((mux % 4u) << 1u);
3956 uint8_t data = 0x08u | (channel % 8u);
3957 if (channel == 0xFFu) {
3963 pTxBuff[4u + (i * 8u)] =
LTC_ICOM_START | ((address >> 4u) & 0x0Fu);
3965 pTxBuff[6u + (i * 8u)] =
LTC_ICOM_BLANK | ((data >> 4u) & 0x0Fu);
3968 pTxBuff[9u + (i * 8u)] = 0x00;
3990 uint32_t frameLength,
4014 address &= 0x3FFFFu;
4015 const uint8_t address0 = address >> 16u;
4016 const uint8_t address1 = (address & 0xFFFFu) >> 8u;
4017 const uint8_t address2 = address & 0xFFu;
4020 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4030 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4051 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4053 ((pRxBuff[7u + (i * 8u)] >> 4u));
4080 uint32_t frameLength,
4104 address &= 0x3FFFFu;
4105 const uint8_t address0 = address >> 16u;
4106 const uint8_t address1 = (address & 0xFFFFu) >> 8u;
4107 const uint8_t address2 = address & 0xFFu;
4110 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4120 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4157 uint32_t frameLength,
4186 uint32_t frameLength,
4187 uint16_t *cmd_data) {
4191 pTxBuff[4u + (i * 6u)] = cmd_data[0];
4192 pTxBuff[5u + (i * 6u)] = cmd_data[1];
4194 pTxBuff[6u + (i * 6u)] = cmd_data[2];
4195 pTxBuff[7u + (i * 6u)] = cmd_data[3];
4197 pTxBuff[8u + (i * 6u)] = cmd_data[4];
4198 pTxBuff[9u + (i * 6u)] = cmd_data[5];
4219 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4220 uint8_t temp_tmp[2];
4221 temp_tmp[0] = (pRxBuff[6u + (i * 8u)] << 4u) | ((pRxBuff[7u + (i * 8u)] >> 4u));
4222 temp_tmp[1] = (pRxBuff[8u + (i * 8u)] << 4u) | ((pRxBuff[9u + (i * 8u)] >> 4u));
4223 uint16_t val_i = (temp_tmp[0] << 8u) | (temp_tmp[1]);
4224 val_i = val_i >> 8u;
4249 uint32_t frameLength) {
4259 pTxBuff[5u + (i * 8u)] =
4262 pTxBuff[6u + (i * 8u)] =
4264 (output_data >> 4u);
4265 pTxBuff[7u + (i * 8u)] =
4266 (uint8_t)(output_data << 4u) |
4270 pTxBuff[9u + (i * 8u)] = 0;
4292 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4293 const uint8_t val_i = (pRxBuff[6u + (i * 8u)] << 4u) | ((pRxBuff[7u + (i * 8u)] >> 4u));
4319 uint32_t frameLength,
4337 pTxBuff[9u + (i * 8u)] = (uint8_t)(direction << 4u) |
4365 uint32_t frameLength) {
4383 pTxBuff[9u + (i * 8u)] = (uint8_t)(output_data << 4u) |
4412 uint32_t frameLength,
4428 pTxBuff[9u + (i * 8u)] = 0;
4443 pTxBuff[9u + (i * 8u)] = 0;
4463 for (uint16_t i = 0; i <
LTC_N_LTC; i++) {
4464 const uint8_t val_i = (pTxBuff[6u + (i * 8u)] << 4u) | ((pTxBuff[7u + (i * 8u)] >> 4u));
4484 uint16_t ltc_TXBufferClock[4u + 9u];
4486 for (uint16_t i = 0; i < (4u + 9u); i++) {
4487 ltc_TXBufferClock[i] = 0xFF;
4510 uint32_t SPI_Clock = 0;
4511 uint32_t prescaler = 0;
4536 prescaler = ((pSpiInterface->
pNode->FMT0) >> 8u) & 0xFFu;
4537 SPI_Clock = (uint32_t)(AVCLK1_FREQ * 1000000u) / (prescaler + 1u);
4551 uint32_t transferTime_us = 0;
4552 uint32_t SPI_Clock = 0;
4558 transferTime_us = (8u * 1000u * 1000u) / (SPI_Clock);
4565 transferTime_us = ((4u) * 8u * 1000u * 1000u) / (SPI_Clock);
4571 transferTime_us = ((4u + 9u) * 8u * 1000u * 1000u) / (SPI_Clock);
4610 bool retval =
false;