63 #include "HL_reg_system.h"
76 #define CAN_TIMING_LOWER_LIMIT_COUNTS (95u)
79 #define CAN_TIMING_UPPER_LIMIT_COUNTS (105u)
82 #define CAN_HAL_RETVAL_NO_DATA_LOST (1u)
92 #define CAN_IF2ARB_STANDARD_IDENTIFIER_SHIFT (18u)
94 #define CAN_IF2ARB_EXTENDED_IDENTIFIER_SHIFT (0u)
105 #define CAN_IF2ARB_SET_TX_DIRECTION ((uint32)1u << 29u)
111 #define CAN_IF2ARB_USE_STANDARD_IDENTIFIER ((uint32)0u << 30u)
113 #define CAN_IF2ARB_USE_EXTENDED_IDENTIFIER ((uint32)1u << 30u)
117 #define CAN_LOWEST_MAILBOX_FOR_EXTENDED_IDENTIFIERS (61u)
118 #define CAN_HIGHEST_MAILBOX_FOR_EXTENDED_IDENTIFIERS (64u)
123 "Lower mailbox number must not be greater than higher mailbox number");
126 "Highest mailbox number must not be larger than total number of mailboxes");
196 #if BS_CURRENT_SENSOR_PRESENT == true
300 canREG1->CTL = (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)0x0000000AU << 10U) |
304 canREG1->ES |= 0xFFFFFFFFU;
307 canREG1->ABOTR = (uint32)0U;
319 while ((canREG1->IF1STAT & 0x80U) == 0x80U) {
322 canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x000007FFU) << (uint32)18U);
323 canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U |
324 (uint32)((uint32)((uint32)0U & (uint32)0x000007FFU) << (uint32)18U);
325 canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
326 canREG1->IF1CMD = (uint8)0xF8U;
327 canREG1->IF1NO = 42U;
339 while ((canREG1->IF1STAT & 0x80U) == 0x80U) {
342 canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
343 canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
344 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
345 canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
346 canREG1->IF1CMD = (uint8)0xF8U;
347 canREG1->IF1NO = 61U;
359 while ((canREG1->IF2STAT & 0x80U) == 0x80U) {
362 canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
363 canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
364 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
365 canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
366 canREG1->IF2CMD = (uint8)0xF8U;
367 canREG1->IF2NO = 62U;
379 while ((canREG1->IF1STAT & 0x80U) == 0x80U) {
382 canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
383 canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
384 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
385 canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
386 canREG1->IF1CMD = (uint8)0xF8U;
387 canREG1->IF1NO = 63U;
399 while ((canREG1->IF2STAT & 0x80U) == 0x80U) {
402 canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
403 canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
404 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
405 canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
406 canREG1->IF2CMD = (uint8)0xF8U;
407 canREG1->IF2NO = 64U;
415 while ((canREG1->IF1STAT & 0x80U) == 0x80U) {
417 canREG1->IF1CMD = 0x87U;
425 while ((canREG1->IF2STAT & 0x80U) == 0x80U) {
427 canREG1->IF2CMD = 0x17U;
430 canREG1->CTL &= ~(uint32)(0x00000041U);
451 canREG2->CTL = (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)0x0000000AU << 10U) | 0x00020043U;
454 canREG2->ES |= 0xFFFFFFFFU;
466 while ((canREG2->IF1STAT & 0x80U) == 0x80U) {
469 canREG2->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
470 canREG2->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
471 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
472 canREG2->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
473 canREG2->IF1CMD = (uint8)0xF8U;
474 canREG2->IF1NO = 61U;
486 while ((canREG2->IF2STAT & 0x80U) == 0x80U) {
489 canREG2->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
490 canREG2->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
491 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
492 canREG2->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
493 canREG2->IF2CMD = (uint8)0xF8U;
494 canREG2->IF2NO = 62U;
506 while ((canREG2->IF1STAT & 0x80U) == 0x80U) {
509 canREG2->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
510 canREG2->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
511 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
512 canREG2->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
513 canREG2->IF1CMD = (uint8)0xF8U;
514 canREG2->IF1NO = 63U;
526 while ((canREG2->IF2STAT & 0x80U) == 0x80U) {
529 canREG2->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
530 canREG2->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U |
531 (uint32)((uint32)((uint32)0U & (uint32)0x1FFFFFFFU) << (uint32)0U);
532 canREG2->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
533 canREG2->IF2CMD = (uint8)0xF8U;
534 canREG2->IF2NO = 64U;
542 while ((canREG2->IF1STAT & 0x80U) == 0x80U) {
544 canREG2->IF1CMD = 0x87U;
552 while ((canREG2->IF2STAT & 0x80U) == 0x80U) {
554 canREG2->IF2CMD = 0x17U;
557 canREG2->CTL &= ~(uint32)(0x00000041U);
642 uint32_t retval = canGetData(pNode, messageBox, (uint8 *)&messageData[0]);
646 CAN_BUFFER_ELEMENT_s can_rxBuffer = {
NULL_PTR, 0u,
CAN_INVALID_TYPE, {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}};
684 static uint32_t counterTicks = 0;
705 .data = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}};
708 unsentMessage.
data[j] = data[j];
742 const uint32_t value1 = resetValue;
749 uint32_t result = value1;
750 uint32_t divisor = value2;
751 uint32_t tempValue = 0u;
753 while (divisor != 0u) {
754 tempValue = result % divisor;
760 resetValue = (value1 / result) * value2;
787 uint32_t currentTime;
808 #if BS_CURRENT_SENSOR_PRESENT == true
813 #if BS_CURRENT_SENSOR_PRESENT == true
865 if (command ==
true) {
877 if (command ==
true) {
889 if (command ==
true) {
967 CAN_BUFFER_ELEMENT_s message = {
NULL_PTR, 0u,
CAN_INVALID_TYPE, {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}};
990 CAN_BUFFER_ELEMENT_s can_rxBuffer = {
NULL_PTR, 0u,
CAN_INVALID_TYPE, {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}};
1007 if (command ==
true) {
1046 #ifdef UNITY_UNIT_TEST
1077 #if BS_CURRENT_SENSOR_PRESENT == true
#define BS_ENERGY_COUNTING_MEASUREMENT_RESPONSE_TIMEOUT_ms
#define BS_NR_OF_STRINGS
Number of parallel strings in the battery pack.
#define BS_COULOMB_COUNTING_MEASUREMENT_RESPONSE_TIMEOUT_ms
#define BS_CURRENT_MEASUREMENT_RESPONSE_TIMEOUT_ms
#define CAN_IF2ARB_EXTENDED_IDENTIFIER_SHIFT
static CAN_NODE_s * CAN_GetNodeConfigurationStructFromRegisterAddress(canBASE_t *pNodeRegister)
get pointer CAN node configuration struct from register address
void TEST_CAN_ValidateConfiguredTxMessagePhase(void)
static void CAN_RxInterrupt(canBASE_t *pNode, uint32 messageBox)
Called in case of CAN RX interrupt.
void TEST_CAN_ConfigureRxMailboxesForExtendedIdentifiers(void)
bool CAN_IsCurrentSensorCcPresent(uint8_t stringNumber)
get flag if CC message from current sensor is received.
void CAN_MainFunction(void)
Calls the functions to drive the CAN interface. Makes the CAN timing checks and sends the periodic me...
static void CAN_ValidateConfiguredTxMessagePeriod(void)
static void CAN_SetCurrentSensorCcPresent(bool command, uint8_t stringNumber)
Sets flag to indicate current sensor sends C-C values.
static STD_RETURN_TYPE_e CAN_PeriodicTransmit(void)
Handles the processing of messages that are meant to be transmitted.
void TEST_CAN_SetCurrentSensorCcPresent(bool command, uint8_t stringNumber)
#define CAN_IF2ARB_USE_EXTENDED_IDENTIFIER
STD_RETURN_TYPE_e TEST_CAN_PeriodicTransmit(void)
static uint32_t can_counterResetValue
void TEST_CAN_TxInterrupt(canBASE_t *pNode, uint32 messageBox)
#define CAN_IF2ARB_SET_TX_DIRECTION
CAN_STATE_s * TEST_CAN_GetCANState(void)
CAN_NODE_s * TEST_CAN_GetNodeConfigurationStructFromRegisterAddress(canBASE_t *pNodeRegister)
uint32_t TEST_CAN_CalculateCounterResetValue(void)
static void CAN_ValidateConfiguredTxMessagePhase(void)
void TEST_CAN_RxInterrupt(canBASE_t *pNode, uint32 messageBox)
bool TEST_CAN_IsMessagePeriodElapsed(uint32_t ticksSinceStart, uint16_t messageIndex)
#define CAN_HAL_RETVAL_NO_DATA_LOST
static void CAN_CheckCanTiming(void)
Checks if the CAN messages come in the specified time window.
#define CAN_IF2ARB_STANDARD_IDENTIFIER_SHIFT
#define CAN_TIMING_LOWER_LIMIT_COUNTS
static void CAN_InitializeTransceiver(void)
void TEST_CAN_SetCurrentSensorPresent(bool command, uint8_t stringNumber)
void UNIT_TEST_WEAK_IMPL canMessageNotification(canBASE_t *node, uint32 messageBox)
bool CAN_IsCurrentSensorEcPresent(uint8_t stringNumber)
get flag if EC message from current sensor is received
void TEST_CAN_CheckDatabaseNullPointer(CAN_SHIM_s canShim)
#define CAN_HIGHEST_MAILBOX_FOR_EXTENDED_IDENTIFIERS
static void CAN_TxInterrupt(canBASE_t *pNode, uint32 messageBox)
Called in case of CAN TX interrupt.
void CAN_SendMessagesFromQueue(void)
Reads messages from TX Queue and sends them via CAN.
void CAN_ReadRxBuffer(void)
Checks the data received per CAN. A receive buffer is used because CAN frames are received in an inte...
bool CAN_IsCurrentSensorPresent(uint8_t stringNumber)
set flag for presence of current sensor.
static void CAN_SetCurrentSensorEcPresent(bool command, uint8_t stringNumber)
Sets flag to indicate current sensor sends C-C values.
#define CAN_TIMING_UPPER_LIMIT_COUNTS
STD_RETURN_TYPE_e CAN_DataSend(CAN_NODE_s *pNode, uint32_t id, CAN_IDENTIFIER_TYPE_e idType, uint8 *pData)
Sends over CAN the data passed in parameters. This function goes over the message boxes and marks the...
static void CAN_CheckCanTimingOfCurrentSensor(void)
#define CAN_IF2ARB_USE_STANDARD_IDENTIFIER
static bool CAN_IsMessagePeriodElapsed(uint32_t ticksSinceStart, uint16_t messageIndex)
Checks if a configured period CAN message should be transmitted depending on the configured message p...
static void CAN_ConfigureRxMailboxesForExtendedIdentifiers(void)
Initialize RX mailboxes for usage with extended identifiers.
static void CAN_CheckDatabaseNullPointer(CAN_SHIM_s canShim)
void TEST_CAN_SetCurrentSensorEcPresent(bool command, uint8_t stringNumber)
void TEST_CAN_InitializeTransceiver(void)
#define CAN_LOWEST_MAILBOX_FOR_EXTENDED_IDENTIFIERS
void TEST_CAN_CheckCanTimingOfCurrentSensor(void)
static void CAN_SetCurrentSensorPresent(bool command, uint8_t stringNumber)
Sets flag to indicate current sensor is present.
void CAN_Initialize(void)
Enables the CAN transceiver.. This function sets th pins to enable the CAN transceiver....
static CAN_STATE_s can_state
FAS_STATIC_ASSERT((CAN_LOWEST_MAILBOX_FOR_EXTENDED_IDENTIFIERS<=CAN_HIGHEST_MAILBOX_FOR_EXTENDED_IDENTIFIERS), "Lower mailbox number must not be greater than higher mailbox number")
void TEST_CAN_ValidateConfiguredTxMessagePeriod(void)
void CAN_EnablePeriodic(bool command)
Enables periodic sending per CAN. This is used to prevent sending uninitialized data per CAN (e....
static uint32_t CAN_CalculateCounterResetValue(void)
Calculate Reset Value for internal counter in CAN_PeriodicTransmit.
void TEST_CAN_CheckCanTiming(void)
Header for the driver for the CAN module.
#define CAN_NR_OF_TX_MESSAGE_BOX
#define CAN_TOTAL_NUMBER_OF_MESSAGE_BOXES
const CAN_SHIM_s can_kShim
const CAN_NODE_s can_node1
const CAN_NODE_s can_node2Isolated
const CAN_RX_MESSAGE_TYPE_s can_rxMessages[]
const uint8_t can_rxMessagesLength
const uint8_t can_txMessagesLength
const CAN_TX_MESSAGE_TYPE_s can_txMessages[]
@ CAN_EXTENDED_IDENTIFIER_29_BIT
@ CAN_STANDARD_IDENTIFIER_11_BIT
Headers for the helper functions for the CAN module.
#define CAN_BYTE_2_POSITION
#define CAN_BYTE_4_POSITION
#define CAN_BYTE_0_POSITION
#define CAN_BYTE_6_POSITION
#define CAN_BYTE_7_POSITION
#define CAN_BYTE_3_POSITION
#define CAN_BYTE_5_POSITION
#define CAN_BYTE_1_POSITION
#define DATA_READ_DATA(...)
@ DATA_BLOCK_ID_ERROR_STATE
@ DATA_BLOCK_ID_STATE_REQUEST
@ DATA_BLOCK_ID_CURRENT_SENSOR
DIAG_RETURNTYPE_e DIAG_Handler(DIAG_ID_e diagId, DIAG_EVENT_e event, DIAG_IMPACT_LEVEL_e impact, uint32_t data)
DIAG_Handler provides generic error handling, based on diagnosis group.
@ DIAG_ID_CAN_CC_RESPONDING
@ DIAG_ID_CURRENT_SENSOR_RESPONDING
@ DIAG_ID_CAN_RX_QUEUE_FULL
@ DIAG_ID_CAN_EC_RESPONDING
@ DIAG_ID_CAN_TX_QUEUE_FULL
#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.
#define NULL_PTR
Null pointer.
Header of task driver implementation.
OS_QUEUE ftsk_canTxUnsentMessagesQueue
volatile bool ftsk_allQueuesCreated
General macros and definitions for the whole platform.
#define GEN_REPEAT_U(x, n)
Macro that helps to generate a series of literals (for array initializers).
#define UNIT_TEST_WEAK_IMPL
OS_STD_RETURN_e OS_ReceiveFromQueue(OS_QUEUE xQueue, void *const pvBuffer, uint32_t ticksToWait)
Receive an item from a queue.
OS_STD_RETURN_e OS_SendToBackOfQueueFromIsr(OS_QUEUE xQueue, const void *const pvItemToQueue, long *const pxHigherPriorityTaskWoken)
Post an item to the back the provided queue during an ISR.
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.
void PEX_SetPin(uint8_t portExpander, uint8_t pin)
sets pin to high.
void PEX_SetPinDirectionOutput(uint8_t portExpander, uint8_t pin)
sets pin to input.
Header for the driver for the NXP PCA9539 port expander module.
#define PEX_PORT_EXPANDER2
uint8_t data[CAN_MAX_DLC]
CAN_IDENTIFIER_TYPE_e idType
CAN_IDENTIFIER_TYPE_e idType
canBASE_t * canNodeRegister
CAN_RxCallbackFunction_f callbackFunction
CAN_MESSAGE_PROPERTIES_s message
DATA_BLOCK_ERROR_STATE_s * pTableErrorState
DATA_BLOCK_CELL_VOLTAGE_s * pTableCellVoltage
DATA_BLOCK_STATE_REQUEST_s * pTableStateRequest
DATA_BLOCK_PACK_VALUES_s * pTablePackValues
DATA_BLOCK_RSL_FLAG_s * pTableRsl
DATA_BLOCK_SOE_s * pTableSoe
DATA_BLOCK_CURRENT_SENSOR_s * pTableCurrentSensor
DATA_BLOCK_CELL_TEMPERATURE_s * pTableCellTemperature
DATA_BLOCK_MSL_FLAG_s * pTableMsl
DATA_BLOCK_MOL_FLAG_s * pTableMol
DATA_BLOCK_MIN_MAX_s * pTableMinMax
DATA_BLOCK_SOH_s * pTableSoh
DATA_BLOCK_OPEN_WIRE_s * pTableOpenWire
DATA_BLOCK_INSULATION_MONITORING_s * pTableInsulation
DATA_BLOCK_SOC_s * pTableSoc
DATA_BLOCK_SOF_s * pTableSof
bool currentSensorCCPresent[BS_NR_OF_STRINGS]
bool currentSensorECPresent[BS_NR_OF_STRINGS]
bool currentSensorPresent[BS_NR_OF_STRINGS]
CAN_TxCallbackFunction_f callbackFunction
CAN_MESSAGE_PROPERTIES_s message
CAN_TX_MESSAGE_TIMING_s timing
uint32_t timestampCurrent[BS_NR_OF_STRINGS]
DATA_BLOCK_HEADER_s header
uint32_t timestampEnergyCounting[BS_NR_OF_STRINGS]
uint32_t timestampCurrentCounting[BS_NR_OF_STRINGS]
DATA_BLOCK_HEADER_s header
DATA_BLOCK_HEADER_s header