foxBMS - Unit Tests  1.2.1
The foxBMS Unit Tests API Documentation
can.c File Reference

Driver for the CAN module. More...

#include "can.h"
#include "version_cfg.h"
#include "HL_het.h"
#include "HL_reg_system.h"
#include "bender_iso165c.h"
#include "can_helper.h"
#include "database.h"
#include "diag.h"
#include "foxmath.h"
#include "ftask.h"
#include "pex.h"
Include dependency graph for can.c:

Go to the source code of this file.

Macros

#define CAN_TIMING_LOWER_LIMIT_COUNTS   (95u)
 
#define CAN_TIMING_UPPER_LIMIT_COUNTS   (105u)
 
#define CAN_BOOT_MESSAGE_MAXIMUM_RELEASE_DISTANCE   (31u)
 
#define CAN_BOOT_MESSAGE_BYTE_3_BIT_VERSION_CONTROL   (0u)
 
#define CAN_BOOT_MESSAGE_BYTE_3_BIT_DIRTY_FLAG   (1u)
 
#define CAN_BOOT_MESSAGE_BYTE_3_BIT_DISTANCE_OVERFLOW_FLAG   (2u)
 
#define CAN_BOOT_MESSAGE_BYTE_3_BIT_DISTANCE_COUNTER   (3u)
 
#define CAN_HAL_RETVAL_NO_DATA_LOST   (1u)
 

Functions

static void CAN_TxInterrupt (canBASE_t *pNode, uint32 messageBox)
 Called in case of CAN TX interrupt. More...
 
static void CAN_RxInterrupt (canBASE_t *pNode, uint32 messageBox)
 Called in case of CAN RX interrupt. More...
 
static STD_RETURN_TYPE_e CAN_PeriodicTransmit (void)
 Handles the processing of messages that are meant to be transmitted. This function looks for the repetition times and the repetition phase of messages that are intended to be sent periodically. If a comparison with an internal counter (i.e., the counter how often this function has been called) states that a transmit is pending, the message is composed by call of CANS_ComposeMessage and transferred to the buffer of the CAN module. If a callback function is declared in configuration, this callback is called after successful transmission. More...
 
static void CAN_CheckCanTiming (void)
 Checks if the CAN messages come in the specified time window If the (current time stamp) - (previous time stamp) > 96ms and < 104ms, the check is true, false otherwise. The result is reported via flags in the DIAG module. More...
 
static void CAN_SetCurrentSensorPresent (bool command, uint8_t stringNumber)
 Sets flag to indicate current sensor is present. More...
 
static void CAN_SetCurrentSensorCcPresent (bool command, uint8_t stringNumber)
 Sets flag to indicate current sensor sends C-C values. More...
 
static void CAN_SetCurrentSensorEcPresent (bool command, uint8_t stringNumber)
 Sets flag to indicate current sensor sends C-C values. More...
 
static void CAN_InitializeTransceiver (void)
 
void CAN_Initialize (void)
 Enables the CAN transceiver.. This function sets th pins to enable the CAN transceiver. It must be called before using the CAN interface. More...
 
STD_RETURN_TYPE_e CAN_DataSend (canBASE_t *pNode, uint32_t id, uint8 *pData)
 Sends over CAN the data passed in parameters. This function goes over the messageboxes and marks the ones that should be sent. More...
 
void CAN_MainFunction (void)
 Calls the functions to drive the CAN interface. Makes the CAN timing checks and sends the periodic messages. More...
 
void CAN_ReadRxBuffer (void)
 Checks the data received per CAN. A receive buffer is used because CAN frames are received in an interrupt routine. The TMS570LC4357 does not allow nested interrupts, so interrupts are deactivated during receive. Calls to the database do not work when interrupts are disabled. Receive callbacks are made within this function: as it is not called during an interrupt routine, calls to the database can be made. More...
 
void CAN_EnablePeriodic (bool command)
 enable/disable the periodic transmit/receive. More...
 
bool CAN_IsCurrentSensorPresent (uint8_t stringNumber)
 set flag for presence of current sensor. More...
 
bool CAN_IsCurrentSensorCcPresent (uint8_t stringNumber)
 get flag if CC message from current sensor is received. More...
 
bool CAN_IsCurrentSensorEcPresent (uint8_t stringNumber)
 get flag if EC message from current sensor is received More...
 
void UNIT_TEST_WEAK_IMPL canMessageNotification (canBASE_t *node, uint32 messageBox)
 
STD_RETURN_TYPE_e CAN_TransmitBootMessage (void)
 Transmit startup boot message. More...
 
CAN_STATE_sTEST_CAN_GetCANState (void)
 

Variables

static CAN_STATE_s can_state
 

Detailed Description

Driver for the CAN module.

SPDX-License-Identifier: BSD-3-Clause

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

We kindly request you to use one or more of the following phrases to refer to foxBMS in your hardware, software, documentation or advertising materials:

  • ″This product uses parts of foxBMS®″
  • ″This product includes parts of foxBMS®″
  • ″This product is derived from foxBMS®″
