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;
193 memset(&g_stats, 0,
sizeof(g_stats));
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);
367 mb->
TDTR = frame->data_len;
370 (((
uint32_t)frame->data[6]) << 16U) |
371 (((
uint32_t)frame->data[5]) << 8U) |
374 (((
uint32_t)frame->data[2]) << 16U) |
375 (((
uint32_t)frame->data[1]) << 8U) |
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 int16_t canardSTM32Init(const CanardSTM32CANTimings *const timings, const CanardSTM32IfaceMode iface_mode)
uint8_t bit_segment_1
[1, 1024]
Abort pending TX if a bus error has occurred.
#define CANARD_STM32_CAN_RFR_FMP_MASK
uint8_t max_resynchronization_jump_width
[1, 8]
#define CANARD_STM32_CAN_RFR_FOVR
#define CANARD_STM32_CAN_ESR_LEC_SHIFT
static uint32_t convertFrameIDCanardToRegister(const uint32_t id)
Converts libcanard ID value into the bxCAN TX ID register format.
#define CANARD_STM32_NUM_ACCEPTANCE_FILTERS
#define CANARD_STM32_ERROR_MSR_INAK_NOT_CLEARED
int16_t canardSTM32Receive(CanardCANFrame *const out_frame)
#define CANARD_STM32_CAN_TIR_IDE
#define CANARD_STM32_CAN_MCR_INRQ
#define CANARD_STM32_CAN_RFR_FULL
static bool isFramePriorityHigher(uint32_t a, uint32_t b)
#define CANARD_STM32_CAN_MCR_AWUM
#define CANARD_STM32_CAN_TSR_TME1
#define CANARD_STM32_CAN_TSR_ABRQ1
#define CANARD_STM32_CAN_MCR_ABOM
static bool g_abort_tx_on_error
#define CANARD_STM32_CAN_MSR_INAK
#define CANARD_STM32_CAN_RIR_RTR
static bool waitMSRINAKBitStateChange(volatile const CanardSTM32CANType *const bxcan, const bool target_state)
#define CANARD_STM32_CAN_TIR_RTR
uint64_t rx_overflow_count
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_MCR_SLEEP
#define CANARD_STM32_CAN_MCR_RESET
#define CANARD_STM32_CAN_TSR_TME0
#define CANARD_STM32_CAN_BTR_SILM
#define CANARD_STM32_CAN_RDTR_DLC_MASK
Do not affect the bus, only listen.
CanardSTM32Stats canardSTM32GetStats(void)
#define CANARD_STM32_CAN_TIR_TXRQ
uint16_t bit_rate_prescaler
#define CANARD_STM32_CAN_TSR_ABRQ2
#define CANARD_STM32_CAN_TSR_TME2
#define CANARD_STM32_ERROR_UNSUPPORTED_FRAME_FORMAT
#define CANARD_STM32_CAN_ESR_BOFF
int16_t canardSTM32Transmit(const CanardCANFrame *const frame)
#define CANARD_STM32_CAN_TSR_ABRQ0
#define CANARD_STM32_CAN_RIR_IDE
uint8_t bit_segment_2
[1, 16]
static CanardSTM32Stats g_stats
#define CANARD_STM32_CAN_FMR_FINIT
#define CANARD_STM32_CAN_RFR_RFOM
#define CANARD_STM32_ERROR_MSR_INAK_NOT_SET
#define CANARD_STM32_CAN1
static void processErrorStatus(void)
int16_t canardSTM32ConfigureAcceptanceFilters(const CanardSTM32AcceptanceFilterConfiguration *const filter_configs, const uint8_t num_filter_configs)
#define CANARD_STM32_CAN_ESR_LEC_MASK
volatile uint32_t MSR
CAN master status register 0x004.