想不到有啥好写法了,先全用BSP_FDCAN_MAX_DLC,BSP_FDCAN_MAX_DLC可以通过mr读ioc调整
This commit is contained in:
parent
55153c98a0
commit
9f884a4f7e
341
User/bsp/fdcan.c
341
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;
|
||||
}
|
||||
|
||||
@ -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 */
|
||||
|
||||
Loading…
Reference in New Issue
Block a user