Author
foxBMS Team
Date
2019-12-04 (date of creation)
Updated
2021-12-08 (date of last update)
Prefix
CAN

Implementation of the CAN Interrupts, initialization, buffers, receive and transmit interfaces.

Definition in file can.c.

Macro Definition Documentation

◆ CAN_BOOT_MESSAGE_BYTE_3_BIT_DIRTY_FLAG

#define CAN_BOOT_MESSAGE_BYTE_3_BIT_DIRTY_FLAG   (1u)

bit position of boot message byte 3 dirty flag

Definition at line 89 of file can.c.

◆ CAN_BOOT_MESSAGE_BYTE_3_BIT_DISTANCE_COUNTER

#define CAN_BOOT_MESSAGE_BYTE_3_BIT_DISTANCE_COUNTER   (3u)

bit position of boot message byte 3 release distance counter

Definition at line 95 of file can.c.

◆ CAN_BOOT_MESSAGE_BYTE_3_BIT_DISTANCE_OVERFLOW_FLAG

#define CAN_BOOT_MESSAGE_BYTE_3_BIT_DISTANCE_OVERFLOW_FLAG   (2u)

bit position of boot message byte 3 release distance overflow flag

Definition at line 92 of file can.c.

◆ CAN_BOOT_MESSAGE_BYTE_3_BIT_VERSION_CONTROL

#define CAN_BOOT_MESSAGE_BYTE_3_BIT_VERSION_CONTROL   (0u)

bit position of boot message byte 3 version control flag

Definition at line 86 of file can.c.

◆ CAN_BOOT_MESSAGE_MAXIMUM_RELEASE_DISTANCE

#define CAN_BOOT_MESSAGE_MAXIMUM_RELEASE_DISTANCE   (31u)

maximum distance from release that can be encoded in the boot message

Definition at line 80 of file can.c.

◆ CAN_HAL_RETVAL_NO_DATA_LOST

#define CAN_HAL_RETVAL_NO_DATA_LOST   (1u)

return value of function canGetData if no data was lost during reception

Definition at line 98 of file can.c.

◆ CAN_TIMING_LOWER_LIMIT_COUNTS

#define CAN_TIMING_LOWER_LIMIT_COUNTS   (95u)

lower limit of timestamp counts for a valid CAN timing

Definition at line 74 of file can.c.

◆ CAN_TIMING_UPPER_LIMIT_COUNTS

#define CAN_TIMING_UPPER_LIMIT_COUNTS   (105u)

upper limit of timestamp counts for a valid CAN timing

Definition at line 77 of file can.c.

Function Documentation

◆ CAN_CheckCanTiming()

static void CAN_CheckCanTiming ( void  )
static

Checks if the CAN messages come in the specified time window If the (current time stamp) - (previous time stamp) > 96ms and < 104ms, the check is true, false otherwise. The result is reported via flags in the DIAG module.

Definition at line 267 of file can.c.

Here is the call graph for this function:

◆ CAN_DataSend()

STD_RETURN_TYPE_e CAN_DataSend ( canBASE_t *  pNode,
uint32_t  id,
uint8 *  pData 
)

Sends over CAN the data passed in parameters. This function goes over the messageboxes and marks the ones that should be sent.

Parameters
[in,out]pNodeCAN interface to use
[in]idID of message to send
[out]pDatadata to send (8 bytes)
Returns
STD_OK if a message box was free to send, STD_NOT_OK otherwise

Parse all TX message boxes until we find a free one, then use it to send the CAN message. In the HAL, message box numbers start from 1, not 0.

Definition at line 205 of file can.c.

◆ CAN_EnablePeriodic()

void CAN_EnablePeriodic ( bool  command)

enable/disable the periodic transmit/receive.

Enables periodic sending per CAN. This is used to prevent sending uninitialized data per CAN (e.g., before the first LTC measurement cycle was completed).

Definition at line 367 of file can.c.

◆ CAN_Initialize()

void CAN_Initialize ( void  )

Enables the CAN transceiver.. This function sets th pins to enable the CAN transceiver. It must be called before using the CAN interface.

Definition at line 201 of file can.c.

Here is the call graph for this function:

◆ CAN_InitializeTransceiver()

static void CAN_InitializeTransceiver ( void  )
static

initialize the SPI interface to the CAN transceiver

Initialize transceiver for CAN1

Initialize transceiver for CAN2

Definition at line 185 of file can.c.

Here is the call graph for this function:

◆ CAN_IsCurrentSensorCcPresent()

bool CAN_IsCurrentSensorCcPresent ( uint8_t  stringNumber)

get flag if CC message from current sensor is received.

Parameters
stringNumberaddressed string
Returns
true if CC message is being received, false otherwise

Definition at line 418 of file can.c.

◆ CAN_IsCurrentSensorEcPresent()

bool CAN_IsCurrentSensorEcPresent ( uint8_t  stringNumber)

get flag if EC message from current sensor is received

Parameters
stringNumberaddressed string
Returns
true if EC message is being received, false otherwise

Definition at line 423 of file can.c.

◆ CAN_IsCurrentSensorPresent()

