Обновление
This commit is contained in:
parent
3d40d436b4
commit
0130fed611
|
|
@ -68,7 +68,7 @@ typedef struct {
|
||||||
uint32_t g_u32RxDataIndex;
|
uint32_t g_u32RxDataIndex;
|
||||||
|
|
||||||
FLEXCAN_RxMbFilterType pRxMbFilterList[32];
|
FLEXCAN_RxMbFilterType pRxMbFilterList[32];
|
||||||
// FLEXCAN_RxMbFilterType pRxFilterFifoList[32];
|
FLEXCAN_RxMbFilterType pRxFilterFifoList[32];
|
||||||
|
|
||||||
osMessageQueueId_t rxDataQueue[COUNT_QUEUE];
|
osMessageQueueId_t rxDataQueue[COUNT_QUEUE];
|
||||||
osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE];
|
osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE];
|
||||||
|
|
@ -116,8 +116,8 @@ bool vCanSerialPortFrameDMAInit(
|
||||||
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX,
|
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX,
|
||||||
uint8_t CountHardSoftFilter_RX,
|
uint8_t CountHardSoftFilter_RX,
|
||||||
|
|
||||||
// const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
|
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
|
||||||
// uint8_t CountFilterFifo_RX,
|
uint8_t CountFilterFifo_RX,
|
||||||
|
|
||||||
IRQn_Type IRQ_DMA_RX,
|
IRQn_Type IRQ_DMA_RX,
|
||||||
uint8_t IRQ_DMA_PRIORITY_RX,
|
uint8_t IRQ_DMA_PRIORITY_RX,
|
||||||
|
|
@ -135,6 +135,26 @@ bool vCanSerialPortFrameDMAInit(
|
||||||
DMA_TransferErrorCallbackType DMA_ErrorCallback
|
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 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);
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,8 @@ bool vCanSerialPortFrameDMAInit(
|
||||||
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX,
|
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX,
|
||||||
uint8_t CountHardSoftFilter_RX,
|
uint8_t CountHardSoftFilter_RX,
|
||||||
|
|
||||||
// const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
|
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
|
||||||
// uint8_t CountFilterFifo_RX,
|
uint8_t CountFilterFifo_RX,
|
||||||
|
|
||||||
IRQn_Type IRQ_DMA_RX,
|
IRQn_Type IRQ_DMA_RX,
|
||||||
uint8_t IRQ_DMA_PRIORITY_RX,
|
uint8_t IRQ_DMA_PRIORITY_RX,
|
||||||
|
|
@ -124,7 +124,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]);
|
||||||
|
|
@ -160,7 +160,7 @@ bool vCanSerialPortFrameDMAInit(
|
||||||
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--------------------------------------------------------------------
|
||||||
|
|
@ -181,11 +181,11 @@ 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.bEnRxFifo = FALSE;
|
// env->tInitCfg.bEnRxFifo = FALSE;
|
||||||
|
|
||||||
// env->tInitCfg.bEnDma = TRUE;
|
env->tInitCfg.bEnDma = TRUE;
|
||||||
env->tInitCfg.bEnDma = FALSE;
|
// env->tInitCfg.bEnDma = FALSE;
|
||||||
|
|
||||||
env->tInitCfg.bEnFd = FALSE;
|
env->tInitCfg.bEnFd = FALSE;
|
||||||
env->tInitCfg.bEnBrs = FALSE;
|
env->tInitCfg.bEnBrs = FALSE;
|
||||||
|
|
@ -196,26 +196,16 @@ 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);
|
||||||
|
|
||||||
if (tRetVal == FLEXCAN_ERROR_OK) {
|
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.pRxFilterMBList = NULL;
|
||||||
env->tMbCfg.u8RxFilterMBCnt = CountHardSoftFilter_RX;
|
env->tMbCfg.u8RxFilterMBCnt = 0;
|
||||||
|
|
||||||
// env->tMbCfg.pRxFilterMBList = NULL;
|
|
||||||
// env->tMbCfg.u8RxFilterMBCnt = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
for (uint8_t i = 0; i < CountFilterFifo_RX; ++i) {
|
for (uint8_t i = 0; i < CountFilterFifo_RX; ++i) {
|
||||||
env->pRxFilterFifoList[i].eRxFrameType = IdFilterFifo_RX[i].eRxFrameType;
|
env->pRxFilterFifoList[i].eRxFrameType = IdFilterFifo_RX[i].eRxFrameType;
|
||||||
env->pRxFilterFifoList[i].u32RxCanId = IdFilterFifo_RX[i].u32RxCanId;
|
env->pRxFilterFifoList[i].u32RxCanId = IdFilterFifo_RX[i].u32RxCanId;
|
||||||
|
|
@ -224,7 +214,7 @@ bool vCanSerialPortFrameDMAInit(
|
||||||
|
|
||||||
env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList;
|
env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList;
|
||||||
env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX;
|
env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX;
|
||||||
*/
|
|
||||||
env->tMbCfg.pRxFilterFifoList = NULL;
|
env->tMbCfg.pRxFilterFifoList = NULL;
|
||||||
env->tMbCfg.u8RxFilterFifoCnt = 0;
|
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)
|
bool vCanSerialPortSetMaskCount(tCanSerialPortFrameFlagchip *env, uint8_t maskCount)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue