Hardware Abstraction Layer for FreeRTOS
Collaboration diagram for CAN Subsystem:

Data Structures

struct  can_filter
 
struct  can_msg
 
struct  can_generic
 

Macros

#define CAN_MAX_LENGTH   8
 
#define CAN_EFF_FLAG   BIT(31) /* EFF/SFF is set in the MSB */
 
#define CAN_RTR_FLAG   BIT(30) /* remote transmission request */
 
#define CAN_SFF_MASK   0x000007FFUL /* standard frame format (SFF) */
 
#define CAN_EFF_MASK   0x1FFFFFFFUL /* extended frame format (EFF) */
 
#define CAN_ERR_CRTL   BIT64(0)
 
#define CAN_ERR_CTRL_OFFSET   0
 
#define CAN_ERR_CRTL_UNSPEC   BIT64(CAN_ERR_CTRL_OFFSET + 0)
 
#define CAN_ERR_CRTL_RX_OVERFLOW   BIT64(CAN_ERR_CTRL_OFFSET + 1)
 
#define CAN_ERR_CRTL_TX_OVERFLOW   BIT64(CAN_ERR_CTRL_OFFSET + 2)
 
#define CAN_ERR_CRTL_RX_WARNING   BIT64(CAN_ERR_CTRL_OFFSET + 3)
 
#define CAN_ERR_CRTL_TX_WARNING   BIT64(CAN_ERR_CTRL_OFFSET + 4)
 
#define CAN_ERR_CRTL_RX_PASSIVE   BIT64(CAN_ERR_CTRL_OFFSET + 5)
 
#define CAN_ERR_CRTL_TX_PASSIVE   BIT64(CAN_ERR_CTRL_OFFSET + 6)
 
#define CAN_ERR_CRTL_ACTIVE   BIT64(CAN_ERR_CTRL_OFFSET + 7)
 
#define CAN_ERR_PROT   BIT64(1)
 
#define CAN_ERR_PROT_OFFSET   8
 
#define CAN_ERR_PROT_UNSPEC   BIT64(CAN_ERR_PROT_OFFSET + 0)
 
#define CAN_ERR_PROT_BIT   BIT64(CAN_ERR_PROT_OFFSET + 1)
 
#define CAN_ERR_PROT_FORM   BIT64(CAN_ERR_PROT_OFFSET + 2)
 
#define CAN_ERR_PROT_STUFF   BIT64(CAN_ERR_PROT_OFFSET + 3)
 
#define CAN_ERR_PROT_BIT0   BIT64(CAN_ERR_PROT_OFFSET + 4)
 
#define CAN_ERR_PROT_BIT1   BIT64(CAN_ERR_PROT_OFFSET + 5)
 
#define CAN_ERR_PROT_OVERLOAD   BIT64(CAN_ERR_PROT_OFFSET + 6)
 
#define CAN_ERR_PROT_ACTIVE   BIT64(CAN_ERR_PROT_OFFSET + 7)
 
#define CAN_ERR_PROT_TX   BIT64(CAN_ERR_PROT_OFFSET + 8)
 
#define CAN_ERR_PROT_LOC_OFFSET   24
 
#define CAN_ERR_PROT_LOC_UNSPEC   BIT64(CAN_ERR_PROT_LOC_OFFSET + 0)
 
#define CAN_ERR_PROT_LOC_SOF   BIT64(CAN_ERR_PROT_LOC_OFFSET + 1)
 
#define CAN_ERR_PROT_LOC_ID28_21   BIT64(CAN_ERR_PROT_LOC_OFFSET + 2)
 
#define CAN_ERR_PROT_LOC_ID20_18   BIT64(CAN_ERR_PROT_LOC_OFFSET + 3)
 
#define CAN_ERR_PROT_LOC_SRTR   BIT64(CAN_ERR_PROT_LOC_OFFSET + 4)
 
#define CAN_ERR_PROT_LOC_IDE   BIT64(CAN_ERR_PROT_LOC_OFFSET + 5)
 
#define CAN_ERR_PROT_LOC_ID17_13   BIT64(CAN_ERR_PROT_LOC_OFFSET + 6)
 
#define CAN_ERR_PROT_LOC_ID12_05   BIT64(CAN_ERR_PROT_LOC_OFFSET + 7)
 
