diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index 9b11a2c..29cb371 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -67,6 +67,10 @@ typedef struct { osMessageQueueId_t txAccessQueue; + FLEXCAN_InitType tInitCfg; + FLEXCAN_MBConfigType tMbCfg; + FLEXCAN_InterruptType tIntCfg; + } tCanSerialPortFrameFlagchip; diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index ca7613b..534d67b 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -89,13 +89,9 @@ void vCanSerialPortFrameInit( ) { - FLEXCAN_ErrorType tRetVal; - FLEXCAN_InitType tInitCfg; - FLEXCAN_MBConfigType tMbCfg = {0}; uint32_t u32FuncClk; PCC_CtrlType bSP_PCC_Config; - FLEXCAN_InterruptType tIntCfg = {0}; env->can = CANx; env->CAN_INDEX = CAN_INDEX; @@ -108,26 +104,26 @@ void vCanSerialPortFrameInit( PCC_SetPcc(&bSP_PCC_Config); - BSP_CAN_INIT_CFG(&tInitCfg); - BSP_CAN_INIT_MBConfig(&tMbCfg); + BSP_CAN_INIT_CFG(&env->tInitCfg); + BSP_CAN_INIT_MBConfig(&env->tMbCfg); - tInitCfg.eBaudrate = canBaudRate; - tInitCfg.bEnRxFifo = TRUE; - tInitCfg.bEnDma = FALSE; + env->tInitCfg.eBaudrate = canBaudRate; + env->tInitCfg.bEnRxFifo = TRUE; + env->tInitCfg.bEnDma = FALSE; - tInitCfg.bEnFd = FALSE; - tInitCfg.bEnBrs = FALSE; - tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; + env->tInitCfg.bEnFd = FALSE; + env->tInitCfg.bEnBrs = FALSE; + env->tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]); - tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */ - tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; /* function clock frequency */ + env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */ + env->tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; /* function clock frequency */ - tInitCfg.eDirect = FLEXCAN_DIR_ENABLE_WITHOUT_TRIG; + env->tInitCfg.eDirect = FLEXCAN_DIR_ENABLE_WITHOUT_TRIG; - tRetVal = FLEXCAN_Init(CAN_INDEX, &tInitCfg); + tRetVal = FLEXCAN_Init(CAN_INDEX, &env->tInitCfg); if (tRetVal == FLEXCAN_ERROR_OK) { /* +++++++++++ can mb initial ++++++++++++ */ @@ -155,54 +151,54 @@ void vCanSerialPortFrameInit( env->pRxFilterFifoList[1].u32RxCanId = 0U; env->pRxFilterFifoList[1].u32RxCanIdMask = 0U; - tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; - tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); + env->tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; + env->tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); - tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); + env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); /* tx config */ - tMbCfg.u8TxMsgCnt = 3U; /* tx occupy 3 mb */ + env->tMbCfg.u8TxMsgCnt = 3U; /* tx occupy 3 mb */ - tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &tMbCfg); + tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg); if (CAN_ErrorInterrupt_CallBack == NULL) { - tIntCfg.bEnErrorInterrupt = 0U; - tIntCfg.pErrorNotify = NULL; + env->tIntCfg.bEnErrorInterrupt = 0U; + env->tIntCfg.pErrorNotify = NULL; - tIntCfg.bEnTxMBInterrupt = 0U; - tIntCfg.pRxMBNotify = NULL; + env->tIntCfg.bEnTxMBInterrupt = 0U; + env->tIntCfg.pRxMBNotify = NULL; - tIntCfg.bEnRxMBInterrupt = 0U; - tIntCfg.pRxFifoNotify = NULL; + env->tIntCfg.bEnRxMBInterrupt = 0U; + env->tIntCfg.pRxFifoNotify = NULL; - tIntCfg.bEnRxFifoInterrupt = 0U; - tIntCfg.pTxMBNotify = NULL; + env->tIntCfg.bEnRxFifoInterrupt = 0U; + env->tIntCfg.pTxMBNotify = NULL; } else { - tIntCfg.bEnErrorInterrupt = 1U; - tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; + env->tIntCfg.bEnErrorInterrupt = 1U; + env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; - tIntCfg.bEnTxMBInterrupt = 1U; - tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; + env->tIntCfg.bEnTxMBInterrupt = 1U; + env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; - tIntCfg.bEnRxMBInterrupt = 1U; - tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; + env->tIntCfg.bEnRxMBInterrupt = 1U; + env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; - tIntCfg.bEnRxFifoInterrupt = 1U; - tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; + env->tIntCfg.bEnRxFifoInterrupt = 1U; + env->tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; } - if ((tIntCfg.bEnErrorInterrupt) || - (tIntCfg.bEnTxMBInterrupt) || - (tIntCfg.bEnRxMBInterrupt) || - (tIntCfg.bEnRxFifoInterrupt)) { + if ((env->tIntCfg.bEnErrorInterrupt) || + (env->tIntCfg.bEnTxMBInterrupt) || + (env->tIntCfg.bEnRxMBInterrupt) || + (env->tIntCfg.bEnRxFifoInterrupt)) { NVIC_SetPriority(IRQ_CAN, CAN_PRIORITY); NVIC_EnableIRQ(IRQ_CAN); - FLEXCAN_SetInterrupt(CAN_INDEX, &tIntCfg); + FLEXCAN_SetInterrupt(CAN_INDEX, &env->tIntCfg); } FLEXCAN_Start(CAN_INDEX); /* Start CAN */ @@ -254,11 +250,9 @@ void vCanSerialPortFrameDMAInit( FLEXCAN_ErrorType tRetVal; - FLEXCAN_InitType tInitCfg; - FLEXCAN_MBConfigType tMbCfg = {0}; uint32_t u32FuncClk; PCC_CtrlType bSP_PCC_Config; - FLEXCAN_InterruptType tIntCfg = {0}; + env->g_u32RxDataIndex = 0; @@ -273,26 +267,26 @@ void vCanSerialPortFrameDMAInit( PCC_SetPcc(&bSP_PCC_Config); - BSP_CAN_INIT_CFG(&tInitCfg); - BSP_CAN_INIT_MBConfig(&tMbCfg); + BSP_CAN_INIT_CFG(&env->tInitCfg); + BSP_CAN_INIT_MBConfig(&env->tMbCfg); - tInitCfg.eBaudrate = canBaudRate; - tInitCfg.bEnRxFifo = TRUE; - tInitCfg.bEnDma = TRUE; + env->tInitCfg.eBaudrate = canBaudRate; + env->tInitCfg.bEnRxFifo = TRUE; + env->tInitCfg.bEnDma = TRUE; - tInitCfg.bEnFd = FALSE; - tInitCfg.bEnBrs = FALSE; - tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; + env->tInitCfg.bEnFd = FALSE; + env->tInitCfg.bEnBrs = FALSE; + env->tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]); - tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */ - tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; /* function clock frequency */ + env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */ + env->tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; /* function clock frequency */ - tInitCfg.eDirect = FLEXCAN_DIR_ENABLE_WITHOUT_TRIG; + env->tInitCfg.eDirect = FLEXCAN_DIR_ENABLE_WITHOUT_TRIG; - tRetVal = FLEXCAN_Init(CAN_INDEX, &tInitCfg); + tRetVal = FLEXCAN_Init(CAN_INDEX, &env->tInitCfg); if (tRetVal == FLEXCAN_ERROR_OK) { /* +++++++++++ can mb initial ++++++++++++ */ @@ -305,42 +299,42 @@ void vCanSerialPortFrameDMAInit( env->pRxFilterFifoList[1].u32RxCanId = 0U; env->pRxFilterFifoList[1].u32RxCanIdMask = 0U; - tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; - tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); + env->tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; + env->tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); - tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); + env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); /* tx config */ - tMbCfg.u8TxMsgCnt = 3U; /* tx occupy 3 mb */ + env->tMbCfg.u8TxMsgCnt = 3U; /* tx occupy 3 mb */ - tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &tMbCfg); + tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg); if (CAN_ErrorInterrupt_CallBack == NULL) { - tIntCfg.bEnErrorInterrupt = 0U; - tIntCfg.pErrorNotify = NULL; + env->tIntCfg.bEnErrorInterrupt = 0U; + env->tIntCfg.pErrorNotify = NULL; - tIntCfg.bEnTxMBInterrupt = 0U; - tIntCfg.pRxMBNotify = NULL; + env->tIntCfg.bEnTxMBInterrupt = 0U; + env->tIntCfg.pRxMBNotify = NULL; - tIntCfg.bEnRxMBInterrupt = 0U; - tIntCfg.pRxFifoNotify = NULL; + env->tIntCfg.bEnRxMBInterrupt = 0U; + env->tIntCfg.pRxFifoNotify = NULL; - tIntCfg.bEnRxFifoInterrupt = 0U; - tIntCfg.pTxMBNotify = NULL; + env->tIntCfg.bEnRxFifoInterrupt = 0U; + env->tIntCfg.pTxMBNotify = NULL; } else { - tIntCfg.bEnErrorInterrupt = 1U; - tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; + env->tIntCfg.bEnErrorInterrupt = 1U; + env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; - tIntCfg.bEnTxMBInterrupt = 1U; - tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; + env->tIntCfg.bEnTxMBInterrupt = 1U; + env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; - tIntCfg.bEnRxMBInterrupt = 1U; - tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; + env->tIntCfg.bEnRxMBInterrupt = 1U; + env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; - tIntCfg.bEnRxFifoInterrupt = 1U; - tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; + env->tIntCfg.bEnRxFifoInterrupt = 1U; + env->tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; } @@ -398,15 +392,15 @@ void vCanSerialPortFrameDMAInit( DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) RX_DMA_CHANNEL); - if ((tIntCfg.bEnErrorInterrupt) || - (tIntCfg.bEnTxMBInterrupt) || - (tIntCfg.bEnRxMBInterrupt) || - (tIntCfg.bEnRxFifoInterrupt)) { + if ((env->tIntCfg.bEnErrorInterrupt) || + (env->tIntCfg.bEnTxMBInterrupt) || + (env->tIntCfg.bEnRxMBInterrupt) || + (env->tIntCfg.bEnRxFifoInterrupt)) { NVIC_SetPriority(IRQ_CAN, CAN_PRIORITY); NVIC_EnableIRQ(IRQ_CAN); - FLEXCAN_SetInterrupt(CAN_INDEX, &tIntCfg); + FLEXCAN_SetInterrupt(CAN_INDEX, &env->tIntCfg); } @@ -436,6 +430,7 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ rx_message_struct.id_type = FLEXCAN_MB_IDE_GET(u32TempAddr); + if (rx_message_struct.id_type == FLEXCAN_ID_STD) { rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr); } else { @@ -451,6 +446,28 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); } + rx_message_struct.filter_index = 0xFF; + + 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; + } + + } else { + + if (rx_message_struct.extended_id == env->pRxFilterFifoList[i].u32RxCanId) { + rx_message_struct.filter_index = i; + } + + } + + + } + osMessageQueuePut(env->rxDataQueue, &rx_message_struct, 0x0, 0U); if (env->rxDataSnifferQueue) {