bool CAN_IsCurrentSensorPresent ( uint8_t  stringNumber)

set flag for presence of current sensor.

Returns
retval true if a current sensor is present, false otherwise

Definition at line 413 of file can.c.

◆ CAN_MainFunction()

void CAN_MainFunction ( void  )

Calls the functions to drive the CAN interface. Makes the CAN timing checks and sends the periodic messages.

Definition at line 232 of file can.c.

Here is the call graph for this function:

◆ CAN_PeriodicTransmit()

static STD_RETURN_TYPE_e CAN_PeriodicTransmit ( void  )
static

Handles the processing of messages that are meant to be transmitted. This function looks for the repetition times and the repetition phase of messages that are intended to be sent periodically. If a comparison with an internal counter (i.e., the counter how often this function has been called) states that a transmit is pending, the message is composed by call of CANS_ComposeMessage and transferred to the buffer of the CAN module. If a callback function is declared in configuration, this callback is called after successful transmission.

Returns
STD_OK if a CAN transfer was made, STD_NOT_OK otherwise

Definition at line 239 of file can.c.

Here is the call graph for this function:

◆ CAN_ReadRxBuffer()

void CAN_ReadRxBuffer ( void  )

Checks the data received per CAN. A receive buffer is used because CAN frames are received in an interrupt routine. The TMS570LC4357 does not allow nested interrupts, so interrupts are deactivated during receive. Calls to the database do not work when interrupts are disabled. Receive callbacks are made within this function: as it is not called during an interrupt routine, calls to the database can be made.

Definition at line 342 of file can.c.

Here is the call graph for this function:

◆ CAN_RxInterrupt()

static void CAN_RxInterrupt ( canBASE_t *  pNode,
uint32  messageBox 
)
static

Called in case of CAN RX interrupt.

Parameters
pNodeCAN interface on which message was received
messageBoxmessage box on which message was received

Read even if queues are not created, otherwise message boxes get full. Possible return values:

  • 0: no new data
  • 1: no data lost
  • 3: data lost

Definition at line 431 of file can.c.

Here is the call graph for this function:

◆ CAN_SetCurrentSensorCcPresent()

static void CAN_SetCurrentSensorCcPresent ( bool  command,
uint8_t  stringNumber 
)
static

Sets flag to indicate current sensor sends C-C values.

Parameters
commandtrue if coulomb counting message detected, otherwise false
stringNumberstring addressed
Returns
none

Definition at line 388 of file can.c.

Here is the call graph for this function:

◆ CAN_SetCurrentSensorEcPresent()

static void CAN_SetCurrentSensorEcPresent ( bool  command,
uint8_t  stringNumber 
)
static

Sets flag to indicate current sensor sends C-C values.

Parameters
commandtrue if energy counting message detected, otherwise false
stringNumberstring addressed
Returns
none

Definition at line 400 of file can.c.

Here is the call graph for this function:

◆ CAN_SetCurrentSensorPresent()

static void CAN_SetCurrentSensorPresent ( bool  command,
uint8_t  stringNumber 
)
static

Sets flag to indicate current sensor is present.

Parameters
commandtrue if current sensor present, otherwise false
stringNumberstring addressed
Returns
none

Definition at line 376 of file can.c.

Here is the call graph for this function:

◆ CAN_TransmitBootMessage()

STD_RETURN_TYPE_e CAN_TransmitBootMessage ( void  )

Transmit startup boot message.

Returns
STD_OK if transmission successful, otherweise STD_NOT_OK

Definition at line 481 of file can.c.

Here is the call graph for this function:

◆ CAN_TxInterrupt()

static void CAN_TxInterrupt ( canBASE_t *  pNode,
uint32  messageBox 
)
static

Called in case of CAN TX interrupt.

Parameters
pNodeCAN interface on which message was sent
messageBoxmessage box on which message was sent

Definition at line 428 of file can.c.

◆ canMessageNotification()

void UNIT_TEST_WEAK_IMPL canMessageNotification ( canBASE_t *  node,
uint32  messageBox 
)

called in case of CAN interrupt, defined as weak in HAL

Definition at line 473 of file can.c.

Here is the call graph for this function:

◆ TEST_CAN_GetCANState()

CAN_STATE_s* TEST_CAN_GetCANState ( void  )

Definition at line 531 of file can.c.

Variable Documentation

◆ can_state

CAN_STATE_s can_state
static
Initial value:
= {
.periodicEnable = false,
.currentSensorPresent = {REPEAT_U(false, STRIP(BS_NR_OF_STRINGS))},
.currentSensorCCPresent = {REPEAT_U(false, STRIP(BS_NR_OF_STRINGS))},
.currentSensorECPresent = {REPEAT_U(false, STRIP(BS_NR_OF_STRINGS))},
}
#define BS_NR_OF_STRINGS
#define STRIP(x)
Definition: general.h:274
#define REPEAT_U(x, n)
Macro that helps to generate a series of literals (for array initializers).
Definition: general.h:262

tracks the local state of the can module

Definition at line 103 of file can.c.