#define CAN_ERR_PROT_LOC_ID04_00   BIT64(CAN_ERR_PROT_LOC_OFFSET + 8)
 
#define CAN_ERR_PROT_LOC_RTR   BIT64(CAN_ERR_PROT_LOC_OFFSET + 9)
 
#define CAN_ERR_PROT_LOC_RES1   BIT64(CAN_ERR_PROT_LOC_OFFSET + 10)
 
#define CAN_ERR_PROT_LOC_RES0   BIT64(CAN_ERR_PROT_LOC_OFFSET + 11)
 
#define CAN_ERR_PROT_LOC_DLC   BIT64(CAN_ERR_PROT_LOC_OFFSET + 12)
 
#define CAN_ERR_PROT_LOC_DATA   BIT64(CAN_ERR_PROT_LOC_OFFSET + 13)
 
#define CAN_ERR_PROT_LOC_CRC_SEQ   BIT64(CAN_ERR_PROT_LOC_OFFSET + 14)
 
#define CAN_ERR_PROT_LOC_CRC_DEL   BIT64(CAN_ERR_PROT_LOC_OFFSET + 15)
 
#define CAN_ERR_PROT_LOC_ACK   BIT64(CAN_ERR_PROT_LOC_OFFSET + 16)
 
#define CAN_ERR_PROT_LOC_ACK_DEL   BIT64(CAN_ERR_PROT_LOC_OFFSET + 17)
 
#define CAN_ERR_PROT_LOC_EOF   BIT64(CAN_ERR_PROT_LOC_OFFSET + 18)
 
#define CAN_ERR_PROT_LOC_INTERM   BIT64(CAN_ERR_PROT_LOC_OFFSET + 19)
 
#define CAN_ERR_TRX   BIT64(2)
 
#define CAN_ERR_TRX_OFFSET   48
 
#define CAN_ERR_TRX_UNSPEC   BIT64(CAN_ERR_TRX_OFFSET + 0)
 
#define CAN_ERR_TRX_CANH_NO_WIRE   BIT64(CAN_ERR_TRX_OFFSET + 1)
 
#define CAN_ERR_TRX_CANH_SHORT_TO_BAT   BIT64(CAN_ERR_TRX_OFFSET + 2)
 
#define CAN_ERR_TRX_CANH_SHORT_TO_VCC   BIT64(CAN_ERR_TRX_OFFSET + 3)
 
#define CAN_ERR_TRX_CANH_SHORT_TO_GND   BIT64(CAN_ERR_TRX_OFFSET + 4)
 
#define CAN_ERR_TRX_CANL_NO_WIRE   BIT64(CAN_ERR_TRX_OFFSET + 5)
 
#define CAN_ERR_TRX_CANL_SHORT_TO_BAT   BIT64(CAN_ERR_TRX_OFFSET + 6)
 
#define CAN_ERR_TRX_CANL_SHORT_TO_VCC   BIT64(CAN_ERR_TRX_OFFSET + 7)
 
#define CAN_ERR_TRX_CANL_SHORT_TO_GND   BIT64(CAN_ERR_TRX_OFFSET + 8)
 
#define CAN_ERR_TRX_CANL_SHORT_TO_CANH   BIT64(CAN_ERR_TRX_OFFSET + 9)
 
#define CAN_ERR_ACK   BIT64(3)
 
#define CAN_ERR_BUSOFF   BIT64(4)
 
#define CAN_ERR_BUSERROR   BIT64(5)
 
#define CAN_ERR_RESTARTED   BIT64(6)
 

Typedefs

typedef uint32_t can_error_t
 
typedef uint64_t can_errorData_t
 

Functions

struct can * can_init (uint32_t index, uint32_t bitrate, struct gpio_pin *pin, bool pinHigh, bool(*callback)(struct can *can, can_error_t error, can_errorData_t data, void *userData), void *data)
 
int32_t can_deinit (struct can *can)
 
int32_t can_setCallback (struct can *can, int32_t filterID, bool(*callback)(struct can *can, struct can_msg *msg, void *data), void *data)
 
int32_t can_registerFilter (struct can *can, struct can_filter *filter)
 
