Go to the documentation of this file.
14 #if CANARD_STM32_USE_CAN2
15 # define BXCAN CANARD_STM32_CAN2
17 # define BXCAN CANARD_STM32_CAN1
30 const uint32_t clean_a = a & CANARD_CAN_EXT_ID_MASK;
31 const uint32_t clean_b = b & CANARD_CAN_EXT_ID_MASK;
36 const bool ext_a = (a & CANARD_CAN_FRAME_EFF) != 0;
37 const bool ext_b = (b & CANARD_CAN_FRAME_EFF) != 0;
40 const uint32_t arb11_a = ext_a ? (clean_a >> 18U) : clean_a;
41 const uint32_t arb11_b = ext_b ? (clean_b >> 18U) : clean_b;
42 if (arb11_a != arb11_b)
44 return arb11_a < arb11_b;
55 const bool rtr_a = (a & CANARD_CAN_FRAME_RTR) != 0;
56 const bool rtr_b = (b & CANARD_CAN_FRAME_RTR) != 0;
57 if ((clean_a == clean_b) && (rtr_a != rtr_b))
65 return clean_a < clean_b;
73 if (
id & CANARD_CAN_FRAME_EFF)
79 out = ((
id & CANARD_CAN_STD_ID_MASK) << 21U);
82 if (
id & CANARD_CAN_FRAME_RTR)
93 #if (CANARD_STM32_CAN_TIR_RTR != CANARD_STM32_CAN_RIR_RTR) ||\
94 (CANARD_STM32_CAN_TIR_IDE != CANARD_STM32_CAN_RIR_IDE)
95 # error "RIR bits do not match TIR bits, TIR --> libcanard conversion is not possible"
102 out = (CANARD_CAN_STD_ID_MASK & (
id >> 21U));
106 out = (CANARD_CAN_EXT_ID_MASK & (
id >> 3U)) | CANARD_CAN_FRAME_EFF;
111 out |= CANARD_CAN_FRAME_RTR;
128 static const uint16_t TimeoutMilliseconds = 1000;
130 for (
uint16_t wait_ack = 0; wait_ack < TimeoutMilliseconds; wait_ack++)
133 if (state == target_state)
178 return -CANARD_ERROR_INVALID_ARGUMENT;
181 if ((timings ==
NULL) ||
187 return -CANARD_ERROR_INVALID_ARGUMENT;
197 #if CANARD_STM32_USE_CAN2
232 CANARD_ASSERT(0 ==
BXCAN->IER);
265 #if CANARD_STM32_USE_CAN2
285 return -CANARD_ERROR_INVALID_ARGUMENT;
288 if (
frame->
id & CANARD_CAN_FRAME_ERR)
306 if ((
BXCAN->TSR & AllTME) != AllTME)
315 for (
uint8_t i = 0; i < 3; i++)
331 if (tx_mailbox == 0xFF)
348 #if CANARD_STM32_DEBUG_INNER_PRIORITY_INVERSION
349 CANARD_ASSERT(!
"CAN PRIO INV");
359 CANARD_ASSERT(tx_mailbox < 3);
389 if (out_frame ==
NULL)
391 return -CANARD_ERROR_INVALID_ARGUMENT;
394 static volatile uint32_t*
const RFxR[2] =
408 for (uint_fast8_t i = 0; i < 2; i++)
427 out_frame->data[0] = (
uint8_t)(0xFFU & (rdlr >> 0U));
428 out_frame->data[1] = (
uint8_t)(0xFFU & (rdlr >> 8U));
429 out_frame->data[2] = (
uint8_t)(0xFFU & (rdlr >> 16U));
430 out_frame->data[3] = (
uint8_t)(0xFFU & (rdlr >> 24U));
431 out_frame->data[4] = (
uint8_t)(0xFFU & (rdhr >> 0U));
432 out_frame->data[5] = (
uint8_t)(0xFFU & (rdhr >> 8U));
433 out_frame->data[6] = (
uint8_t)(0xFFU & (rdhr >> 16U));
434 out_frame->data[7] = (
uint8_t)(0xFFU & (rdhr >> 24U));
450 const uint8_t num_filter_configs)
453 if ((filter_configs ==
NULL) ||
456 return -CANARD_ERROR_INVALID_ARGUMENT;
469 for (
uint8_t i = 0; i < num_filter_configs; i++)
519 if ((cfg->
id & CANARD_CAN_FRAME_EFF) || !(cfg->
mask & CANARD_CAN_FRAME_EFF))
521 id = (cfg->
id & CANARD_CAN_EXT_ID_MASK) << 3U;
522 mask = (cfg->
mask & CANARD_CAN_EXT_ID_MASK) << 3U;
527 id = (cfg->
id & CANARD_CAN_STD_ID_MASK) << 21U;
528 mask = (cfg->
mask & CANARD_CAN_STD_ID_MASK) << 21U;
531 if (cfg->
id & CANARD_CAN_FRAME_RTR)
536 if (cfg->
mask & CANARD_CAN_FRAME_EFF)
541 if (cfg->
mask & CANARD_CAN_FRAME_RTR)
550 #if CANARD_STM32_USE_CAN2
static uint32_t convertFrameIDCanardToRegister(const uint32_t id)
Converts libcanard ID value into the bxCAN TX ID register format.
#define CANARD_STM32_CAN_MCR_AWUM
#define CANARD_STM32_CAN_FMR_FINIT
#define CANARD_STM32_ERROR_MSR_INAK_NOT_CLEARED
#define CANARD_STM32_CAN_TSR_ABRQ2
#define CANARD_STM32_CAN_MCR_ABOM
#define CANARD_STM32_NUM_ACCEPTANCE_FILTERS
#define CANARD_STM32_CAN_TSR_ABRQ1
#define CANARD_STM32_CAN_RFR_FMP_MASK
static bool g_abort_tx_on_error
#define CANARD_STM32_CAN_RIR_RTR
#define CANARD_STM32_CAN_TIR_TXRQ
#define CANARD_STM32_CAN_MSR_INAK
uint32_t id
CAN ID with flags (above)
#define CANARD_STM32_CAN_MCR_SLEEP
int16_t canardSTM32Receive(CanardCANFrame *const out_frame)
#define CANARD_STM32_CAN_TSR_ABRQ0
static bool isFramePriorityHigher(uint32_t a, uint32_t b)
@ CanardSTM32IfaceModeNormal
Normal mode.
#define CANARD_STM32_CAN_TSR_TME0
#define CANARD_STM32_CAN_RFR_FULL
static uint32_t convertFrameIDRegisterToCanard(const uint32_t id)
Converts bxCAN TX/RX (sic! both RX/TX are supported) ID register value into the libcanard ID format.
#define CANARD_STM32_CAN_ESR_BOFF
static bool waitMSRINAKBitStateChange(volatile const CanardSTM32CANType *const bxcan, const bool target_state)
@ CanardSTM32IfaceModeAutomaticTxAbortOnError
Abort pending TX if a bus error has occurred.
volatile uint32_t MSR
CAN master status register 0x004.
#define CANARD_STM32_CAN_RFR_RFOM
uint16_t bit_rate_prescaler
uint64_t rx_overflow_count
static CanardSTM32Stats g_stats
#define CANARD_STM32_CAN_RFR_FOVR
#define CANARD_STM32_CAN_RIR_IDE
#define CANARD_STM32_CAN_TSR_TME1
#define CANARD_STM32_CAN_TIR_IDE
CanardSTM32Stats canardSTM32GetStats(void)
@ CanardSTM32IfaceModeSilent
Do not affect the bus, only listen.
#define CANARD_STM32_CAN_TSR_TME2
static void processErrorStatus(void)
int16_t canardSTM32Transmit(const CanardCANFrame *const frame)
#define CANARD_STM32_CAN_MCR_INRQ
uint8_t bit_segment_2
[1, 16]
uint8_t max_resynchronization_jump_width
[1, 8]
#define CANARD_STM32_CAN_TIR_RTR
#define CANARD_STM32_ERROR_UNSUPPORTED_FRAME_FORMAT
#define CANARD_STM32_CAN_MCR_RESET
#define CANARD_STM32_ERROR_MSR_INAK_NOT_SET
int16_t canardSTM32Init(const CanardSTM32CANTimings *const timings, const CanardSTM32IfaceMode iface_mode)
#define CANARD_STM32_CAN_BTR_SILM
int16_t canardSTM32ConfigureAcceptanceFilters(const CanardSTM32AcceptanceFilterConfiguration *const filter_configs, const uint8_t num_filter_configs)
#define CANARD_STM32_CAN_RDTR_DLC_MASK
uint8_t bit_segment_1
[1, 1024]
#define CANARD_STM32_CAN_ESR_LEC_SHIFT
#define CANARD_STM32_CAN_ESR_LEC_MASK
#define CANARD_STM32_CAN1