diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index ca196f7..e45ef48 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -68,7 +68,7 @@ typedef struct { uint32_t g_u32RxDataIndex; FLEXCAN_RxMbFilterType pRxMbFilterList[32]; -// FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; + FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; osMessageQueueId_t rxDataQueue[COUNT_QUEUE]; osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE]; @@ -116,8 +116,8 @@ bool vCanSerialPortFrameDMAInit( 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, @@ -135,7 +135,27 @@ bool vCanSerialPortFrameDMAInit( DMA_TransferErrorCallbackType DMA_ErrorCallback ); -void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg); +bool vCanSerialPortFrameMbInit( + tCanSerialPortFrameFlagchip *env, + FLEXCAN_Type *CANx, // FLEXCAN0 + uint8 CAN_INDEX, // CAN0 = 0 ... CAN3 = 3 + IRQn_Type IRQ_CAN, // FlexCAN0_IRQn ... FlexCAN3_IRQn + uint8 CAN_PRIORITY, + + const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, + uint8_t CountHardSoftFilter_RX, + + FLEXCAN_BaudType canBaudRate, + FLEXCAN_IdType canTypeFrame, + uint32_t canId, + FLEXCAN_ErrorInterruptCallBackType CAN_ErrorInterrupt_CallBack, + FLEXCAN_RxInterruptCallBackType CAN_RxInterrupt_CallBack, + FLEXCAN_RxInterruptCallBackType CAN_RxFifoInterrupt_CallBack, + FLEXCAN_TxInterruptCallBackType CAN_TxInterrupt_CallBack + +); + + void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg); void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf); diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 40a6951..aebd31d 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -83,8 +83,8 @@ bool vCanSerialPortFrameDMAInit( 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, @@ -124,7 +124,7 @@ bool vCanSerialPortFrameDMAInit( //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- -/* + uint32_t u32TargetAddr = (uint32_t) (DMA_BUF_RX); env->chnCfg_RX.pSrcBuffer = &(CANx->RAM[0]); @@ -160,7 +160,7 @@ bool vCanSerialPortFrameDMAInit( NVIC_EnableIRQ(IRQ_DMA_RX); DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) DMA_CHANNEL_RX); -*/ + //конец-----------------------------------DMA-RX-------------------------------------------------------------------- //конец-----------------------------------DMA-RX-------------------------------------------------------------------- @@ -181,11 +181,11 @@ bool vCanSerialPortFrameDMAInit( env->tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eDataBaud = canBaudRate; -// env->tInitCfg.bEnRxFifo = TRUE; - env->tInitCfg.bEnRxFifo = FALSE; + env->tInitCfg.bEnRxFifo = TRUE; +// env->tInitCfg.bEnRxFifo = FALSE; -// env->tInitCfg.bEnDma = TRUE; - env->tInitCfg.bEnDma = FALSE; + env->tInitCfg.bEnDma = TRUE; +// env->tInitCfg.bEnDma = FALSE; env->tInitCfg.bEnFd = FALSE; env->tInitCfg.bEnBrs = FALSE; @@ -196,26 +196,16 @@ bool vCanSerialPortFrameDMAInit( env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; // functional clock env->tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; // function clock frequency -// env->tInitCfg.eDirect = FLEXCAN_DIR_ENABLE_WITHOUT_TRIG; + env->tInitCfg.eDirect = FLEXCAN_DIR_ENABLE_WITHOUT_TRIG; tRetVal = FLEXCAN_Init(CAN_INDEX, &env->tInitCfg); if (tRetVal == FLEXCAN_ERROR_OK) { - 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; -// 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; @@ -224,7 +214,7 @@ bool vCanSerialPortFrameDMAInit( env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList; env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX; -*/ + env->tMbCfg.pRxFilterFifoList = NULL; env->tMbCfg.u8RxFilterFifoCnt = 0; @@ -300,6 +290,160 @@ bool vCanSerialPortFrameDMAInit( } +bool vCanSerialPortFrameMbInit( + tCanSerialPortFrameFlagchip *env, + FLEXCAN_Type *CANx, // FLEXCAN0 + uint8 CAN_INDEX, // CAN0 = 0 ... CAN3 = 3 + IRQn_Type IRQ_CAN, // FlexCAN0_IRQn ... FlexCAN3_IRQn + uint8 CAN_PRIORITY, + + const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, + uint8_t CountHardSoftFilter_RX, + + FLEXCAN_BaudType canBaudRate, + FLEXCAN_IdType canTypeFrame, + uint32_t canId, + FLEXCAN_ErrorInterruptCallBackType CAN_ErrorInterrupt_CallBack, + FLEXCAN_RxInterruptCallBackType CAN_RxInterrupt_CallBack, + FLEXCAN_RxInterruptCallBackType CAN_RxFifoInterrupt_CallBack, + FLEXCAN_TxInterruptCallBackType CAN_TxInterrupt_CallBack + +) { + env->g_u32RxDataIndex = 0; + env->can = CANx; + env->CAN_INDEX = CAN_INDEX; +// env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; + env->IdHardSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardSoftFilter_RX; + env->CountHardSoftFilter_RX = CountHardSoftFilter_RX; + env->canBaudRate = canBaudRate; + env->IRQ_CAN = IRQ_CAN; + + env->CAN_ErrorInterrupt_CallBack = CAN_ErrorInterrupt_CallBack; + env->CAN_RxInterrupt_CallBack = CAN_RxInterrupt_CallBack; + env->CAN_RxFifoInterrupt_CallBack = CAN_RxFifoInterrupt_CallBack; + env->CAN_TxInterrupt_CallBack = CAN_TxInterrupt_CallBack; +// env->DMA_TransferCompleteCallback = DMA_TransferCompleteCallback; +// env->DMA_ErrorCallback = DMA_ErrorCallback; + + env->access = osMutexNew(NULL); + + + //начало------------------------------------CAN--------------------------------------------------------------------- + //начало------------------------------------CAN--------------------------------------------------------------------- + //начало------------------------------------CAN--------------------------------------------------------------------- + + FLEXCAN_ErrorType tRetVal; + uint32_t u32FuncClk; + + tRetVal = FLEXCAN_DeInit(CAN_INDEX); + + BSP_CAN_INIT_CFG(&env->tInitCfg); + BSP_CAN_INIT_MBConfig(&env->tMbCfg); + + env->tInitCfg.eBaudrate = canBaudRate; + env->tInitCfg.eDataBaud = canBaudRate; +// env->tInitCfg.bEnRxFifo = TRUE; + env->tInitCfg.bEnRxFifo = FALSE; + +// env->tInitCfg.bEnDma = TRUE; + env->tInitCfg.bEnDma = FALSE; + + env->tInitCfg.bEnFd = FALSE; + env->tInitCfg.bEnBrs = FALSE; + env->tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; + + u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]); + + env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; // functional clock + env->tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; // function clock frequency + + tRetVal = FLEXCAN_Init(CAN_INDEX, &env->tInitCfg); + + if (tRetVal == FLEXCAN_ERROR_OK) { + + 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.pRxFilterFifoList = NULL; + env->tMbCfg.u8RxFilterFifoCnt = 0; + + env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); + + // tx config + env->tMbCfg.u8TxMsgCnt = 3U; // tx occupy 3 mb + + tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg); + + if (CAN_ErrorInterrupt_CallBack == NULL) { + env->tIntCfg.bEnErrorInterrupt = 0U; + env->tIntCfg.pErrorNotify = NULL; + + env->tIntCfg.bEnTxMBInterrupt = 0U; + env->tIntCfg.pTxMBNotify = NULL; + + env->tIntCfg.bEnRxMBInterrupt = 0U; + env->tIntCfg.pRxMBNotify = NULL; + + env->tIntCfg.bEnRxFifoInterrupt = 0U; + env->tIntCfg.pRxFifoNotify = NULL; + + } else { + env->tIntCfg.bEnErrorInterrupt = 1U; + env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; + + env->tIntCfg.bEnTxMBInterrupt = 0U; + env->tIntCfg.pTxMBNotify = NULL; + + env->tIntCfg.bEnRxMBInterrupt = 1U; + env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; + + env->tIntCfg.bEnRxFifoInterrupt = 0U; + env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; + + } + + + 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, &env->tIntCfg); + + } + + if (!env->reInit) { + env->reInit = true; + vCanSerialPortFrameInitStructure(env, 10, 0); + + CanSerialPortFrameSetType(env, canTypeFrame); + CanSerialPortFrameSetId(env, canId); + + env->canBaudRate = canBaudRate; + } + + FLEXCAN_Start(CAN_INDEX); // Start CAN + + } else { + return false; + } + + + return true; + //конец------------------------------------CAN---------------------------------------------------------------------- + //конец------------------------------------CAN---------------------------------------------------------------------- + //конец------------------------------------CAN---------------------------------------------------------------------- +} + bool vCanSerialPortSetMaskCount(tCanSerialPortFrameFlagchip *env, uint8_t maskCount) {