diff --git a/User/bsp/fdcan.c b/User/bsp/fdcan.c index b2782c6..7510f12 100644 --- a/User/bsp/fdcan.c +++ b/User/bsp/fdcan.c @@ -65,25 +65,21 @@ typedef struct BSP_FDCAN_QueueNode { } BSP_FDCAN_QueueNode_t; /* Private variables -------------------------------------------------------- */ -//static BSP_FDCAN_QueueNode_t *queue_list = NULL; -//static osMutexId_t queue_mutex = NULL; -//static void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void); -//static bool inited = false; -//static BSP_FDCAN_IdParser_t id_parser = NULL; -//static BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM]; -BSP_FDCAN_QueueNode_t *queue_list = NULL; -osMutexId_t queue_mutex = NULL; -void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void); -bool inited = false; -BSP_FDCAN_IdParser_t id_parser = NULL; -BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM]; +static BSP_FDCAN_QueueNode_t *queue_list = NULL; +static osMutexId_t queue_mutex = NULL; +static void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void); +static bool inited = false; +static BSP_FDCAN_IdParser_t id_parser = NULL; +static BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM]; +static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64}; + /* Private function prototypes ---------------------------------------------- */ static BSP_FDCAN_t FDCAN_Get(FDCAN_HandleTypeDef *hfdcan); static osMessageQueueId_t BSP_FDCAN_FindQueue(BSP_FDCAN_t fdcan, uint32_t can_id); static int8_t BSP_FDCAN_CreateIdQueue(BSP_FDCAN_t fdcan, uint32_t can_id, uint8_t queue_size); static void BSP_FDCAN_RxFifo0Callback(void); static void BSP_FDCAN_RxFifo1Callback(void); -// static void BSP_FDCAN_TxCompleteCallback(void); +static void BSP_FDCAN_TxCompleteCallback(void); static BSP_FDCAN_FrameType_t BSP_FDCAN_GetFrameType(FDCAN_RxHeaderTypeDef *header); static uint32_t BSP_FDCAN_DefaultIdParser(uint32_t original_id, BSP_FDCAN_FrameType_t frame_type); static void BSP_FDCAN_TxQueueInit(BSP_FDCAN_t fdcan); @@ -93,20 +89,20 @@ static bool BSP_FDCAN_TxQueueIsEmpty(BSP_FDCAN_t fdcan); /* Private functions -------------------------------------------------------- */ static BSP_FDCAN_t FDCAN_Get(FDCAN_HandleTypeDef *hfdcan) { - if (hfdcan == NULL) return BSP_FDCAN_ERR; - if (hfdcan->Instance == FDCAN1) return BSP_FDCAN_1; - else if (hfdcan->Instance == FDCAN2) return BSP_FDCAN_2; - else if (hfdcan->Instance == FDCAN3) return BSP_FDCAN_3; - else return BSP_FDCAN_ERR; + if (hfdcan == NULL) return BSP_FDCAN_ERR; + if (hfdcan->Instance == FDCAN1) return BSP_FDCAN_1; + else if (hfdcan->Instance == FDCAN2) return BSP_FDCAN_2; + else if (hfdcan->Instance == FDCAN3) return BSP_FDCAN_3; + else return BSP_FDCAN_ERR; } static osMessageQueueId_t BSP_FDCAN_FindQueue(BSP_FDCAN_t fdcan, uint32_t can_id) { - BSP_FDCAN_QueueNode_t *node = queue_list; - while (node != NULL) { - if (node->fdcan == fdcan && node->can_id == can_id) return node->queue; - node = node->next; - } - return NULL; + BSP_FDCAN_QueueNode_t *node = queue_list; + while (node != NULL) { + if (node->fdcan == fdcan && node->can_id == can_id) return node->queue; + node = node->next; + } + return NULL; } static int8_t BSP_FDCAN_CreateIdQueue(BSP_FDCAN_t fdcan, uint32_t can_id, uint8_t queue_size) { @@ -135,213 +131,208 @@ static int8_t BSP_FDCAN_CreateIdQueue(BSP_FDCAN_t fdcan, uint32_t can_id, uint8_ } static BSP_FDCAN_FrameType_t BSP_FDCAN_GetFrameType(FDCAN_RxHeaderTypeDef *header) { - if (header->RxFrameType == FDCAN_REMOTE_FRAME) { - return (header->IdType == FDCAN_EXTENDED_ID) ? BSP_FDCAN_FRAME_EXT_REMOTE : BSP_FDCAN_FRAME_STD_REMOTE; - } else { - return (header->IdType == FDCAN_EXTENDED_ID) ? BSP_FDCAN_FRAME_EXT_DATA : BSP_FDCAN_FRAME_STD_DATA; - } + if (header->RxFrameType == FDCAN_REMOTE_FRAME) { + return (header->IdType == FDCAN_EXTENDED_ID) ? BSP_FDCAN_FRAME_EXT_REMOTE : BSP_FDCAN_FRAME_STD_REMOTE; + } else { + return (header->IdType == FDCAN_EXTENDED_ID) ? BSP_FDCAN_FRAME_EXT_DATA : BSP_FDCAN_FRAME_STD_DATA; + } } static uint32_t BSP_FDCAN_DefaultIdParser(uint32_t original_id, BSP_FDCAN_FrameType_t frame_type) { - (void)frame_type; - return original_id; + (void)frame_type; + return original_id; } static uint32_t BSP_FDCAN_EncodeDLC(uint8_t dlc) { - if (dlc <= 8) return dlc; - if (dlc <= 12) return FDCAN_DLC_BYTES_12; - if (dlc <= 16) return FDCAN_DLC_BYTES_16; - if (dlc <= 20) return FDCAN_DLC_BYTES_20; - if (dlc <= 24) return FDCAN_DLC_BYTES_24; - if (dlc <= 32) return FDCAN_DLC_BYTES_32; - if (dlc <= 48) return FDCAN_DLC_BYTES_48; - return FDCAN_DLC_BYTES_64; + if (dlc <= 8) return dlc; + if (dlc <= 12) return FDCAN_DLC_BYTES_12; + if (dlc <= 16) return FDCAN_DLC_BYTES_16; + if (dlc <= 20) return FDCAN_DLC_BYTES_20; + if (dlc <= 24) return FDCAN_DLC_BYTES_24; + if (dlc <= 32) return FDCAN_DLC_BYTES_32; + if (dlc <= 48) return FDCAN_DLC_BYTES_48; + return FDCAN_DLC_BYTES_64; } static void BSP_FDCAN_TxQueueInit(BSP_FDCAN_t fdcan) { - if (fdcan >= BSP_FDCAN_NUM) return; - tx_queues[fdcan].head = 0; - tx_queues[fdcan].tail = 0; + if (fdcan >= BSP_FDCAN_NUM) return; + tx_queues[fdcan].head = 0; + tx_queues[fdcan].tail = 0; } static bool BSP_FDCAN_TxQueuePush(BSP_FDCAN_t fdcan, BSP_FDCAN_TxMessage_t *msg) { - if (fdcan >= BSP_FDCAN_NUM || msg == NULL) return false; - BSP_FDCAN_TxQueue_t *queue = &tx_queues[fdcan]; - uint32_t next_head = (queue->head + 1) % BSP_FDCAN_TX_QUEUE_SIZE; - if (next_head == queue->tail) return false; - queue->buffer[queue->head] = *msg; - queue->head = next_head; - return true; + if (fdcan >= BSP_FDCAN_NUM || msg == NULL) return false; + BSP_FDCAN_TxQueue_t *queue = &tx_queues[fdcan]; + uint32_t next_head = (queue->head + 1) % BSP_FDCAN_TX_QUEUE_SIZE; + if (next_head == queue->tail) return false; + queue->buffer[queue->head] = *msg; + queue->head = next_head; + return true; } static bool BSP_FDCAN_TxQueuePop(BSP_FDCAN_t fdcan, BSP_FDCAN_TxMessage_t *msg) { - if (fdcan >= BSP_FDCAN_NUM || msg == NULL) return false; - BSP_FDCAN_TxQueue_t *queue = &tx_queues[fdcan]; - if (queue->head == queue->tail) return false; - *msg = queue->buffer[queue->tail]; - queue->tail = (queue->tail + 1) % BSP_FDCAN_TX_QUEUE_SIZE; - return true; + if (fdcan >= BSP_FDCAN_NUM || msg == NULL) return false; + BSP_FDCAN_TxQueue_t *queue = &tx_queues[fdcan]; + if (queue->head == queue->tail) return false; + *msg = queue->buffer[queue->tail]; + queue->tail = (queue->tail + 1) % BSP_FDCAN_TX_QUEUE_SIZE; + return true; } static bool BSP_FDCAN_TxQueueIsEmpty(BSP_FDCAN_t fdcan) { - if (fdcan >= BSP_FDCAN_NUM) return true; - return tx_queues[fdcan].head == tx_queues[fdcan].tail; + if (fdcan >= BSP_FDCAN_NUM) return true; + return tx_queues[fdcan].head == tx_queues[fdcan].tail; } static void BSP_FDCAN_TxCompleteCallback(void) { - for (int i = 0; i < BSP_FDCAN_NUM; i++) { - BSP_FDCAN_t fdcan = (BSP_FDCAN_t)i; - FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle(fdcan); - if (hfdcan == NULL) continue; - // 消费所有 TX EVENT FIFO 事件,防止堵塞 - FDCAN_TxEventFifoTypeDef tx_event; - while (HAL_FDCAN_GetTxEvent(hfdcan, &tx_event) == HAL_OK) { - // 可在此统计 MessageMarker、ID、时间戳等 - } - // 续写软件队列到硬件 FIFO - BSP_FDCAN_TxMessage_t msg; - while (!BSP_FDCAN_TxQueueIsEmpty(fdcan)) { - if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) == 0) break; - if (!BSP_FDCAN_TxQueuePop(fdcan, &msg)) break; - HAL_StatusTypeDef res = HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &msg.header, msg.data); - if (res != HAL_OK) { - break; - } - } + for (int i = 0; i < BSP_FDCAN_NUM; i++) { + BSP_FDCAN_t fdcan = (BSP_FDCAN_t)i; + FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle(fdcan); + if (hfdcan == NULL) continue; + // 消费所有 TX EVENT FIFO 事件,防止堵塞 + FDCAN_TxEventFifoTypeDef tx_event; + while (HAL_FDCAN_GetTxEvent(hfdcan, &tx_event) == HAL_OK) { + // 可在此统计 MessageMarker、ID、时间戳等 } + // 续写软件队列到硬件 FIFO + BSP_FDCAN_TxMessage_t msg; + while (!BSP_FDCAN_TxQueueIsEmpty(fdcan)) { + if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) == 0) break; + if (!BSP_FDCAN_TxQueuePop(fdcan, &msg)) break; + HAL_StatusTypeDef res = HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &msg.header, msg.data); + if (res != HAL_OK) { + break; + } + } + } } -static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64}; static void BSP_FDCAN_RxFifo0Callback(void) { - FDCAN_RxHeaderTypeDef rx_header; - uint8_t rx_data[BSP_FDCAN_MAX_DLC]; - for (int fdcan_idx = 0; fdcan_idx < BSP_FDCAN_NUM; fdcan_idx++) { - FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle((BSP_FDCAN_t)fdcan_idx); - if (hfdcan == NULL) continue; - while (HAL_FDCAN_GetRxFifoFillLevel(hfdcan, FDCAN_RX_FIFO0) > 0) { - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rx_header, rx_data) == HAL_OK) { - uint32_t original_id = (rx_header.IdType == FDCAN_STANDARD_ID) ? rx_header.Identifier&0x7ff : rx_header.Identifier&0x1fffffff; - BSP_FDCAN_FrameType_t frame_type = BSP_FDCAN_GetFrameType(&rx_header); - uint32_t parsed_id = BSP_FDCAN_ParseId(original_id, frame_type); - osMessageQueueId_t queue = BSP_FDCAN_FindQueue((BSP_FDCAN_t)fdcan_idx, parsed_id); - if (queue != NULL) { - BSP_FDCAN_Message_t msg; - msg.frame_type = frame_type; - msg.original_id = original_id; - msg.parsed_id = parsed_id; - uint8_t real_len = fdcan_dlc2len[rx_header.DataLength & 0xF]; - msg.dlc = real_len; - if (msg.dlc > BSP_FDCAN_MAX_DLC) msg.dlc = BSP_FDCAN_MAX_DLC; - memset(msg.data, 0, BSP_FDCAN_MAX_DLC);//现在是最大缓冲区写法所以全清零 - memcpy(msg.data, rx_data, msg.dlc); - osMessageQueuePut(queue, &msg, 0, 0); - } - } else { - break; - } + FDCAN_RxHeaderTypeDef rx_header; + uint8_t rx_data[BSP_FDCAN_MAX_DLC]; + for (int fdcan_idx = 0; fdcan_idx < BSP_FDCAN_NUM; fdcan_idx++) { + FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle((BSP_FDCAN_t)fdcan_idx); + if (hfdcan == NULL) continue; + while (HAL_FDCAN_GetRxFifoFillLevel(hfdcan, FDCAN_RX_FIFO0) > 0) { + if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rx_header, rx_data) == HAL_OK) { + uint32_t original_id = (rx_header.IdType == FDCAN_STANDARD_ID) ? rx_header.Identifier&0x7ff : rx_header.Identifier&0x1fffffff; + BSP_FDCAN_FrameType_t frame_type = BSP_FDCAN_GetFrameType(&rx_header); + uint32_t parsed_id = BSP_FDCAN_ParseId(original_id, frame_type); + osMessageQueueId_t queue = BSP_FDCAN_FindQueue((BSP_FDCAN_t)fdcan_idx, parsed_id); + if (queue != NULL) { + BSP_FDCAN_Message_t msg; + msg.frame_type = frame_type; + msg.original_id = original_id; + msg.parsed_id = parsed_id; + uint8_t real_len = fdcan_dlc2len[rx_header.DataLength & 0xF]; + msg.dlc = real_len; + if (msg.dlc > BSP_FDCAN_MAX_DLC) msg.dlc = BSP_FDCAN_MAX_DLC; + memset(msg.data, 0, BSP_FDCAN_MAX_DLC);//现在是最大缓冲区写法所以全清零 + memcpy(msg.data, rx_data, msg.dlc); + osMessageQueuePut(queue, &msg, 0, 0); } + } else { + break; + } } + } } static void BSP_FDCAN_RxFifo1Callback(void) { - FDCAN_RxHeaderTypeDef rx_header; - uint8_t rx_data[BSP_FDCAN_MAX_DLC]; - static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64}; - for (int fdcan_idx = 0; fdcan_idx < BSP_FDCAN_NUM; fdcan_idx++) { - FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle((BSP_FDCAN_t)fdcan_idx); - if (hfdcan == NULL) continue; - while (HAL_FDCAN_GetRxFifoFillLevel(hfdcan, FDCAN_RX_FIFO1) > 0) { - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO1, &rx_header, rx_data) == HAL_OK) { - uint32_t original_id = (rx_header.IdType == FDCAN_STANDARD_ID) ? rx_header.Identifier&0x7ff : rx_header.Identifier&0x1fffffff; - BSP_FDCAN_FrameType_t frame_type = BSP_FDCAN_GetFrameType(&rx_header); - uint32_t parsed_id = BSP_FDCAN_ParseId(original_id, frame_type); - osMessageQueueId_t queue = BSP_FDCAN_FindQueue((BSP_FDCAN_t)fdcan_idx, parsed_id); - if (queue != NULL) { - BSP_FDCAN_Message_t msg; - msg.frame_type = frame_type; - msg.original_id = original_id; - msg.parsed_id = parsed_id; - uint8_t real_len = fdcan_dlc2len[rx_header.DataLength & 0xF]; - msg.dlc = real_len; - if (msg.dlc > BSP_FDCAN_MAX_DLC) msg.dlc = BSP_FDCAN_MAX_DLC; - memset(msg.data, 0, BSP_FDCAN_MAX_DLC);//现在是最大缓冲区写法所以全清零 - memcpy(msg.data, rx_data, msg.dlc); - osMessageQueuePut(queue, &msg, 0, 0); - } - } else { - break; - } + FDCAN_RxHeaderTypeDef rx_header; + uint8_t rx_data[BSP_FDCAN_MAX_DLC]; + for (int fdcan_idx = 0; fdcan_idx < BSP_FDCAN_NUM; fdcan_idx++) { + FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle((BSP_FDCAN_t)fdcan_idx); + if (hfdcan == NULL) continue; + while (HAL_FDCAN_GetRxFifoFillLevel(hfdcan, FDCAN_RX_FIFO1) > 0) { + if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO1, &rx_header, rx_data) == HAL_OK) { + uint32_t original_id = (rx_header.IdType == FDCAN_STANDARD_ID) ? rx_header.Identifier&0x7ff : rx_header.Identifier&0x1fffffff; + BSP_FDCAN_FrameType_t frame_type = BSP_FDCAN_GetFrameType(&rx_header); + uint32_t parsed_id = BSP_FDCAN_ParseId(original_id, frame_type); + osMessageQueueId_t queue = BSP_FDCAN_FindQueue((BSP_FDCAN_t)fdcan_idx, parsed_id); + if (queue != NULL) { + BSP_FDCAN_Message_t msg; + msg.frame_type = frame_type; + msg.original_id = original_id; + msg.parsed_id = parsed_id; + uint8_t real_len = fdcan_dlc2len[rx_header.DataLength & 0xF]; + msg.dlc = real_len; + if (msg.dlc > BSP_FDCAN_MAX_DLC) msg.dlc = BSP_FDCAN_MAX_DLC; + memset(msg.data, 0, BSP_FDCAN_MAX_DLC);//现在是最大缓冲区写法所以全清零 + memcpy(msg.data, rx_data, msg.dlc); + osMessageQueuePut(queue, &msg, 0, 0); } + } else { + break; + } } + } } /* HAL Callback Stubs (map HAL FDCAN callbacks to user callbacks) */ void HAL_FDCAN_TxEventFifoCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t TxEventFifoITs) { - BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); - if (bsp_fdcan != BSP_FDCAN_ERR) { - if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_EVENT_FIFO_CB]) - FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_EVENT_FIFO_CB](); - } + BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); + if (bsp_fdcan != BSP_FDCAN_ERR) { + if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_EVENT_FIFO_CB]) + FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_EVENT_FIFO_CB](); + } } void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndex) { - BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); - if (bsp_fdcan != BSP_FDCAN_ERR) { - if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_COMPLETE_CB]) - FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_COMPLETE_CB](); - } + BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); + if (bsp_fdcan != BSP_FDCAN_ERR) { + if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_COMPLETE_CB]) + FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_COMPLETE_CB](); + } } void HAL_FDCAN_TxBufferAbortCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndex) { - BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); - if (bsp_fdcan != BSP_FDCAN_ERR) { - if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_ABORT_CB]) - FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_ABORT_CB](); - } + BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); + if (bsp_fdcan != BSP_FDCAN_ERR) { + if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_ABORT_CB]) + FDCAN_Callback[bsp_fdcan][HAL_FDCAN_TX_BUFFER_ABORT_CB](); + } } void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) { - BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); - if (bsp_fdcan != BSP_FDCAN_ERR) { - if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO0_MSG_PENDING_CB]) - FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO0_MSG_PENDING_CB](); - } + BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); + if (bsp_fdcan != BSP_FDCAN_ERR) { + if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO0_MSG_PENDING_CB]) + FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO0_MSG_PENDING_CB](); + } } void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs) { - BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); - if (bsp_fdcan != BSP_FDCAN_ERR) { - if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO1_MSG_PENDING_CB]) - FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO1_MSG_PENDING_CB](); - } + BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); + if (bsp_fdcan != BSP_FDCAN_ERR) { + if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO1_MSG_PENDING_CB]) + FDCAN_Callback[bsp_fdcan][HAL_FDCAN_RX_FIFO1_MSG_PENDING_CB](); + } } void HAL_FDCAN_ErrorCallback(FDCAN_HandleTypeDef *hfdcan) { - BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); - if (bsp_fdcan != BSP_FDCAN_ERR) { - if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_ERROR_CB]) - FDCAN_Callback[bsp_fdcan][HAL_FDCAN_ERROR_CB](); - } + BSP_FDCAN_t bsp_fdcan = FDCAN_Get(hfdcan); + if (bsp_fdcan != BSP_FDCAN_ERR) { + if (FDCAN_Callback[bsp_fdcan][HAL_FDCAN_ERROR_CB]) + FDCAN_Callback[bsp_fdcan][HAL_FDCAN_ERROR_CB](); + } } /* Exported functions ------------------------------------------------------- */ int8_t BSP_FDCAN_Init(void) { - if (inited) return BSP_ERR_INITED; + if (inited) return BSP_ERR_INITED; - memset(FDCAN_Callback, 0, sizeof(FDCAN_Callback)); + memset(FDCAN_Callback, 0, sizeof(FDCAN_Callback)); + for (int i = 0; i < BSP_FDCAN_NUM; i++) BSP_FDCAN_TxQueueInit((BSP_FDCAN_t)i); + id_parser = BSP_FDCAN_DefaultIdParser; + queue_mutex = osMutexNew(NULL); + if (queue_mutex == NULL) return BSP_ERR; - for (int i = 0; i < BSP_FDCAN_NUM; i++) BSP_FDCAN_TxQueueInit((BSP_FDCAN_t)i); - - id_parser = BSP_FDCAN_DefaultIdParser; - - queue_mutex = osMutexNew(NULL); - - if (queue_mutex == NULL) return BSP_ERR; - - inited = true; + inited = true; /* 配置并启动 FDCAN 实例,绑定中断/回调 */ + //========== 过滤器配置说明:========================== // 过滤器编号:相对于每个(相当于经典can过滤器的bank) // sFilterConfig.FilterIndex = 0 to 127(标准ID) or 0 to 63(扩展ID); // 关于过滤器索引的说明: @@ -379,7 +370,7 @@ int8_t BSP_FDCAN_Init(void) { // 仅在FilterConfig 设为 FDCAN_FILTER_TO_RXBUFFER 时才有意义,通常设置为0 // IsCalibrationMsg = 0 or 1; // fdcan_filter_table.h - + //================================================================================= /* 依据上述说明,配置过滤器并启动FDCAN */ FDCAN_FilterTypeDef sFilterConfig; @@ -452,7 +443,7 @@ int8_t BSP_FDCAN_RegisterCallback(BSP_FDCAN_t fdcan, BSP_FDCAN_Callback_t type, FDCAN_Callback[fdcan][type] = callback; return BSP_OK; } -uint32_t fifolevel=0; + int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t id, uint8_t *data, uint8_t dlc) { if (!inited) return BSP_ERR_INITED; if (fdcan >= BSP_FDCAN_NUM) return BSP_ERR; @@ -507,10 +498,8 @@ int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t tx_msg.header.DataLength = BSP_FDCAN_EncodeDLC(dlc); memset(tx_msg.data, 0, dlc); - if (data != NULL && dlc > 0) { - memcpy(tx_msg.data, data, dlc);} + if (data != NULL && dlc > 0) {memcpy(tx_msg.data, data, dlc);} - fifolevel=HAL_FDCAN_GetTxFifoFreeLevel(hfdcan); if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) > 0) { if (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &tx_msg.header, tx_msg.data) == HAL_OK) return BSP_OK; } diff --git a/User/task/blink.c b/User/task/blink.c index fd32705..ce5bd3b 100644 --- a/User/task/blink.c +++ b/User/task/blink.c @@ -19,10 +19,12 @@ /* Private variables -------------------------------------------------------- */ /* USER STRUCT BEGIN */ BSP_FDCAN_Message_t msg1={0}; - BSP_FDCAN_Message_t msg2={0}; - BSP_FDCAN_Message_t msg3={0}; + BSP_FDCAN_Message_t msg2={0}; + BSP_FDCAN_Message_t msg3A={0}; + BSP_FDCAN_Message_t msg3B={0}; + BSP_FDCAN_Message_t msg3C={0}; /* USER STRUCT END */ -float rxlevel=0; + /* Private function --------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */ @@ -51,7 +53,8 @@ void Task_blink(void *argument) { BSP_FDCAN_RegisterId(BSP_FDCAN_1, 0x101, 8); BSP_FDCAN_RegisterId(BSP_FDCAN_2, 0x102, 8); BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x103, 8); - + BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x104, 8); + BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x105, 8); /* USER CODE INIT END */ while (1) { @@ -78,15 +81,20 @@ void Task_blink(void *argument) { // 使用 BSP 封装的发送接口(非阻塞,若硬件 FIFO 满则内部入队) BSP_FDCAN_Transmit(BSP_FDCAN_1, BSP_FDCAN_FORMAT_STD_DATA, 0x101, data1, 8); BSP_FDCAN_Transmit(BSP_FDCAN_2, BSP_FDCAN_FORMAT_STD_DATA, 0x102, data2, 8); - BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 13); + BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 30); + BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x104, data2, 5); + BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x105, data1, 8); if (BSP_FDCAN_GetMessage(BSP_FDCAN_1, 0x101, &msg1, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { } if (BSP_FDCAN_GetMessage(BSP_FDCAN_2, 0x102, &msg2, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { } - if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg3, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { + if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg3A, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { + } + if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x104, &msg3B, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { + } + if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x105, &msg3C, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { } - rxlevel=HAL_FDCAN_GetRxFifoFillLevel(BSP_FDCAN_GetHandle(BSP_FDCAN_2), FDCAN_RX_FIFO1); } // osDelay(10); /* USER CODE END */