Обновление

This commit is contained in:
cfif 2026-04-21 09:29:52 +03:00
parent 3d40d436b4
commit 0130fed611
2 changed files with 190 additions and 26 deletions

View File

@ -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,6 +135,26 @@ bool vCanSerialPortFrameDMAInit(
DMA_TransferErrorCallbackType DMA_ErrorCallback
);
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);

View File

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