From a58f53ebe2564b167497ca8aad3ad508aba558eb Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 20 Apr 2026 12:24:16 +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 | 15 +++++---- Src/CanSerialPortFrame.c | 70 ++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index c491d7d..33a3cf0 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -45,6 +45,7 @@ typedef struct { FLEXCAN_IdType eRxFrameType; /**< FLEXCAN ID type, 0 STD, 1 EXT */ uint32_t u32RxCanId; /**< FLEXCAN received ID */ + uint32_t u32RxCanIdMask; uint8_t filter; } FilterTo_FLEXCAN_RxMbFilterType; @@ -67,8 +68,8 @@ typedef struct { uint32_t g_u32RxDataIndex; - FLEXCAN_RxMbFilterType pRxFilterList[32]; - FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; + FLEXCAN_RxMbFilterType pRxMbFilterList[32]; +// FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; osMessageQueueId_t rxDataQueue[COUNT_QUEUE]; osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE]; @@ -86,7 +87,7 @@ typedef struct { uint8_t DMA_BUF_LEN_RX; uint8_t pBufCounter; - FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX; + FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX; can_rx_message_type rx_message_struct; @@ -104,11 +105,11 @@ bool vCanSerialPortFrameDMAInit( const uint8_t *DMA_BUF_RX, uint8_t DMA_BUF_LEN_RX, - const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX, - uint8_t CountSoftFilter_RX, + const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, + uint8_t CountHardSoftFilter_RX, - const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, - uint8_t CountFilterFifo_RX, +// const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, +// uint8_t CountFilterFifo_RX, IRQn_Type IRQ_DMA_RX, uint8_t IRQ_DMA_PRIORITY_RX, diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index de68849..706f665 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -79,11 +79,11 @@ bool vCanSerialPortFrameDMAInit( const uint8_t *DMA_BUF_RX, uint8_t DMA_BUF_LEN_RX, - const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX, - uint8_t CountSoftFilter_RX, + const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, + uint8_t CountHardSoftFilter_RX, - const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, - uint8_t CountFilterFifo_RX, +// const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, +// uint8_t CountFilterFifo_RX, IRQn_Type IRQ_DMA_RX, uint8_t IRQ_DMA_PRIORITY_RX, @@ -104,8 +104,8 @@ bool vCanSerialPortFrameDMAInit( env->can = CANx; env->CAN_INDEX = CAN_INDEX; env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; - env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX; - env->CountSoftFilter_RX = CountSoftFilter_RX; + env->IdHardSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardSoftFilter_RX; + env->CountSoftFilter_RX = CountHardSoftFilter_RX; env->access = osMutexNew(NULL); @@ -169,7 +169,8 @@ bool vCanSerialPortFrameDMAInit( env->tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eDataBaud = canBaudRate; - env->tInitCfg.bEnRxFifo = TRUE; +// env->tInitCfg.bEnRxFifo = TRUE; + env->tInitCfg.bEnRxFifo = FALSE; // env->tInitCfg.bEnDma = TRUE; env->tInitCfg.bEnDma = FALSE; @@ -189,11 +190,21 @@ bool vCanSerialPortFrameDMAInit( if (tRetVal == FLEXCAN_ERROR_OK) { - env->tMbCfg.pRxFilterMBList = NULL; - env->tMbCfg.u8RxFilterMBCnt = 0; + for (uint8_t i = 0; i < CountHardSoftFilter_RX; ++i) { + env->pRxMbFilterList[i].eRxFrameType = IdHardSoftFilter_RX[i].eRxFrameType; + env->pRxMbFilterList[i].u32RxCanId = IdHardSoftFilter_RX[i].u32RxCanId; + env->pRxMbFilterList[i].u32RxCanIdMask = IdHardSoftFilter_RX[i].u32RxCanIdMask; + } + env->tMbCfg.pRxFilterMBList = env->pRxMbFilterList; + env->tMbCfg.u8RxFilterMBCnt = CountHardSoftFilter_RX; + +// env->tMbCfg.pRxFilterMBList = NULL; +// env->tMbCfg.u8RxFilterMBCnt = 0; + + +/* for (uint8_t i = 0; i < CountFilterFifo_RX; ++i) { - env->pRxFilterFifoList[i].eRxFrameType = IdFilterFifo_RX[i].eRxFrameType; env->pRxFilterFifoList[i].u32RxCanId = IdFilterFifo_RX[i].u32RxCanId; env->pRxFilterFifoList[i].u32RxCanIdMask = IdFilterFifo_RX[i].u32RxCanIdMask; @@ -201,6 +212,9 @@ bool vCanSerialPortFrameDMAInit( env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList; env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX; +*/ + env->tMbCfg.pRxFilterFifoList = NULL; + env->tMbCfg.u8RxFilterFifoCnt = 0; env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); @@ -229,8 +243,8 @@ bool vCanSerialPortFrameDMAInit( env->tIntCfg.bEnTxMBInterrupt = 0U; env->tIntCfg.pTxMBNotify = NULL; - env->tIntCfg.bEnRxMBInterrupt = 0U; - env->tIntCfg.pRxMBNotify = NULL; + env->tIntCfg.bEnRxMBInterrupt = 1U; + env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; env->tIntCfg.bEnRxFifoInterrupt = 1U; env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; @@ -252,7 +266,7 @@ bool vCanSerialPortFrameDMAInit( if (!env->reInit) { env->reInit = true; - vCanSerialPortFrameInitStructure(env, 40, 0); + vCanSerialPortFrameInitStructure(env, 10, 0); CanSerialPortFrameSetType(env, canTypeFrame); CanSerialPortFrameSetId(env, canId); @@ -301,20 +315,22 @@ void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, F for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { - if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { + if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { - if (env->rx_message_struct.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) { - env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; + if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; + env->rx_message_struct.id_type = pRxCfg->eFrameType; index = i; break; } } else { - if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { + if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { - if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { - env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; + if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; + env->rx_message_struct.id_type = pRxCfg->eFrameType; index = i; break; } @@ -328,7 +344,7 @@ void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, F if (index != 0xFF) { memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen); - CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdSoftFilter_RX[index].filter); + CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter); } if (env->CountSoftFilter_RX == 0) { @@ -365,20 +381,20 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { - if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { + if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { - if (env->rx_message_struct.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) { - env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; + if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; index = i; break; } } else { - if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { + if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { - if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { - env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; + if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; index = i; break; } @@ -402,7 +418,7 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); } - CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdSoftFilter_RX[index].filter); + CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter); }