int32_t can_deregisterFilter (struct can *can, int32_t filterID)
 
int32_t can_send (struct can *can, struct can_msg *msg, TickType_t waittime)
 
int32_t can_recv (struct can *can, int32_t filterID, struct can_msg *msg, TickType_t waittime)
 
int32_t can_sendISR (struct can *can, struct can_msg *msg)
 
int32_t can_recvISR (struct can *can, int32_t filterID, struct can_msg *msg)
 
int32_t can_up (struct can *can)
 
int32_t can_down (struct can *can)
 

Detailed Description

#include <can.h>

This is the CAN Subsystem for controlling CAN of a SOC.

Macro Definition Documentation

◆ CAN_EFF_FLAG

#define CAN_EFF_FLAG   BIT(31) /* EFF/SFF is set in the MSB */

◆ CAN_EFF_MASK

#define CAN_EFF_MASK   0x1FFFFFFFUL /* extended frame format (EFF) */

◆ CAN_ERR_ACK

#define CAN_ERR_ACK   BIT64(3)

received no ACK on transmission

◆ CAN_ERR_BUSERROR

#define CAN_ERR_BUSERROR   BIT64(5)

bus error (may flood!)

◆ CAN_ERR_BUSOFF

#define CAN_ERR_BUSOFF   BIT64(4)

bus off

◆ CAN_ERR_CRTL

#define CAN_ERR_CRTL   BIT64(0)

controller problems

◆ CAN_ERR_CRTL_ACTIVE

#define CAN_ERR_CRTL_ACTIVE   BIT64(CAN_ERR_CTRL_OFFSET + 7)

recovered to error active state (one error counter is under a the protocol-defined level of 127)

◆ CAN_ERR_CRTL_RX_OVERFLOW

#define CAN_ERR_CRTL_RX_OVERFLOW   BIT64(CAN_ERR_CTRL_OFFSET + 1)

RX buffer overflow

◆ CAN_ERR_CRTL_RX_PASSIVE

#define CAN_ERR_CRTL_RX_PASSIVE   BIT64(CAN_ERR_CTRL_OFFSET + 5)

reached error passive status RX

◆ CAN_ERR_CRTL_RX_WARNING

#define CAN_ERR_CRTL_RX_WARNING   BIT64(CAN_ERR_CTRL_OFFSET + 3)

reached warning level for RX errors

◆ CAN_ERR_CRTL_TX_OVERFLOW

#define CAN_ERR_CRTL_TX_OVERFLOW   BIT64(CAN_ERR_CTRL_OFFSET + 2)

TX buffer overflow

◆ CAN_ERR_CRTL_TX_PASSIVE

#define CAN_ERR_CRTL_TX_PASSIVE   BIT64(CAN_ERR_CTRL_OFFSET + 6)

reached error passive status TX (at least one error counter exceeds the protocol-defined level of 127)

◆ CAN_ERR_CRTL_TX_WARNING

#define CAN_ERR_CRTL_TX_WARNING   BIT64(CAN_ERR_CTRL_OFFSET + 4)

◆ CAN_ERR_CRTL_UNSPEC

#define CAN_ERR_CRTL_UNSPEC   BIT64(CAN_ERR_CTRL_OFFSET + 0)

unspecified controller protocol

◆ CAN_ERR_CTRL_OFFSET

#define CAN_ERR_CTRL_OFFSET   0

◆ CAN_ERR_PROT

#define CAN_ERR_PROT   BIT64(1)

protocol violations

◆ CAN_ERR_PROT_ACTIVE

#define CAN_ERR_PROT_ACTIVE   BIT64(CAN_ERR_PROT_OFFSET + 7)

Active error announcement

◆ CAN_ERR_PROT_BIT

#define CAN_ERR_PROT_BIT   BIT64(CAN_ERR_PROT_OFFSET + 1)

Single bit error

◆ CAN_ERR_PROT_BIT0

#define CAN_ERR_PROT_BIT0   BIT64(CAN_ERR_PROT_OFFSET + 4)

Unable to send dominant bit

◆ CAN_ERR_PROT_BIT1

#define CAN_ERR_PROT_BIT1   BIT64(CAN_ERR_PROT_OFFSET + 5)

Unable to send recessive bit

