Skip to content

File CAN_FD.h

File List > bsp > Inc > CAN_FD.h

Go to the documentation of this file

#pragma once

#include "CAN_Common.h"
#include "queue_ex.h"
#include "stm32xx_hal.h"

#if !defined(FDCAN1)
#error "[CONFIG] CAN FD not enabled on this chip."
#endif /* FDCAN1 */

// fdcan handlers
#ifdef FDCAN1
extern FDCAN_HandleTypeDef* hfdcan1;
#endif /* FDCAN1 */

#ifdef FDCAN2
extern FDCAN_HandleTypeDef* hfdcan2;
#endif /* FDCAN2 */

#ifdef FDCAN3
extern FDCAN_HandleTypeDef* hfdcan3;
#endif /* FDCAN3 */

#define FDCAN_DLC_BYTES(len) \
((len) == 0  ? FDCAN_DLC_BYTES_0  : \
 (len) == 1  ? FDCAN_DLC_BYTES_1  : \
 (len) == 2  ? FDCAN_DLC_BYTES_2  : \
 (len) == 3  ? FDCAN_DLC_BYTES_3  : \
 (len) == 4  ? FDCAN_DLC_BYTES_4  : \
 (len) == 5  ? FDCAN_DLC_BYTES_5  : \
 (len) == 6  ? FDCAN_DLC_BYTES_6  : \
 (len) == 7  ? FDCAN_DLC_BYTES_7  : \
 (len) == 8  ? FDCAN_DLC_BYTES_8  : \
 (len) == 12 ? FDCAN_DLC_BYTES_12 : \
 (len) == 16 ? FDCAN_DLC_BYTES_16 : \
 (len) == 20 ? FDCAN_DLC_BYTES_20 : \
 (len) == 24 ? FDCAN_DLC_BYTES_24 : \
 (len) == 32 ? FDCAN_DLC_BYTES_32 : \
 (len) == 48 ? FDCAN_DLC_BYTES_48 : \
 (len) == 64 ? FDCAN_DLC_BYTES_64 : \
 FDCAN_DLC_BYTES_0)

#define FDCAN_BYTES_FROM_DLC(dlc) \
((dlc) == FDCAN_DLC_BYTES_0  ? 0  : \
 (dlc) == FDCAN_DLC_BYTES_1  ? 1  : \
 (dlc) == FDCAN_DLC_BYTES_2  ? 2  : \
 (dlc) == FDCAN_DLC_BYTES_3  ? 3  : \
 (dlc) == FDCAN_DLC_BYTES_4  ? 4  : \
 (dlc) == FDCAN_DLC_BYTES_5  ? 5  : \
 (dlc) == FDCAN_DLC_BYTES_6  ? 6  : \
 (dlc) == FDCAN_DLC_BYTES_7  ? 7  : \
 (dlc) == FDCAN_DLC_BYTES_8  ? 8  : \
 (dlc) == FDCAN_DLC_BYTES_12 ? 12 : \
 (dlc) == FDCAN_DLC_BYTES_16 ? 16 : \
 (dlc) == FDCAN_DLC_BYTES_20 ? 20 : \
 (dlc) == FDCAN_DLC_BYTES_24 ? 24 : \
 (dlc) == FDCAN_DLC_BYTES_32 ? 32 : \
 (dlc) == FDCAN_DLC_BYTES_48 ? 48 : \
 (dlc) == FDCAN_DLC_BYTES_64 ? 64 : \
 0)

can_status_t can_fd_init(FDCAN_HandleTypeDef* handle, FDCAN_FilterTypeDef* filter);

can_status_t can_fd_deinit(FDCAN_HandleTypeDef* handle);

can_status_t can_fd_start(FDCAN_HandleTypeDef* handle);

can_status_t can_fd_send(FDCAN_HandleTypeDef* handle, FDCAN_TxHeaderTypeDef* header, uint8_t data[],
                         TickType_t delay_ticks);
can_status_t can_fd_send_isr(FDCAN_HandleTypeDef* handle, FDCAN_TxHeaderTypeDef* header, 
                             uint8_t data[], BaseType_t* higherPriorityTaskWoken);

can_status_t can_fd_recv(FDCAN_HandleTypeDef* handle, uint32_t id, FDCAN_RxHeaderTypeDef* header,
                         uint8_t data[], TickType_t delay_ticks);


#if (configUSE_QUEUE_SETS == 1)
can_status_t can_fd_register_id_set(FDCAN_HandleTypeDef* handle, can_id_set_t* set);

can_status_t can_fd_recv_set(FDCAN_HandleTypeDef* handle, can_id_set_t* set, uint32_t* id,
                             TickType_t delay_ticks);

#endif /* ( configUSE_QUEUE_SETS == 1 ) */

void can_fd_tx_callback_hook(FDCAN_HandleTypeDef* hfdcan, const can_tx_payload_t* payload);

void can_fd_rx_callback_hook(FDCAN_HandleTypeDef* hfdcan, uint32_t RxFifo0ITs,
                             can_rx_payload_t recv_payload);

void can_fd_error_callback_hook(FDCAN_HandleTypeDef* hfdcan, uint32_t ErrorStatusITs);