Обновление

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;
FLEXCAN_InitType tInitCfg;
FLEXCAN_MBConfigType tMbCfg;
FLEXCAN_InterruptType tIntCfg;
} tCanSerialPortFrameFlagchip;

View File

@ -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) {