diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index 133724d..709c272 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -62,14 +62,14 @@ typedef struct { bool reInit; - uint8_t CountFilter_RX; + uint8_t CountSoftFilter_RX; FLEXCAN_BaudType canBaudRate; uint32_t g_u32RxDataIndex; - FLEXCAN_RxMbFilterType aRxFiltList[COUNT_QUEUE]; - FLEXCAN_RxMbFilterType pRxFilterFifoList[COUNT_QUEUE]; + FLEXCAN_RxMbFilterType pRxFilterList[32]; + FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; osMessageQueueId_t rxDataQueue[COUNT_QUEUE]; osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE]; @@ -87,7 +87,9 @@ typedef struct { uint8_t DMA_BUF_LEN_RX; uint8_t pBufCounter; - FilterTo_FLEXCAN_RxMbFilterType *IdFilter_RX; + FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX; + + can_rx_message_type rx_message_struct; } tCanSerialPortFrameFlagchip; @@ -102,8 +104,13 @@ void vCanSerialPortFrameDMAInit( DMA_RequestSourceType DMA_CHANNEL_REQ_RX, // DMA_REQ_FLEXCAN0 const uint8_t *DMA_BUF_RX, uint8_t DMA_BUF_LEN_RX, - const FilterTo_FLEXCAN_RxMbFilterType *IdFilter_RX, - uint8_t CountFilter_RX, + + const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX, + uint8_t CountSoftFilter_RX, + + const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, + uint8_t CountFilterFifo_RX, + IRQn_Type IRQ_DMA_RX, uint8_t IRQ_DMA_PRIORITY_RX, uint8_t IRQ_DMA_CHANNEL_PRIORITY_RX, diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index fbee357..eb41bae 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -6,8 +6,8 @@ #include "memory.h" -#define CAN_USED_NUM 6U -#define CAN_RECEIVE_MB_NUM 2 +#define CAN_USED_NUM 2U // Количество CAN +#define CAN_RECEIVE_MB_NUM 32 // static FLEXCAN_RxMsgType s_aaRxDataBuf[CAN_USED_NUM][CAN_RECEIVE_MB_NUM]; #define CAN_GET_BUFFER(index) s_aaRxDataBuf[index/2] @@ -82,8 +82,13 @@ void vCanSerialPortFrameDMAInit( DMA_RequestSourceType DMA_CHANNEL_REQ_RX, // DMA_REQ_FLEXCAN0 const uint8_t *DMA_BUF_RX, uint8_t DMA_BUF_LEN_RX, - const FilterTo_FLEXCAN_RxMbFilterType *IdFilter_RX, - uint8_t CountFilter_RX, + + const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX, + uint8_t CountSoftFilter_RX, + + const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, + uint8_t CountFilterFifo_RX, + IRQn_Type IRQ_DMA_RX, uint8_t IRQ_DMA_PRIORITY_RX, uint8_t IRQ_DMA_CHANNEL_PRIORITY_RX, @@ -102,10 +107,9 @@ void vCanSerialPortFrameDMAInit( env->g_u32RxDataIndex = 0; env->can = CANx; env->CAN_INDEX = CAN_INDEX; - env->CountFilter_RX = CountFilter_RX; env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; - env->IdFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *)IdFilter_RX; - + env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX; + env->CountSoftFilter_RX = CountSoftFilter_RX; //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- @@ -192,16 +196,18 @@ void vCanSerialPortFrameDMAInit( if (tRetVal == FLEXCAN_ERROR_OK) { - for (uint8_t i = 0; i < CountFilter_RX; ++i) { + env->tMbCfg.pRxFilterMBList = NULL; + env->tMbCfg.u8RxFilterMBCnt = 0; - env->pRxFilterFifoList[i].eRxFrameType = IdFilter_RX[i].eRxFrameType; - env->pRxFilterFifoList[i].u32RxCanId = IdFilter_RX[i].u32RxCanId; - env->pRxFilterFifoList[i].u32RxCanIdMask = IdFilter_RX[i].u32RxCanIdMask; + 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; } env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList; - env->tMbCfg.u8RxFilterFifoCnt = CountFilter_RX; + env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX; env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); @@ -271,7 +277,7 @@ void vCanSerialPortFrameDMAInit( } static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can_rx_message_type *rx_message_struct, - uint8_t filter) { + uint8_t filter) { osMessageQueuePut(env->rxDataQueue[filter], rx_message_struct, 0x0, 0U); if (env->rxDataSnifferQueue[filter]) { @@ -280,59 +286,44 @@ static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can } void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) { - can_rx_message_type rx_message_struct; // message buffer 1th word uint32_t u32TempAddr = (uint32_t) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 0U); uint32_t dlc = FLEXCAN_MB_DLC_GET(u32TempAddr); - rx_message_struct.dlc = FLEXCAN_DlcToDataLen(dlc); + env->rx_message_struct.dlc = FLEXCAN_DlcToDataLen(dlc); - rx_message_struct.id_type = FLEXCAN_MB_IDE_GET(u32TempAddr); + env->rx_message_struct.id_type = FLEXCAN_MB_IDE_GET(u32TempAddr); // message buffer 2th word - u32TempAddr = (uint32_t)FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 4U); + u32TempAddr = (uint32_t) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 4U); - if (rx_message_struct.id_type == FLEXCAN_ID_STD) { - rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr); + if (env->rx_message_struct.id_type == FLEXCAN_ID_STD) { + env->rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr); } else { - rx_message_struct.extended_id = FLEXCAN_MB_EXTID_GET(u32TempAddr); + env->rx_message_struct.extended_id = FLEXCAN_MB_EXTID_GET(u32TempAddr); } - // message buffer 3th word - uint32_t *pSrc = (uint32_t *) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U); - uint32_t *pDest = (uint32_t *) &rx_message_struct.data[0]; + uint8_t index = 0xFF; - uint32_t u32WordLen = rx_message_struct.dlc / 4U + (rx_message_struct.dlc % 4U > 0U ? 1U : 0U); + for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { - for (uint32_t u8Index = 0U; u8Index < u32WordLen; ++u8Index) { - REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); - } - - rx_message_struct.filter_index = 0; - - for (uint8_t i = 0; i < env->CountFilter_RX; ++i) { - - if ((rx_message_struct.id_type == FLEXCAN_ID_STD) && - (env->IdFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { - - if (rx_message_struct.standard_id == env->IdFilter_RX[i].u32RxCanId) { - - rx_message_struct.filter_index = env->IdFilter_RX[i].filter; - - CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i); + if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdSoftFilter_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; + index = i; + break; } } else { - if (rx_message_struct.extended_id == env->IdFilter_RX[i].u32RxCanId) { + if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { - if (rx_message_struct.extended_id == env->IdFilter_RX[i].u32RxCanId) { - - rx_message_struct.filter_index = env->IdFilter_RX[i].filter; - - CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i); + if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; + index = i; + break; } } @@ -342,6 +333,22 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ } + if (index != 0xFF) { + + // message buffer 3th word + uint32_t *pSrc = (uint32_t *) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U); + uint32_t *pDest = (uint32_t *) &env->rx_message_struct.data[0]; + + uint32_t u32WordLen = env->rx_message_struct.dlc / 4U + (env->rx_message_struct.dlc % 4U > 0U ? 1U : 0U); + + for (uint32_t u8Index = 0U; u8Index < u32WordLen; ++u8Index) { + REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); + } + + CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, index); + + } + ++env->pBufCounter;