From fbb6fd8914da6c964580b4f66a2df13ec95d54c8 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 3 Feb 2026 13:22:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanPorts.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- CanPorts.h | 2 ++ 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/CanPorts.c b/CanPorts.c index 743af61..3519fbc 100644 --- a/CanPorts.c +++ b/CanPorts.c @@ -15,10 +15,14 @@ typedef struct { #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_TransferCompleteCallback(void) { +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]); } //static void DMA_ErrorCallback(void) { @@ -186,7 +190,84 @@ static void vCanPort_InitCan0() { NULL, NULL, - DMA_TransferCompleteCallback, + DMA_TransferCompleteCallbackCan0, + NULL + ); + +} + + +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 = ALT3, 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 void vCanPort_InitCan1() { + vCanPort_InitCAN1RxTxPin(); + + vCanSerialPortFrameDMAInit( + &CAN_PORTS.Can1, + + FLEXCAN0, + 1, // CAN0 = 0 ... CAN3 = 3 + FlexCAN1_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn + + 0xFF, + DMA_CHANNEL_1, + + DMA_REQ_FLEXCAN1, + + (uint8_t *) &g_aRxDataBufCan0[0], + size_aRxDataBuf, + + IdCanSoftFilterCan0, + countIdCanSoftFilterCan0, + + IdCanFilterFifoCan0, + countIdCanFilterFifoCan0, + + DMA1_IRQn, + 0xFF, + DMA1_IRQn, + + FLEXCAN_BAUD_500K, + FLEXCAN_ID_STD, + 0x55, + NULL, + NULL, + NULL, + NULL, + + DMA_TransferCompleteCallbackCan1, NULL ); @@ -198,6 +279,9 @@ void CanPorts_Init() { vCanPort_InitCan0(); CAN_PORTS.Can0_IO = CanPortFrame_GetIo(&CAN_PORTS.Can0); + CAN_PORTS.Can1.reInit = false; + vCanPort_InitCan1(); + CAN_PORTS.Can1_IO = CanPortFrame_GetIo(&CAN_PORTS.Can1); } void CAN0_IRQHandler(void) { diff --git a/CanPorts.h b/CanPorts.h index 35ad500..202a9bb 100644 --- a/CanPorts.h +++ b/CanPorts.h @@ -21,6 +21,8 @@ typedef struct { tCanSerialPortFrameFlagchip Can0; tSerialPortFrameIO Can0_IO; + tCanSerialPortFrameFlagchip Can1; + tSerialPortFrameIO Can1_IO; } tCanPorts; extern tCanPorts CAN_PORTS;