Обновление

This commit is contained in:
cfif 2026-04-17 17:24:01 +03:00
parent 6a429ecd78
commit bf6303a3ef
2 changed files with 76 additions and 16 deletions

View File

@ -129,6 +129,7 @@ bool vCanSerialPortFrameDMAInit(
void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg); void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg);
void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf); void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf);
void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, FLEXCAN_RxMsgType *pRxCfg);
void CanSerialPortFrameSetId(tCanSerialPortFrameFlagchip *env, uint32_t id); void CanSerialPortFrameSetId(tCanSerialPortFrameFlagchip *env, uint32_t id);

View File

@ -7,9 +7,11 @@
#define CAN_USED_NUM 2U // Количество CAN #define CAN_USED_NUM 2U // Количество CAN
#define CAN_RECEIVE_MB_NUM 32 // #define CAN_RECEIVE_MB_NUM 128 // Количество mailbox на один CAN
static FLEXCAN_RxMsgType s_aaRxDataBuf[CAN_USED_NUM][CAN_RECEIVE_MB_NUM]; 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[] = static const PCC_ClkSrcType s_ePccCanTable[] =
{ {
@ -110,7 +112,7 @@ bool vCanSerialPortFrameDMAInit(
//начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX-------------------------------------------------------------------
//начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX-------------------------------------------------------------------
//начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX-------------------------------------------------------------------
/*
uint32_t u32TargetAddr = (uint32_t) (DMA_BUF_RX); uint32_t u32TargetAddr = (uint32_t) (DMA_BUF_RX);
env->chnCfg_RX.pSrcBuffer = &(CANx->RAM[0]); 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); 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_SetPriority(IRQ_DMA_RX, IRQ_DMA_PRIORITY_RX);
NVIC_EnableIRQ(IRQ_DMA_RX); NVIC_EnableIRQ(IRQ_DMA_RX);
DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) DMA_CHANNEL_RX); DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) DMA_CHANNEL_RX);
*/
//конец-----------------------------------DMA-RX-------------------------------------------------------------------- //конец-----------------------------------DMA-RX--------------------------------------------------------------------
//конец-----------------------------------DMA-RX-------------------------------------------------------------------- //конец-----------------------------------DMA-RX--------------------------------------------------------------------
@ -169,7 +170,9 @@ bool vCanSerialPortFrameDMAInit(
env->tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eBaudrate = canBaudRate;
env->tInitCfg.eDataBaud = canBaudRate; env->tInitCfg.eDataBaud = canBaudRate;
env->tInitCfg.bEnRxFifo = TRUE; env->tInitCfg.bEnRxFifo = TRUE;
env->tInitCfg.bEnDma = TRUE;
// env->tInitCfg.bEnDma = TRUE;
env->tInitCfg.bEnDma = FALSE;
env->tInitCfg.bEnFd = FALSE; env->tInitCfg.bEnFd = FALSE;
env->tInitCfg.bEnBrs = FALSE; env->tInitCfg.bEnBrs = FALSE;
@ -180,7 +183,7 @@ bool vCanSerialPortFrameDMAInit(
env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; // functional clock env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; // functional clock
env->tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; // function clock frequency 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); tRetVal = FLEXCAN_Init(CAN_INDEX, &env->tInitCfg);
@ -211,26 +214,26 @@ bool vCanSerialPortFrameDMAInit(
env->tIntCfg.pErrorNotify = NULL; env->tIntCfg.pErrorNotify = NULL;
env->tIntCfg.bEnTxMBInterrupt = 0U; env->tIntCfg.bEnTxMBInterrupt = 0U;
env->tIntCfg.pRxMBNotify = NULL; env->tIntCfg.pTxMBNotify = NULL;
env->tIntCfg.bEnRxMBInterrupt = 0U; env->tIntCfg.bEnRxMBInterrupt = 0U;
env->tIntCfg.pRxFifoNotify = NULL; env->tIntCfg.pRxMBNotify = NULL;
env->tIntCfg.bEnRxFifoInterrupt = 0U; env->tIntCfg.bEnRxFifoInterrupt = 0U;
env->tIntCfg.pTxMBNotify = NULL; env->tIntCfg.pRxFifoNotify = NULL;
} else { } else {
env->tIntCfg.bEnErrorInterrupt = 1U; env->tIntCfg.bEnErrorInterrupt = 1U;
env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack;
env->tIntCfg.bEnTxMBInterrupt = 1U; env->tIntCfg.bEnTxMBInterrupt = 0U;
env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; env->tIntCfg.pTxMBNotify = NULL;
env->tIntCfg.bEnRxMBInterrupt = 1U; env->tIntCfg.bEnRxMBInterrupt = 0U;
env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; env->tIntCfg.pRxMBNotify = NULL;
env->tIntCfg.bEnRxFifoInterrupt = 1U; 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) { void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) {
// message buffer 1th word // message buffer 1th word