◆ CAN_ERR_PROT_FORM

#define CAN_ERR_PROT_FORM   BIT64(CAN_ERR_PROT_OFFSET + 2)

frame format error

◆ CAN_ERR_PROT_LOC_ACK

#define CAN_ERR_PROT_LOC_ACK   BIT64(CAN_ERR_PROT_LOC_OFFSET + 16)

Error in CAN protocol at ACK slot

◆ CAN_ERR_PROT_LOC_ACK_DEL

#define CAN_ERR_PROT_LOC_ACK_DEL   BIT64(CAN_ERR_PROT_LOC_OFFSET + 17)

Error in CAN protocol at ACK delimiter

◆ CAN_ERR_PROT_LOC_CRC_DEL

#define CAN_ERR_PROT_LOC_CRC_DEL   BIT64(CAN_ERR_PROT_LOC_OFFSET + 15)

Error in CAN protocol at CRC delimiter

◆ CAN_ERR_PROT_LOC_CRC_SEQ

#define CAN_ERR_PROT_LOC_CRC_SEQ   BIT64(CAN_ERR_PROT_LOC_OFFSET + 14)

Error in CAN protocol at CRC sequence

◆ CAN_ERR_PROT_LOC_DATA

#define CAN_ERR_PROT_LOC_DATA   BIT64(CAN_ERR_PROT_LOC_OFFSET + 13)

Error in CAN protocol at data section

◆ CAN_ERR_PROT_LOC_DLC

#define CAN_ERR_PROT_LOC_DLC   BIT64(CAN_ERR_PROT_LOC_OFFSET + 12)

Error in CAN protocol at data length code

◆ CAN_ERR_PROT_LOC_EOF

#define CAN_ERR_PROT_LOC_EOF   BIT64(CAN_ERR_PROT_LOC_OFFSET + 18)

Error in CAN protocol at end of frame

◆ CAN_ERR_PROT_LOC_ID04_00

#define CAN_ERR_PROT_LOC_ID04_00   BIT64(CAN_ERR_PROT_LOC_OFFSET + 8)

Error in CAN protocol at ID bits 4-0

◆ CAN_ERR_PROT_LOC_ID12_05

#define CAN_ERR_PROT_LOC_ID12_05   BIT64(CAN_ERR_PROT_LOC_OFFSET + 7)

Error in CAN protocol at ID bits 12-5

◆ CAN_ERR_PROT_LOC_ID17_13

#define CAN_ERR_PROT_LOC_ID17_13   BIT64(CAN_ERR_PROT_LOC_OFFSET + 6)

Error in CAN protocol at ID bits 17-13

◆ CAN_ERR_PROT_LOC_ID20_18

#define CAN_ERR_PROT_LOC_ID20_18   BIT64(CAN_ERR_PROT_LOC_OFFSET + 3)

Error in CAN protocol at ID bits 20 - 18 (SFF: 2 - 0)

◆ CAN_ERR_PROT_LOC_ID28_21

#define CAN_ERR_PROT_LOC_ID28_21   BIT64(CAN_ERR_PROT_LOC_OFFSET + 2)

Error in CAN protocol at ID bits 28 - 21 (SFF: 10 - 3)

◆ CAN_ERR_PROT_LOC_IDE

#define CAN_ERR_PROT_LOC_IDE   BIT64(CAN_ERR_PROT_LOC_OFFSET + 5)

Error in CAN protocol at Identifier extension

◆ CAN_ERR_PROT_LOC_INTERM

#define CAN_ERR_PROT_LOC_INTERM   BIT64(CAN_ERR_PROT_LOC_OFFSET + 19)

Error in CAN protocol at intermission

◆ CAN_ERR_PROT_LOC_OFFSET

#define CAN_ERR_PROT_LOC_OFFSET   24

◆ CAN_ERR_PROT_LOC_RES0

#define CAN_ERR_PROT_LOC_RES0   BIT64(CAN_ERR_PROT_LOC_OFFSET + 11)

Error in CAN protocol at reserved bit 0

◆ CAN_ERR_PROT_LOC_RES1

#define CAN_ERR_PROT_LOC_RES1   BIT64(CAN_ERR_PROT_LOC_OFFSET + 10)

