From 23feb4b9b424d1f137a78c3c963a489e242a47e9 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 24 Feb 2025 10:58:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20CAN=20=D0=B2=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20=D1=81?= =?UTF-8?q?=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=B4=D1=80?= =?UTF-8?q?=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanSerialPorts.c | 120 +++++++++++++++++++++++++++++++++++------------ CanSerialPorts.h | 14 +++--- 2 files changed, 97 insertions(+), 37 deletions(-) diff --git a/CanSerialPorts.c b/CanSerialPorts.c index 15fc2d3..7962533 100644 --- a/CanSerialPorts.c +++ b/CanSerialPorts.c @@ -31,11 +31,64 @@ void vCanSerialPorts_InitRCC() { RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_CAN1 | RCC_APB1_PERIPH_CAN2, ENABLE); } -void USB_LP_CAN1_RX0_IRQHandler(void) { - CanSerialPortIrqRxProcessing(&SERIAL_PORTS.SerialPortCan1); +void CanPort_SetSpeed(CAN_Module *CANx, eCanBaudRate canBaudRate) { + + if (CANx == CAN1) { + vCanSerialPortFrameInit( + &SERIAL_PORTS.SerialPortFrameCan1, + CAN1, + canBaudRate, + 0x57, + CAN_STD_ID, + 0, + 20, + 0, + 20, + 0 + ); + } + + if (CANx == CAN2) { + vCanSerialPortFrameInit( + &SERIAL_PORTS.SerialPortFrameCan2, + CAN2, + canBaudRate, + 0x57, + CAN_STD_ID, + 0, + 20, + 0, + 20, + 0 + ); + } + } -void vCanSerialPort_InitCAN1(tCanSerialPortNation *env) { + +void USB_LP_CAN1_RX0_IRQHandler(void) { + CanSerialPortFrameIrqRxProcessing0(&SERIAL_PORTS.SerialPortFrameCan1); +} + +void CAN1_RX1_IRQHandler(void) { + CanSerialPortFrameIrqRxProcessing1(&SERIAL_PORTS.SerialPortFrameCan1); +} + +void CAN1_SCE_IRQHandler(void) { + + __IO uint32_t err_index = 0; + if (CAN_GetFlagSTS(CAN1, CAN_FLAG_LEC) != RESET) { + err_index = CAN1->ESTS & 0x70; + CAN_ClearFlag(CAN1, CAN_FLAG_LEC); + if (err_index == 0x00000010) { + CAN_DeInit(CAN1); + CanPort_SetSpeed(CAN1, CAN_SERIAL_PORTS.canFrame1.canBaudRate); + } + } +} + + +void vCanSerialPort_InitCAN1(tCanSerialPortFrameNation *env) { GPIO_InitType GPIO_InitStructure; GPIO_InitStruct(&GPIO_InitStructure); RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOB, ENABLE); @@ -52,27 +105,33 @@ void vCanSerialPort_InitCAN1(tCanSerialPortNation *env) { GPIO_ConfigPinRemap(GPIO_RMP2_CAN1, ENABLE); - vCanSerialPortInit( - env, - CAN1, - CAN_BAUD_RATE_250K, - 0xFF, - CAN_STD_ID, - 0x400, - true, - 0x400, - 0x00, - 512, - 0 - ); + } void CAN2_RX0_IRQHandler(void) { - CanSerialPortIrqRxProcessing(&SERIAL_PORTS.SerialPortCan2); + CanSerialPortFrameIrqRxProcessing0(&SERIAL_PORTS.SerialPortFrameCan2); } -void vCanSerialPort_InitCAN2(tCanSerialPortNation *env) { +void CAN2_RX1_IRQHandler(void) { + CanSerialPortFrameIrqRxProcessing1(&SERIAL_PORTS.SerialPortFrameCan2); +} + +void CAN2_SCE_IRQHandler(void) { + + __IO uint32_t err_index = CAN_GetFlagSTS(CAN2, CAN_FLAG_LEC); + if (err_index != RESET) { + err_index = CAN2->ESTS & 0x70; + CAN_ClearFlag(CAN2, CAN_FLAG_LEC); + if (err_index == 0x00000010) { + CAN_DeInit(CAN2); + CanPort_SetSpeed(CAN2, CAN_SERIAL_PORTS.canFrame2.canBaudRate); + } + } + +} + +void vCanSerialPort_InitCAN2(tCanSerialPortFrameNation *env) { GPIO_InitType GPIO_InitStructure; GPIO_InitStruct(&GPIO_InitStructure); RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOD, ENABLE); @@ -88,19 +147,20 @@ void vCanSerialPort_InitCAN2(tCanSerialPortNation *env) { GPIO_ConfigPinRemap(GPIO_RMP3_CAN2, ENABLE); - vCanSerialPortInit( + vCanSerialPortFrameInit( env, CAN2, - CAN_BAUD_RATE_250K, - 0xFF, + CAN_BAUD_RATE_500K, + 0x57, CAN_STD_ID, - 0x400, - true, - 0x400, - 0x00, - 512, + 0, + 20, + 0, + 20, 0 ); + + } void CanSerialPorts_Init() { @@ -109,10 +169,10 @@ void CanSerialPorts_Init() { vCanSerialPorts_InitRCC(); CanHWControlSet(); - vCanSerialPort_InitCAN1(&env->can1); - env->can1IO = CanPort_GetIo(&env->can1); + vCanSerialPort_InitCAN1(&env->canFrame1); + env->canFrame1IO = CanPortFrame_GetIo(&env->canFrame1); - vCanSerialPort_InitCAN2(&env->can2); - env->can2IO = CanPort_GetIo(&env->can2); + vCanSerialPort_InitCAN2(&env->canFrame2); + env->canFrame2IO = CanPortFrame_GetIo(&env->canFrame2); } \ No newline at end of file diff --git a/CanSerialPorts.h b/CanSerialPorts.h index 587edbf..cfa3bfd 100644 --- a/CanSerialPorts.h +++ b/CanSerialPorts.h @@ -2,22 +2,22 @@ // Created by cfif on 17.03.2024. // #include "n32g45x.h" -#include "CanSerialPort.h" +#include "CanSerialPortFrame.h" #ifndef NATION_CAN_TEST_CANSERIALPORTS_H #define NATION_CAN_TEST_CANSERIALPORTS_H typedef struct { - tCanSerialPortNation can1; - tSerialPortIO can1IO; + tCanSerialPortFrameNation canFrame1; + tSerialPortFrameIO canFrame1IO; - tCanSerialPortNation can2; - tSerialPortIO can2IO; + tCanSerialPortFrameNation canFrame2; + tSerialPortFrameIO canFrame2IO; } tCanSerialPorts; void CanSerialPorts_Init(); -void vCanSerialPort_InitCAN1(tCanSerialPortNation *env); -void vCanSerialPort_InitCAN2(tCanSerialPortNation *env); +void vCanSerialPort_InitCAN1(tCanSerialPortFrameNation *env); +void vCanSerialPort_InitCAN2(tCanSerialPortFrameNation *env); extern tCanSerialPorts CAN_SERIAL_PORTS; void vCanSerialPorts_InitRCC(); void CanHWControlSet();