diff --git a/CanPorts.c b/CanPorts.c index 24da655..5eda34f 100644 --- a/CanPorts.c +++ b/CanPorts.c @@ -13,6 +13,7 @@ tCanPorts CAN_PORTS; + #if (CAN_DMA_EN == 1) typedef struct { @@ -280,7 +281,7 @@ static bool vCanPort_InitCan1() { &CAN_PORTS.Can1, FLEXCAN1, - 0, // CAN0 = 0 ... CAN3 = 3 + 1, // CAN0 = 0 ... CAN3 = 3 FlexCAN1_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn 0xFF, @@ -375,4 +376,380 @@ void CAN2_IRQHandler(void) { void CAN3_IRQHandler(void) { FLEXCAN_IRQHandler(3U); -} \ No newline at end of file +} + + +/* +#if (CAN_DMA_EN == 1) + +typedef struct { + uint32_t u32CanRAM[4]; +} Can_RamType; + +#define size_aRxDataBuf 16 +ALIGN(256) Can_RamType g_aRxDataBufCan0[size_aRxDataBuf]; // dma ring buffer size is 256 +ALIGN(256) Can_RamType g_aRxDataBufCan1[size_aRxDataBuf]; // dma ring buffer size is 256 + +static void DMA_TransferCompleteCallbackCan0(void) { + CanSerialPortFrameIrqRxProcessing(CAN_PORTS.Can0_IO.env, (uint32_t *) &g_aRxDataBufCan0[0]); +} + +static void DMA_TransferCompleteCallbackCan1(void) { + CanSerialPortFrameIrqRxProcessing(CAN_PORTS.Can1_IO.env, (uint32_t *) &g_aRxDataBufCan1[0]); +} +#else + +static void CAN0_ErrorInterrupt_CallBack(uint8_t u8CanIndex, FLEXCAN_ErrorInfoType *pErrorInfo) { + FLEXCAN_ClrErrorInfo(u8CanIndex, pErrorInfo); + PROCESS_UNUSED_VAR(u8CanIndex); + PROCESS_UNUSED_VAR(pErrorInfo); +} + +static void CAN0_RxInterrupt_CallBack(uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg) { + CanSerialPortFrameIrqRxProcessingNO_DMA(CAN_PORTS.Can0_IO.env, pRxCfg); +} + +static void CAN0_RxFifoInterrupt_CallBack(uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg) { + CanSerialPortFrameIrqRxProcessingNO_DMA(CAN_PORTS.Can0_IO.env, pRxCfg); +} + + +static void CAN1_ErrorInterrupt_CallBack(uint8_t u8CanIndex, FLEXCAN_ErrorInfoType *pErrorInfo) { + FLEXCAN_ClrErrorInfo(u8CanIndex, pErrorInfo); + PROCESS_UNUSED_VAR(u8CanIndex); + PROCESS_UNUSED_VAR(pErrorInfo); +} + +static void CAN1_RxInterrupt_CallBack(uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg) { + CanSerialPortFrameIrqRxProcessingNO_DMA(CAN_PORTS.Can1_IO.env, pRxCfg); +} + +static void CAN1_RxFifoInterrupt_CallBack(uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg) { + CanSerialPortFrameIrqRxProcessingNO_DMA(CAN_PORTS.Can1_IO.env, pRxCfg); +} + +#endif + + +//static void DMA_ErrorCallback(void) { +// while (1) { +// __asm("nop"); +// } +//} + +static void vCanPort_InitCAN0RxTxPin() { + PORT_InitType tInitStruct = {0U}; + GPIO_InitType tGpioInitStruct = {0}; + + // CAN0_STB + // PortC 30: MUX = GPIO output + tInitStruct.u32PortPins = PORT_PIN_30; + tInitStruct.uPortPinMux.u32PortPinMode = PORT_GPIO_MODE; + PORT_InitPins(PORT_C, &tInitStruct); + tGpioInitStruct.u32GpioPins = PORT_PIN_30; + tGpioInitStruct.ePinDirection = GPIO_OUT; + tGpioInitStruct.ePinLevel = GPIO_LOW; + GPIO_InitPins(GPIO_C, &tGpioInitStruct); + + // Port C2: MUX = ALT3, CAN0_RX + tInitStruct.u32PortPins = PORT_PIN_2; + tInitStruct.uPortPinMux.u32PortPinMode = PORTC_2_FLEXCAN0_RX; + tInitStruct.bPullEn = FALSE; + tInitStruct.ePullSel = PORT_PULL_UP; + PORT_InitPins(PORT_C, &tInitStruct); + tGpioInitStruct.u32GpioPins = PORT_PIN_2; + tGpioInitStruct.ePinDirection = GPIO_IN; + GPIO_InitPins((GPIO_InstanceType) PORT_C, &tGpioInitStruct); + + // Port C3: MUX = ALT3, CAN0_TX + tInitStruct.u32PortPins = PORT_PIN_3; + tInitStruct.uPortPinMux.u32PortPinMode = PORTC_3_FLEXCAN0_TX; + PORT_InitPins(PORT_C, &tInitStruct); + tGpioInitStruct.u32GpioPins = PORT_PIN_3; + tGpioInitStruct.ePinDirection = GPIO_OUT; + tGpioInitStruct.ePinLevel = GPIO_HIGH; + GPIO_InitPins(GPIO_C, &tGpioInitStruct); +} + +#define countIdCanHardSoftFilterCan0 31 +const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan0[countIdCanHardSoftFilterCan0] = { + {FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF, PROTOCOL_CAN_UDS}, + {FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF, PROTOCOL_CAN_UDS}, + {FLEXCAN_ID_STD, EMS_Veh_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, BCM_Powertrain_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, EMS_Veh_02_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, BCM_EEM_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, DMFR_Msg1_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, DMFL_Msg1_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, TM_Stat_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, TM_CP_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, HVC_CCU_Status_Msg_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, BCM_VEH_STATE_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, EMS_HVC_Req_Msg_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, HVC_Err_Status_Msg_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, BCM_CLIMATIC_DATA_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, VCU_CCU_Req_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, ESC_08_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, SMFL_status_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, SMFR_status_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, SMRL_status_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, SMRR_status_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, SDM_Cmd_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, VEH_VIN_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, OCUFL_MSG_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, OCUFR_MSG_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, OCURL_MSG_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, OCURR_MSG_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, DW_STATE_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, FIU_CCU1_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, FIU_CCU2_CANID, 0x7FF, PROTOCOL_CAN_RAW}, + {FLEXCAN_ID_STD, FIU_CCU3_CANID, 0x7FF, PROTOCOL_CAN_RAW} +}; + +#if (CAN_DMA_EN == 1) +#define countIdCanFilterFifoCan0 7 +const FLEXCAN_RxMbFilterType IdCanFilterFifoCan0[countIdCanFilterFifoCan0] = { + {FLEXCAN_ID_STD, 0x100, 0x7FF}, + {FLEXCAN_ID_STD, 0x200, 0x7FF}, + {FLEXCAN_ID_STD, 0x300, 0x7FF}, + {FLEXCAN_ID_STD, 0x400, 0x7FF}, + {FLEXCAN_ID_STD, 0x500, 0x7FF}, + {FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF}, + {FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF} +}; +#endif + + +#define countIdCanHardSoftFilterCan1 2 +const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan1[countIdCanHardSoftFilterCan1] = { + {FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF, PROTOCOL_CAN_UDS}, + {FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF, PROTOCOL_CAN_UDS}, +// {FLEXCAN_ID_STD, XCP_CCU_RX_CANID, 0x7FF, PROTOCOL_CAN_XCP}, +// {FLEXCAN_ID_STD, dbg_Cmd_Act_Information_CANID, 0x7FF, PROTOCOL_CAN_RAW} +}; + + +#if (CAN_DMA_EN == 1) +#define countIdCanFilterFifoCan1 7 +const FLEXCAN_RxMbFilterType IdCanFilterFifoCan1[countIdCanFilterFifoCan1] = { +// {FLEXCAN_ID_STD, 0, 0} + {FLEXCAN_ID_STD, 0x100, 0x7FF}, + {FLEXCAN_ID_STD, 0x200, 0x7FF}, + {FLEXCAN_ID_STD, 0x300, 0x7FF}, + {FLEXCAN_ID_STD, 0x400, 0x7FF}, + {FLEXCAN_ID_STD, 0x500, 0x7FF}, + {FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF}, + {FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF} +}; +#endif + +static bool vCanPort_InitCan0() { + vCanPort_InitCAN0RxTxPin(); + +#if (CAN_DMA_EN == 1) + bool result = vCanSerialPortFrameDMAInit( + &CAN_PORTS.Can0, + + FLEXCAN0, + 0, // CAN0 = 0 ... CAN3 = 3 + FlexCAN0_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn + + 0xFF, + DMA_CHANNEL_0, + + DMA_REQ_FLEXCAN0, + + (uint8_t *) &g_aRxDataBufCan0[0], + size_aRxDataBuf, + + IdCanHardSoftFilterCan0, + countIdCanHardSoftFilterCan0, + + IdCanFilterFifoCan0, + countIdCanFilterFifoCan0, + + DMA0_IRQn, + 0xFF, + DMA0_IRQn, + + FLEXCAN_BAUD_500K, + FLEXCAN_ID_STD, + 0x55, + NULL, + NULL, + NULL, + NULL, + + DMA_TransferCompleteCallbackCan0, + NULL + ); +#else + + bool result = vCanSerialPortFrameMbInit( + &CAN_PORTS.Can0, + + FLEXCAN0, + 0, // CAN0 = 0 ... CAN3 = 3 + FlexCAN0_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn + + 0xFF, + IdCanHardSoftFilterCan0, + countIdCanHardSoftFilterCan0, + + + FLEXCAN_BAUD_500K, + FLEXCAN_ID_STD, + 0x55, + CAN0_ErrorInterrupt_CallBack, + CAN0_RxInterrupt_CallBack, + CAN0_RxFifoInterrupt_CallBack, + NULL + ); + +#endif + + + return result; +} + + +static void vCanPort_InitCAN1RxTxPin() { + PORT_InitType tInitStruct = {0U}; + GPIO_InitType tGpioInitStruct = {0}; + + // CAN1_STB + // PortD 28: MUX = GPIO output + tInitStruct.u32PortPins = PORT_PIN_28; + tInitStruct.uPortPinMux.u32PortPinMode = PORT_GPIO_MODE; + PORT_InitPins(PORT_D, &tInitStruct); + tGpioInitStruct.u32GpioPins = PORT_PIN_28; + tGpioInitStruct.ePinDirection = GPIO_OUT; + tGpioInitStruct.ePinLevel = GPIO_LOW; + GPIO_InitPins(GPIO_D, &tGpioInitStruct); + + // PortA 12: MUX = ALT3, CAN1_RX + tInitStruct.u32PortPins = PORT_PIN_12; + tInitStruct.uPortPinMux.u32PortPinMode = PORTA_12_FLEXCAN1_RX; + tInitStruct.bPullEn = FALSE; + tInitStruct.ePullSel = PORT_PULL_UP; + PORT_InitPins(PORT_A, &tInitStruct); + tGpioInitStruct.u32GpioPins = PORT_PIN_12; + tGpioInitStruct.ePinDirection = GPIO_IN; + GPIO_InitPins((GPIO_InstanceType) PORT_A, &tGpioInitStruct); + + // PortA 13: MUX = ALT4, CAN1_TX + tInitStruct.u32PortPins = PORT_PIN_13; + tInitStruct.uPortPinMux.u32PortPinMode = PORTA_13_FLEXCAN1_TX; + PORT_InitPins(PORT_A, &tInitStruct); + tGpioInitStruct.u32GpioPins = PORT_PIN_13; + tGpioInitStruct.ePinDirection = GPIO_OUT; + tGpioInitStruct.ePinLevel = GPIO_HIGH; + GPIO_InitPins(GPIO_A, &tGpioInitStruct); +} + +static bool vCanPort_InitCan1() { + + vCanPort_InitCAN1RxTxPin(); + +#if (CAN_DMA_EN == 1) + bool result = vCanSerialPortFrameDMAInit( + &CAN_PORTS.Can1, + + FLEXCAN1, + 1, // CAN0 = 0 ... CAN3 = 3 + FlexCAN1_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn + + 0xFF, + DMA_CHANNEL_1, + + DMA_REQ_FLEXCAN1, + + (uint8_t *) &g_aRxDataBufCan1[0], + size_aRxDataBuf, + + IdCanHardSoftFilterCan1, + countIdCanHardSoftFilterCan1, + + IdCanFilterFifoCan1, + countIdCanFilterFifoCan1, + + DMA1_IRQn, + 0xFF, + DMA1_IRQn, + + FLEXCAN_BAUD_500K, + FLEXCAN_ID_STD, + 0x55, + NULL, + NULL, + NULL, + NULL, + + DMA_TransferCompleteCallbackCan1, + NULL + ); +#else + bool result = vCanSerialPortFrameMbInit( + &CAN_PORTS.Can1, + + FLEXCAN1, + 1, // CAN0 = 0 ... CAN3 = 3 + FlexCAN1_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn + + 0xFF, + IdCanHardSoftFilterCan1, + countIdCanHardSoftFilterCan1, + + + FLEXCAN_BAUD_500K, + FLEXCAN_ID_STD, + 0x55, + CAN1_ErrorInterrupt_CallBack, + CAN1_RxInterrupt_CallBack, + CAN1_RxFifoInterrupt_CallBack, + NULL + ); + +#endif + return result; +} + + +void CanPorts_Init(tLoggerInterface *logger) { + CAN_PORTS.Can0.reInit = false; + bool result = vCanPort_InitCan0(); + if (result) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Initialization CAN0 - OK") + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Initialization CAN0 - ERROR") + } + CAN_PORTS.Can0_IO = CanPortFrame_GetIo(&CAN_PORTS.Can0); + + CAN_PORTS.Can1.reInit = false; + + result = vCanPort_InitCan1(); + if (result) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Initialization CAN1 - OK") + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Initialization CAN1 - ERROR") + } + CAN_PORTS.Can1_IO = CanPortFrame_GetIo(&CAN_PORTS.Can1); + +} + +void CAN0_IRQHandler(void) { + FLEXCAN_IRQHandler(0U); +} + +void CAN1_IRQHandler(void) { + FLEXCAN_IRQHandler(1U); +} + +void CAN2_IRQHandler(void) { + FLEXCAN_IRQHandler(2U); +} + +void CAN3_IRQHandler(void) { + FLEXCAN_IRQHandler(3U); +} +*/ \ No newline at end of file