Error in CAN protocol at reserved bit 1

◆ CAN_ERR_PROT_LOC_RTR

#define CAN_ERR_PROT_LOC_RTR   BIT64(CAN_ERR_PROT_LOC_OFFSET + 9)

Error in CAN protocol at RTR

◆ CAN_ERR_PROT_LOC_SOF

#define CAN_ERR_PROT_LOC_SOF   BIT64(CAN_ERR_PROT_LOC_OFFSET + 1)

Error in CAN protocol at Start of frame

◆ CAN_ERR_PROT_LOC_SRTR

#define CAN_ERR_PROT_LOC_SRTR   BIT64(CAN_ERR_PROT_LOC_OFFSET + 4)

Error in CAN protocol at Substitute RTR (SFF: RTR)

◆ CAN_ERR_PROT_LOC_UNSPEC

#define CAN_ERR_PROT_LOC_UNSPEC   BIT64(CAN_ERR_PROT_LOC_OFFSET + 0)

Unspecified error in CAN protocol (location)

◆ CAN_ERR_PROT_OFFSET

#define CAN_ERR_PROT_OFFSET   8

◆ CAN_ERR_PROT_OVERLOAD

#define CAN_ERR_PROT_OVERLOAD   BIT64(CAN_ERR_PROT_OFFSET + 6)

Bus overload

◆ CAN_ERR_PROT_STUFF

#define CAN_ERR_PROT_STUFF   BIT64(CAN_ERR_PROT_OFFSET + 3)

Bit stuffing error

◆ CAN_ERR_PROT_TX

#define CAN_ERR_PROT_TX   BIT64(CAN_ERR_PROT_OFFSET + 8)

Error occurred on transmission

◆ CAN_ERR_PROT_UNSPEC

#define CAN_ERR_PROT_UNSPEC   BIT64(CAN_ERR_PROT_OFFSET + 0)

Unspecified protocol violations

◆ CAN_ERR_RESTARTED

#define CAN_ERR_RESTARTED   BIT64(6)

controller restarted

◆ CAN_ERR_TRX

#define CAN_ERR_TRX   BIT64(2)

transceiver status

◆ CAN_ERR_TRX_CANH_NO_WIRE

#define CAN_ERR_TRX_CANH_NO_WIRE   BIT64(CAN_ERR_TRX_OFFSET + 1)

No Wire at CAN High

◆ CAN_ERR_TRX_CANH_SHORT_TO_BAT

#define CAN_ERR_TRX_CANH_SHORT_TO_BAT   BIT64(CAN_ERR_TRX_OFFSET + 2)

CAN High is short to Bat

◆ CAN_ERR_TRX_CANH_SHORT_TO_GND

#define CAN_ERR_TRX_CANH_SHORT_TO_GND   BIT64(CAN_ERR_TRX_OFFSET + 4)

CAN High is short to GND

◆ CAN_ERR_TRX_CANH_SHORT_TO_VCC

#define CAN_ERR_TRX_CANH_SHORT_TO_VCC   BIT64(CAN_ERR_TRX_OFFSET + 3)

CAN High is short to VCC

◆ CAN_ERR_TRX_CANL_NO_WIRE

#define CAN_ERR_TRX_CANL_NO_WIRE   BIT64(CAN_ERR_TRX_OFFSET + 5)

No Wire at CAN Low

◆ CAN_ERR_TRX_CANL_SHORT_TO_BAT

#define CAN_ERR_TRX_CANL_SHORT_TO_BAT   BIT64(CAN_ERR_TRX_OFFSET + 6)

CAN Low is short to Bat

◆ CAN_ERR_TRX_CANL_SHORT_TO_CANH

#define CAN_ERR_TRX_CANL_SHORT_TO_CANH   BIT64(CAN_ERR_TRX_OFFSET + 9)

CAN Low is short to CAN High

◆ CAN_ERR_TRX_CANL_SHORT_TO_GND

#define CAN_ERR_TRX_CANL_SHORT_TO_GND   BIT64(CAN_ERR_TRX_OFFSET + 8)

CAN Low is short to GND

◆ CAN_ERR_TRX_CANL_SHORT_TO_VCC

#define CAN_ERR_TRX_CANL_SHORT_TO_VCC   BIT64(CAN_ERR_TRX_OFFSET + 7)

