diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index b5c674a..c491d7d 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -129,6 +129,7 @@ bool vCanSerialPortFrameDMAInit( void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg); void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf); +void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, FLEXCAN_RxMsgType *pRxCfg); void CanSerialPortFrameSetId(tCanSerialPortFrameFlagchip *env, uint32_t id); diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 8cfad2e..de68849 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -6,10 +6,12 @@ #include "memory.h" -#define CAN_USED_NUM 2U // Количество CAN -#define CAN_RECEIVE_MB_NUM 32 // +#define CAN_USED_NUM 2U // Количество CAN +#define CAN_RECEIVE_MB_NUM 128 // Количество mailbox на один CAN + static FLEXCAN_RxMsgType s_aaRxDataBuf[CAN_USED_NUM][CAN_RECEIVE_MB_NUM]; -#define CAN_GET_BUFFER(index) s_aaRxDataBuf[index/2] + +#define CAN_GET_BUFFER(index) (FLEXCAN_RxMsgType*)s_aaRxDataBuf[index] static const PCC_ClkSrcType s_ePccCanTable[] = { @@ -110,7 +112,7 @@ bool vCanSerialPortFrameDMAInit( //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- - +/* uint32_t u32TargetAddr = (uint32_t) (DMA_BUF_RX); env->chnCfg_RX.pSrcBuffer = &(CANx->RAM[0]); @@ -142,12 +144,11 @@ bool vCanSerialPortFrameDMAInit( DMA_InitChannelInterrupt(DMA_INSTANCE_0, (DMA_ChannelType) DMA_CHANNEL_RX, &env->interruptCfg_RX); -// NVIC_SetPriority(DMA_Error_IRQn, IRQ_DMA_PRIORITY_RX); NVIC_SetPriority(IRQ_DMA_RX, IRQ_DMA_PRIORITY_RX); NVIC_EnableIRQ(IRQ_DMA_RX); DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) DMA_CHANNEL_RX); - +*/ //конец-----------------------------------DMA-RX-------------------------------------------------------------------- //конец-----------------------------------DMA-RX-------------------------------------------------------------------- @@ -169,7 +170,9 @@ bool vCanSerialPortFrameDMAInit( env->tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eDataBaud = canBaudRate; env->tInitCfg.bEnRxFifo = TRUE; - env->tInitCfg.bEnDma = TRUE; + +// env->tInitCfg.bEnDma = TRUE; + env->tInitCfg.bEnDma = FALSE; env->tInitCfg.bEnFd = FALSE; env->tInitCfg.bEnBrs = FALSE; @@ -180,7 +183,7 @@ 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); @@ -211,26 +214,26 @@ bool vCanSerialPortFrameDMAInit( env->tIntCfg.pErrorNotify = NULL; env->tIntCfg.bEnTxMBInterrupt = 0U; - env->tIntCfg.pRxMBNotify = NULL; + env->tIntCfg.pTxMBNotify = NULL; env->tIntCfg.bEnRxMBInterrupt = 0U; - env->tIntCfg.pRxFifoNotify = NULL; + env->tIntCfg.pRxMBNotify = NULL; env->tIntCfg.bEnRxFifoInterrupt = 0U; - env->tIntCfg.pTxMBNotify = NULL; + env->tIntCfg.pRxFifoNotify = NULL; } else { env->tIntCfg.bEnErrorInterrupt = 1U; env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; - env->tIntCfg.bEnTxMBInterrupt = 1U; - env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; + env->tIntCfg.bEnTxMBInterrupt = 0U; + env->tIntCfg.pTxMBNotify = NULL; - env->tIntCfg.bEnRxMBInterrupt = 1U; - env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; + env->tIntCfg.bEnRxMBInterrupt = 0U; + env->tIntCfg.pRxMBNotify = NULL; env->tIntCfg.bEnRxFifoInterrupt = 1U; - env->tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; + env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; } @@ -283,6 +286,62 @@ static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can } } +void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, FLEXCAN_RxMsgType *pRxCfg) { + if (pRxCfg->eDataType == FLEXCAN_FRAME_DATA) { + + env->rx_message_struct.dlc = pRxCfg->u32DataLen; + + if (env->rx_message_struct.id_type == FLEXCAN_ID_STD) { + env->rx_message_struct.standard_id = pRxCfg->u32CanId; + } else { + env->rx_message_struct.extended_id = pRxCfg->u32CanId; + } + + uint8_t index = 0xFF; + + 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.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdSoftFilter_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->IdSoftFilter_RX[i].u32RxCanId) { + env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; + index = i; + break; + } + + } + + } + + } + + + if (index != 0xFF) { + memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen); + CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdSoftFilter_RX[index].filter); + } + + if (env->CountSoftFilter_RX == 0) { + memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen); + CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, 0); + } + + + + + } +} + void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) { // message buffer 1th word