Обновление

This commit is contained in:
cfif 2025-10-09 10:58:41 +03:00
parent fe7e93fa2a
commit 2abb70ff24
2 changed files with 104 additions and 83 deletions

View File

@ -67,6 +67,10 @@ typedef struct {
osMessageQueueId_t txAccessQueue; osMessageQueueId_t txAccessQueue;
FLEXCAN_InitType tInitCfg;
FLEXCAN_MBConfigType tMbCfg;
FLEXCAN_InterruptType tIntCfg;
} tCanSerialPortFrameFlagchip; } tCanSerialPortFrameFlagchip;

View File

@ -89,13 +89,9 @@ void vCanSerialPortFrameInit(
) { ) {
FLEXCAN_ErrorType tRetVal; FLEXCAN_ErrorType tRetVal;
FLEXCAN_InitType tInitCfg;
FLEXCAN_MBConfigType tMbCfg = {0};
uint32_t u32FuncClk; uint32_t u32FuncClk;
PCC_CtrlType bSP_PCC_Config; PCC_CtrlType bSP_PCC_Config;
FLEXCAN_InterruptType tIntCfg = {0};
env->can = CANx; env->can = CANx;
env->CAN_INDEX = CAN_INDEX; env->CAN_INDEX = CAN_INDEX;
@ -108,26 +104,26 @@ void vCanSerialPortFrameInit(
PCC_SetPcc(&bSP_PCC_Config); PCC_SetPcc(&bSP_PCC_Config);
BSP_CAN_INIT_CFG(&tInitCfg); BSP_CAN_INIT_CFG(&env->tInitCfg);
BSP_CAN_INIT_MBConfig(&tMbCfg); BSP_CAN_INIT_MBConfig(&env->tMbCfg);
tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eBaudrate = canBaudRate;
tInitCfg.bEnRxFifo = TRUE; env->tInitCfg.bEnRxFifo = TRUE;
tInitCfg.bEnDma = FALSE; env->tInitCfg.bEnDma = FALSE;
tInitCfg.bEnFd = FALSE; env->tInitCfg.bEnFd = FALSE;
tInitCfg.bEnBrs = FALSE; env->tInitCfg.bEnBrs = FALSE;
tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; env->tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8;
u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]); u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]);
tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */ env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */
tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; /* function clock frequency */ 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) { if (tRetVal == FLEXCAN_ERROR_OK) {
/* +++++++++++ can mb initial ++++++++++++ */ /* +++++++++++ can mb initial ++++++++++++ */
@ -155,54 +151,54 @@ void vCanSerialPortFrameInit(
env->pRxFilterFifoList[1].u32RxCanId = 0U; env->pRxFilterFifoList[1].u32RxCanId = 0U;
env->pRxFilterFifoList[1].u32RxCanIdMask = 0U; env->pRxFilterFifoList[1].u32RxCanIdMask = 0U;
tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; env->tMbCfg.pRxFilterMBList = env->pRxFilterFifoList;
tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); 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 */ /* 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) { if (CAN_ErrorInterrupt_CallBack == NULL) {
tIntCfg.bEnErrorInterrupt = 0U; env->tIntCfg.bEnErrorInterrupt = 0U;
tIntCfg.pErrorNotify = NULL; env->tIntCfg.pErrorNotify = NULL;
tIntCfg.bEnTxMBInterrupt = 0U; env->tIntCfg.bEnTxMBInterrupt = 0U;
tIntCfg.pRxMBNotify = NULL; env->tIntCfg.pRxMBNotify = NULL;
tIntCfg.bEnRxMBInterrupt = 0U; env->tIntCfg.bEnRxMBInterrupt = 0U;
tIntCfg.pRxFifoNotify = NULL; env->tIntCfg.pRxFifoNotify = NULL;
tIntCfg.bEnRxFifoInterrupt = 0U; env->tIntCfg.bEnRxFifoInterrupt = 0U;
tIntCfg.pTxMBNotify = NULL; env->tIntCfg.pTxMBNotify = NULL;
} else { } else {
tIntCfg.bEnErrorInterrupt = 1U; env->tIntCfg.bEnErrorInterrupt = 1U;
tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack;
tIntCfg.bEnTxMBInterrupt = 1U; env->tIntCfg.bEnTxMBInterrupt = 1U;
tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack;
tIntCfg.bEnRxMBInterrupt = 1U; env->tIntCfg.bEnRxMBInterrupt = 1U;
tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack;
tIntCfg.bEnRxFifoInterrupt = 1U; env->tIntCfg.bEnRxFifoInterrupt = 1U;
tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; env->tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack;
} }
if ((tIntCfg.bEnErrorInterrupt) || if ((env->tIntCfg.bEnErrorInterrupt) ||
(tIntCfg.bEnTxMBInterrupt) || (env->tIntCfg.bEnTxMBInterrupt) ||
(tIntCfg.bEnRxMBInterrupt) || (env->tIntCfg.bEnRxMBInterrupt) ||
(tIntCfg.bEnRxFifoInterrupt)) { (env->tIntCfg.bEnRxFifoInterrupt)) {
NVIC_SetPriority(IRQ_CAN, CAN_PRIORITY); NVIC_SetPriority(IRQ_CAN, CAN_PRIORITY);
NVIC_EnableIRQ(IRQ_CAN); NVIC_EnableIRQ(IRQ_CAN);
FLEXCAN_SetInterrupt(CAN_INDEX, &tIntCfg); FLEXCAN_SetInterrupt(CAN_INDEX, &env->tIntCfg);
} }
FLEXCAN_Start(CAN_INDEX); /* Start CAN */ FLEXCAN_Start(CAN_INDEX); /* Start CAN */
@ -254,11 +250,9 @@ void vCanSerialPortFrameDMAInit(
FLEXCAN_ErrorType tRetVal; FLEXCAN_ErrorType tRetVal;
FLEXCAN_InitType tInitCfg;
FLEXCAN_MBConfigType tMbCfg = {0};
uint32_t u32FuncClk; uint32_t u32FuncClk;
PCC_CtrlType bSP_PCC_Config; PCC_CtrlType bSP_PCC_Config;
FLEXCAN_InterruptType tIntCfg = {0};
env->g_u32RxDataIndex = 0; env->g_u32RxDataIndex = 0;
@ -273,26 +267,26 @@ void vCanSerialPortFrameDMAInit(
PCC_SetPcc(&bSP_PCC_Config); PCC_SetPcc(&bSP_PCC_Config);
BSP_CAN_INIT_CFG(&tInitCfg); BSP_CAN_INIT_CFG(&env->tInitCfg);
BSP_CAN_INIT_MBConfig(&tMbCfg); BSP_CAN_INIT_MBConfig(&env->tMbCfg);
tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eBaudrate = canBaudRate;
tInitCfg.bEnRxFifo = TRUE; env->tInitCfg.bEnRxFifo = TRUE;
tInitCfg.bEnDma = TRUE; env->tInitCfg.bEnDma = TRUE;
tInitCfg.bEnFd = FALSE; env->tInitCfg.bEnFd = FALSE;
tInitCfg.bEnBrs = FALSE; env->tInitCfg.bEnBrs = FALSE;
tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8; env->tInitCfg.eMbDataWidth = FLEXCAN_DATAWIDTH_8;
u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]); u32FuncClk = PCC_GetPccFunctionClock(s_ePccCanTable[CAN_INDEX]);
tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */ env->tInitCfg.eClkSrcSel = FLEXCAN_CLOCK_FUNCTION; /* functional clock */
tInitCfg.eClkSrcHz = (FLEXCAN_BaudClkType) u32FuncClk; /* function clock frequency */ 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) { if (tRetVal == FLEXCAN_ERROR_OK) {
/* +++++++++++ can mb initial ++++++++++++ */ /* +++++++++++ can mb initial ++++++++++++ */
@ -305,42 +299,42 @@ void vCanSerialPortFrameDMAInit(
env->pRxFilterFifoList[1].u32RxCanId = 0U; env->pRxFilterFifoList[1].u32RxCanId = 0U;
env->pRxFilterFifoList[1].u32RxCanIdMask = 0U; env->pRxFilterFifoList[1].u32RxCanIdMask = 0U;
tMbCfg.pRxFilterMBList = env->pRxFilterFifoList; env->tMbCfg.pRxFilterMBList = env->pRxFilterFifoList;
tMbCfg.u8RxFilterMBCnt = sizeof(env->pRxFilterFifoList) / sizeof(env->pRxFilterFifoList[0]); 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 */ /* 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) { if (CAN_ErrorInterrupt_CallBack == NULL) {
tIntCfg.bEnErrorInterrupt = 0U; env->tIntCfg.bEnErrorInterrupt = 0U;
tIntCfg.pErrorNotify = NULL; env->tIntCfg.pErrorNotify = NULL;
tIntCfg.bEnTxMBInterrupt = 0U; env->tIntCfg.bEnTxMBInterrupt = 0U;
tIntCfg.pRxMBNotify = NULL; env->tIntCfg.pRxMBNotify = NULL;
tIntCfg.bEnRxMBInterrupt = 0U; env->tIntCfg.bEnRxMBInterrupt = 0U;
tIntCfg.pRxFifoNotify = NULL; env->tIntCfg.pRxFifoNotify = NULL;
tIntCfg.bEnRxFifoInterrupt = 0U; env->tIntCfg.bEnRxFifoInterrupt = 0U;
tIntCfg.pTxMBNotify = NULL; env->tIntCfg.pTxMBNotify = NULL;
} else { } else {
tIntCfg.bEnErrorInterrupt = 1U; env->tIntCfg.bEnErrorInterrupt = 1U;
tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack; env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack;
tIntCfg.bEnTxMBInterrupt = 1U; env->tIntCfg.bEnTxMBInterrupt = 1U;
tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack; env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack;
tIntCfg.bEnRxMBInterrupt = 1U; env->tIntCfg.bEnRxMBInterrupt = 1U;
tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack;
tIntCfg.bEnRxFifoInterrupt = 1U; env->tIntCfg.bEnRxFifoInterrupt = 1U;
tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack; env->tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack;
} }
@ -398,15 +392,15 @@ void vCanSerialPortFrameDMAInit(
DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) RX_DMA_CHANNEL); DMA_StartChannel(DMA_INSTANCE_0, (DMA_ChannelType) RX_DMA_CHANNEL);
if ((tIntCfg.bEnErrorInterrupt) || if ((env->tIntCfg.bEnErrorInterrupt) ||
(tIntCfg.bEnTxMBInterrupt) || (env->tIntCfg.bEnTxMBInterrupt) ||
(tIntCfg.bEnRxMBInterrupt) || (env->tIntCfg.bEnRxMBInterrupt) ||
(tIntCfg.bEnRxFifoInterrupt)) { (env->tIntCfg.bEnRxFifoInterrupt)) {
NVIC_SetPriority(IRQ_CAN, CAN_PRIORITY); NVIC_SetPriority(IRQ_CAN, CAN_PRIORITY);
NVIC_EnableIRQ(IRQ_CAN); 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); rx_message_struct.id_type = FLEXCAN_MB_IDE_GET(u32TempAddr);
if (rx_message_struct.id_type == FLEXCAN_ID_STD) { if (rx_message_struct.id_type == FLEXCAN_ID_STD) {
rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr); rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr);
} else { } else {
@ -451,6 +446,28 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); 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); osMessageQueuePut(env->rxDataQueue, &rx_message_struct, 0x0, 0U);
if (env->rxDataSnifferQueue) { if (env->rxDataSnifferQueue) {