CAN Low is short to VCC

◆ CAN_ERR_TRX_OFFSET

#define CAN_ERR_TRX_OFFSET   48

◆ CAN_ERR_TRX_UNSPEC

#define CAN_ERR_TRX_UNSPEC   BIT64(CAN_ERR_TRX_OFFSET + 0)

Transiver Status Error is unspecified

◆ CAN_MAX_LENGTH

#define CAN_MAX_LENGTH   8

MAX CAN length 8 or 64 if CAN_FD

◆ CAN_RTR_FLAG

#define CAN_RTR_FLAG   BIT(30) /* remote transmission request */

◆ CAN_SFF_MASK

#define CAN_SFF_MASK   0x000007FFUL /* standard frame format (SFF) */

Typedef Documentation

◆ can_error_t

typedef uint32_t can_error_t

◆ can_errorData_t

typedef uint64_t can_errorData_t

Function Documentation

◆ can_deinit()

int32_t can_deinit ( struct can *  can)

Deinit CAN

Parameters
canCAN instance
Returns
-1 on error 0 on ok

◆ can_deregisterFilter()

int32_t can_deregisterFilter ( struct can *  can,
int32_t  filterID 
)

Deregister CAN Filter

Parameters
canCAN instance
filterIDFilterID
Returns
-1 on error 0 on ok

◆ can_down()

int32_t can_down ( struct can *  can)

Stop CAN Net

Parameters
canCAN instance
Returns
-1 on error 0 on ok

◆ can_init()

struct can* can_init ( uint32_t  index,
uint32_t  bitrate,
struct gpio_pin *  pin,
bool  pinHigh,
bool(*)(struct can *can, can_error_t error, can_errorData_t data, void *userData)  callback,
void *  data 
)

init CAN instance

Parameters
indexIndex of CAN
bitratebitrate
pinenable pin
pinHighEnable Pin Driven High or low for enable
callbackCallback if error is happened, ignored if defined NULL, The Hardware or the diver should restore the bus of Bus off automatically
dataCallback User Data
Returns
CAN Instance NULL on Error if only get instance on bits == 0

◆ can_recv()

int32_t can_recv ( struct can *  can,
int32_t  filterID,
struct can_msg msg,
TickType_t  waittime 
)

Receive CAN Message

Parameters
canCAN instance
filterIDfilterID
msgCAN Message
waittimemax waittime in mutex or isr lock see xSemaphoreTake()
Returns
-1 on error 0 on ok

◆ can_recvISR()

int32_t can_recvISR ( struct can *  can,
int32_t  filterID,
struct can_msg msg 
)

Receive CAN Message

Parameters
canCAN instance
filterIDfilterID
msgCAN Message
Returns
-1 on error 0 on ok

◆ can_registerFilter()

int32_t can_registerFilter ( struct can *  can,
struct can_filter filter 
)

Register CAN Filter

Warning
If a id and a mask is overlapping with another filter only one filter get the messages
Parameters
canCAN instance
filterFilter
Returns
-1 on error or filterID

◆ can_send()

int32_t can_send ( struct can *  can,
struct can_msg msg,
TickType_t  waittime 
)

Send CAN Message

Parameters
canCAN instance
msgCAN Message
waittimemax waittime in mutex or isr lock see xSemaphoreTake()
Returns
-1 on error 0 on ok

◆ can_sendISR()

int32_t can_sendISR ( struct can *  can,
struct can_msg msg 
)

Send CAN Message

Parameters
canCAN instance
msgCAN Message
Returns
-1 on error 0 on ok

◆ can_setCallback()

int32_t can_setCallback ( struct can *  can,
int32_t  filterID,
bool(*)(struct can *can, struct can_msg *msg, void *data)  callback,
void *  data 
)

Set CAN Interrupt Callback for a filter

Warning
This Callback is may executed in the contex of CAN interrupt ISR!
Parameters
canCAN instance
filterIDfilterID
callbackCallback
dataData parsed to Callback
Returns
-1 on error 0 on ok

◆ can_up()

int32_t can_up ( struct can *  can)

Start CAN Net

Parameters
canCAN instance
Returns
-1 on error 0 on ok
can.h