From 7809fa20710883547fab8b6eef6bc2ad2b1c7505 Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 30 Oct 2025 15:14:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/CanSerialPortFrame.h | 19 +++++--- Src/CanSerialPortFrame.c | 101 ++++++++++++++++++++++++++++----------- 2 files changed, 85 insertions(+), 35 deletions(-) diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index eb40f9f..0e58705 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -18,8 +18,7 @@ #include "fc7xxx_driver_dma.h" -typedef struct -{ +typedef struct { uint32_t standard_id; /*!< specifies the 11 bits standard identifier this parameter can be a value between 0 to 0x7FF. */ @@ -40,7 +39,8 @@ typedef struct } can_rx_message_type; -#define COUNT_QUEUE 2 +#define COUNT_QUEUE 4 + typedef struct { @@ -59,11 +59,11 @@ typedef struct { uint32_t g_u32RxDataIndex; - FLEXCAN_RxMbFilterType aRxFiltList[COUNT_QUEUE]; + FLEXCAN_RxMbFilterType aRxFiltList[COUNT_QUEUE]; FLEXCAN_RxMbFilterType pRxFilterFifoList[COUNT_QUEUE]; - osMessageQueueId_t rxDataQueue; - osMessageQueueId_t rxDataSnifferQueue; + osMessageQueueId_t rxDataQueue[COUNT_QUEUE]; + osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE]; osMessageQueueId_t txAccessQueue; @@ -74,7 +74,6 @@ typedef struct { } tCanSerialPortFrameFlagchip; - void vCanSerialPortFrameInit( tCanSerialPortFrameFlagchip *env, @@ -108,6 +107,9 @@ void vCanSerialPortFrameDMAInit( uint8_t *DMA_BUF, + uint8_t CountFilter, + uint32_t *IdFilter, + IRQn_Type IRQ_DMA, uint8_t IRQ_DMA_PRIORITY, uint8_t IRQ_DMA_CHANNEL_PRIORITY, @@ -129,8 +131,11 @@ void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf); void CanSerialPortFrameSetId(tCanSerialPortFrameFlagchip *env, uint32_t id); + void CanSerialPortFrameSetType(tCanSerialPortFrameFlagchip *env, FLEXCAN_IdType canTypeFrame); + tSerialPortFrameIO CanPortFrame_GetIo(tCanSerialPortFrameFlagchip *env); + tSerialPortFrameIO CanPortFrame_GetSnifferIo(tCanSerialPortFrameFlagchip *env); #endif //FLAGCHIP_CAN_MODULE_CAN_FRAME_H diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 1a52902..ab7f609 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -60,11 +60,13 @@ void CanSerialPortFrameSetType(tCanSerialPortFrameFlagchip *env, FLEXCAN_IdType static void vCanSerialPortFrameInitStructure(tCanSerialPortFrameFlagchip *env, uint16_t rxDataLength, uint16_t rxSnifferLength) { - env->rxDataQueue = osMessageQueueNew(rxDataLength, sizeof(can_rx_message_type), NULL); - if (rxSnifferLength) { - env->rxDataSnifferQueue = osMessageQueueNew(rxSnifferLength, sizeof(can_rx_message_type), NULL); - } else { - env->rxDataSnifferQueue = NULL; + for (uint8_t i=0; irxDataQueue[i] = osMessageQueueNew(rxDataLength, sizeof(can_rx_message_type), NULL); + if (rxSnifferLength) { + env->rxDataSnifferQueue[i] = osMessageQueueNew(rxSnifferLength, sizeof(can_rx_message_type), NULL); + } else { + env->rxDataSnifferQueue[i] = NULL; + } } } @@ -222,6 +224,9 @@ void vCanSerialPortFrameDMAInit( uint8_t *DMA_BUF, + uint8_t CountFilter, + uint32_t *IdFilter, + IRQn_Type IRQ_DMA, uint8_t IRQ_DMA_PRIORITY, uint8_t IRQ_DMA_CHANNEL_PRIORITY, @@ -273,13 +278,13 @@ void vCanSerialPortFrameDMAInit( if (tRetVal == FLEXCAN_ERROR_OK) { /* +++++++++++ can mb initial ++++++++++++ */ - env->pRxFilterFifoList[0].eRxFrameType = FLEXCAN_ID_STD; - env->pRxFilterFifoList[0].u32RxCanId = 0U; - env->pRxFilterFifoList[0].u32RxCanIdMask = 0U; + for (uint8_t i=0; ipRxFilterFifoList[1].eRxFrameType = FLEXCAN_ID_STD; - env->pRxFilterFifoList[1].u32RxCanId = 0U; - env->pRxFilterFifoList[1].u32RxCanIdMask = 0U; + env->pRxFilterFifoList[i].eRxFrameType = FLEXCAN_ID_STD; + env->pRxFilterFifoList[i].u32RxCanId = IdFilter[i]; + env->pRxFilterFifoList[i].u32RxCanIdMask = 0U; + + } env->tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; env->tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); @@ -401,6 +406,14 @@ void vCanSerialPortFrameDMAInit( } +void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can_rx_message_type *rx_message_struct, uint8_t u8CanIndex) { + osMessageQueuePut(env->rxDataQueue[u8CanIndex], rx_message_struct, 0x0, 0U); + + if (env->rxDataSnifferQueue[u8CanIndex]) { + osMessageQueuePut(env->rxDataSnifferQueue[u8CanIndex], rx_message_struct, 0x0, 0U); + } +} + void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) { can_rx_message_type rx_message_struct; @@ -435,13 +448,24 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ (env->pRxFilterFifoList[i].eRxFrameType == FLEXCAN_ID_STD)) { if (rx_message_struct.standard_id == env->pRxFilterFifoList[i].u32RxCanId) { + rx_message_struct.filter_index = i; + + CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i); + } } else { if (rx_message_struct.extended_id == env->pRxFilterFifoList[i].u32RxCanId) { - rx_message_struct.filter_index = i; + + if (rx_message_struct.extended_id == env->pRxFilterFifoList[i].u32RxCanId) { + + rx_message_struct.filter_index = i; + + CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i); + } + } } @@ -449,11 +473,6 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ } - osMessageQueuePut(env->rxDataQueue, &rx_message_struct, 0x0, 0U); - - if (env->rxDataSnifferQueue) { - osMessageQueuePut(env->rxDataSnifferQueue, &rx_message_struct, 0x0, 0U); - } } @@ -463,13 +482,39 @@ void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t can_rx_message_type rx_message_struct; rx_message_struct.standard_id = pRxCfg->u32CanId; + rx_message_struct.filter_index = u8CanIndex; rx_message_struct.dlc = pRxCfg->u32DataLen; memcpy(rx_message_struct.data, pRxCfg->aData, rx_message_struct.dlc); - osMessageQueuePut(env->rxDataQueue, &rx_message_struct, 0x0, 0U); + for (uint8_t i = 0; i < COUNT_QUEUE; ++i) { + + if ((rx_message_struct.id_type == FLEXCAN_ID_STD) && + (env->pRxFilterFifoList[i].eRxFrameType == FLEXCAN_ID_STD)) { + + if (rx_message_struct.standard_id == env->pRxFilterFifoList[i].u32RxCanId) { + + rx_message_struct.filter_index = i; + + CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i); + + } + + } else { + + if (rx_message_struct.extended_id == env->pRxFilterFifoList[i].u32RxCanId) { + + if (rx_message_struct.extended_id == env->pRxFilterFifoList[i].u32RxCanId) { + + rx_message_struct.filter_index = i; + + CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i); + } + + } + + } + - if (env->rxDataSnifferQueue) { - osMessageQueuePut(env->rxDataSnifferQueue, &rx_message_struct, 0x0, 0U); } } @@ -507,17 +552,17 @@ static uint16_t vSerialPortFrameReceiveQueue( } static uint16_t -vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, +vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, uint8_t *data, uint16_t size, uint32_t timeout) { - return vSerialPortFrameReceiveQueue(env, data, size, timeout, env->rxDataQueue); + return vSerialPortFrameReceiveQueue(env, data, size, timeout, env->rxDataQueue[idFilter]); } static uint16_t -vCanSerialPortFrameReceiveSniffer(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, +vCanSerialPortFrameReceiveSniffer(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, uint8_t *data, uint16_t size, uint32_t timeout) { return env->rxDataSnifferQueue - ? vSerialPortFrameReceiveQueue(env, data, size, timeout, env->rxDataSnifferQueue) + ? vSerialPortFrameReceiveQueue(env, data, size, timeout, env->rxDataSnifferQueue[idFilter]) : 0; } @@ -583,8 +628,8 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t * tSerialPortFrameIO CanPortFrame_GetIo(tCanSerialPortFrameFlagchip *env) { tSerialPortFrameIO io = { .env = env, - .receive = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceive, - .transmit = (SerialPortFrameIOTransaction) vCanSerialPortFrameTransmit, + .receive = (SerialPortFrameReceivedTransaction) vCanSerialPortFrameReceive, + .transmit = (SerialPortFrameTransmitTransaction) vCanSerialPortFrameTransmit }; return io; } @@ -592,8 +637,8 @@ tSerialPortFrameIO CanPortFrame_GetIo(tCanSerialPortFrameFlagchip *env) { tSerialPortFrameIO CanPort_GetSnifferIo(tCanSerialPortFrameFlagchip *env) { tSerialPortFrameIO io = { .env = env, - .receive = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceiveSniffer, - .transmit = (SerialPortFrameIOTransaction) vCanSerialPortFrameTransmit, + .receive = (SerialPortFrameReceivedTransaction) vCanSerialPortFrameReceive, + .transmit = (SerialPortFrameTransmitTransaction) vCanSerialPortFrameTransmit }; return io; } \ No newline at end of file