223 lines
7.6 KiB
C
223 lines
7.6 KiB
C
//
|
|
// Created by cfif on 03.06.2024.
|
|
//
|
|
#include "CanPorts.h"
|
|
#include "string.h"
|
|
|
|
tCanPorts CAN_PORTS;
|
|
|
|
void CanPort_SetSpeed(can_type *CANx, eCanBaudRate canBaudRate) {
|
|
|
|
if (CANx == CAN1) {
|
|
vCanSerialPortFrameInit(
|
|
&CAN_PORTS.Can1,
|
|
CAN1,
|
|
canBaudRate,
|
|
0x57,
|
|
CAN_STD_ID,
|
|
0,
|
|
20,
|
|
0,
|
|
20,
|
|
0
|
|
);
|
|
}
|
|
|
|
if (CANx == CAN2) {
|
|
vCanSerialPortFrameInit(
|
|
&CAN_PORTS.Can2,
|
|
CAN2,
|
|
canBaudRate,
|
|
0x57,
|
|
CAN_STD_ID,
|
|
0,
|
|
20,
|
|
0,
|
|
20,
|
|
0
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
void CanPort_GetSpeed(can_type *CANx, eCanBaudRate *canBaudRate) {
|
|
if (CANx == CAN1) {
|
|
*canBaudRate = CAN_PORTS.Can1.canBaudRate;
|
|
}
|
|
|
|
if (CANx == CAN2) {
|
|
*canBaudRate = CAN_PORTS.Can2.canBaudRate;
|
|
}
|
|
|
|
*canBaudRate = CAN_BAUD_RATE_500K;
|
|
}
|
|
|
|
void CanPort_SetFilter(can_type *CANx,
|
|
can_filter_init_type *can_filter0_init_struct,
|
|
can_filter_init_type *can_filter1_init_struct) {
|
|
|
|
if (CANx == CAN1) {
|
|
memcpy(&CAN_PORTS.Can1.can_filter0_init_struct, can_filter0_init_struct, sizeof(can_filter_init_type));
|
|
memcpy(&CAN_PORTS.Can1.can_filter1_init_struct, can_filter1_init_struct, sizeof(can_filter_init_type));
|
|
can_filter_init(CAN1, &CAN_PORTS.Can1.can_filter0_init_struct);
|
|
can_filter_init(CAN1, &CAN_PORTS.Can1.can_filter1_init_struct);
|
|
//CanPort_SetSpeed(CAN1, CAN_PORTS.Can1.canBaudRate);
|
|
}
|
|
|
|
if (CANx == CAN2) {
|
|
memcpy(&CAN_PORTS.Can2.can_filter0_init_struct, can_filter0_init_struct, sizeof(can_filter_init_type));
|
|
memcpy(&CAN_PORTS.Can2.can_filter1_init_struct, can_filter1_init_struct, sizeof(can_filter_init_type));
|
|
can_filter_init(CAN2, &CAN_PORTS.Can2.can_filter0_init_struct);
|
|
can_filter_init(CAN2, &CAN_PORTS.Can2.can_filter1_init_struct);
|
|
//CanPort_SetSpeed(CAN2, CAN_PORTS.Can2.canBaudRate);
|
|
}
|
|
|
|
}
|
|
|
|
static void vCanPort_InitCAN1RxTxPin() {
|
|
gpio_init_type gpio_init_struct;
|
|
|
|
// enable the gpio clock
|
|
crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
|
|
|
|
gpio_default_para_init(&gpio_init_struct);
|
|
|
|
// configure the can tx, rx pin
|
|
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
|
|
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
|
|
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
|
|
gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
|
|
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
|
|
gpio_init(GPIOD, &gpio_init_struct);
|
|
|
|
gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE0, GPIO_MUX_9);
|
|
gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE1, GPIO_MUX_9);
|
|
}
|
|
|
|
void CAN1_RX0_IRQHandler(void) {
|
|
CanSerialPortFrameIrqRxProcessing0(&CAN_PORTS.Can1);
|
|
}
|
|
|
|
void CAN1_RX1_IRQHandler(void) {
|
|
CanSerialPortFrameIrqRxProcessing1(&CAN_PORTS.Can1);
|
|
}
|
|
|
|
static void vCanPort_InitCan1() {
|
|
vCanPort_InitCAN1RxTxPin();
|
|
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_activate_enable = TRUE;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_fifo = CAN_FILTER_FIFO0;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_number = 0;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_bit = CAN_FILTER_32BIT;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_id_high = 0;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_id_low = 0;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_mask_high = 0;
|
|
CAN_PORTS.Can1.can_filter0_init_struct.filter_mask_low = 0;
|
|
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_activate_enable = TRUE;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_fifo = CAN_FILTER_FIFO1;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_number = 1;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_bit = CAN_FILTER_32BIT;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_id_high = 0;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_id_low = 0;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_mask_high = 0;
|
|
CAN_PORTS.Can1.can_filter1_init_struct.filter_mask_low = 0;
|
|
|
|
CanPort_SetSpeed(CAN1, CAN_BAUD_RATE_500K);
|
|
}
|
|
|
|
void CAN1_SE_IRQHandler(void) {
|
|
__IO uint32_t err_index = 0;
|
|
if (can_flag_get(CAN1, CAN_ETR_FLAG) != RESET) {
|
|
err_index = CAN1->ests & 0x70;
|
|
can_flag_clear(CAN1, CAN_ETR_FLAG);
|
|
if (err_index == 0x00000010) {
|
|
can_reset(CAN1);
|
|
CanPort_SetSpeed(CAN1, CAN_PORTS.Can1.canBaudRate);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void vCanPort_InitCAN2RxTxPin() {
|
|
gpio_init_type gpio_init_struct;
|
|
|
|
// enable the gpio clock
|
|
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
|
|
|
|
gpio_default_para_init(&gpio_init_struct);
|
|
|
|
// configure the can tx, rx pin
|
|
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
|
|
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
|
|
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
|
|
gpio_init_struct.gpio_pins = GPIO_PINS_5 | GPIO_PINS_6;
|
|
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
|
|
gpio_init(GPIOB, &gpio_init_struct);
|
|
|
|
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE5, GPIO_MUX_9);
|
|
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_9);
|
|
}
|
|
|
|
void CAN2_RX0_IRQHandler(void) {
|
|
CanSerialPortFrameIrqRxProcessing0(&CAN_PORTS.Can2);
|
|
}
|
|
|
|
void CAN2_RX1_IRQHandler(void) {
|
|
CanSerialPortFrameIrqRxProcessing1(&CAN_PORTS.Can2);
|
|
}
|
|
|
|
static void vCanPort_InitCan2() {
|
|
vCanPort_InitCAN2RxTxPin();
|
|
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_activate_enable = TRUE;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_fifo = CAN_FILTER_FIFO0;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_number = 0;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_bit = CAN_FILTER_32BIT;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_id_high = 0;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_id_low = 0;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_mask_high = 0;
|
|
CAN_PORTS.Can2.can_filter0_init_struct.filter_mask_low = 0;
|
|
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_activate_enable = TRUE;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_fifo = CAN_FILTER_FIFO1;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_number = 1;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_bit = CAN_FILTER_32BIT;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_id_high = 0;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_id_low = 0;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_mask_high = 0;
|
|
CAN_PORTS.Can2.can_filter1_init_struct.filter_mask_low = 0;
|
|
|
|
CanPort_SetSpeed(CAN2, CAN_BAUD_RATE_500K);
|
|
}
|
|
|
|
|
|
void CAN2_SE_IRQHandler(void) {
|
|
__IO uint32_t err_index = 0;
|
|
if (can_flag_get(CAN2, CAN_ETR_FLAG) != RESET) {
|
|
err_index = CAN2->ests & 0x70;
|
|
can_flag_clear(CAN2, CAN_ETR_FLAG);
|
|
|
|
if (err_index == 0x00000010) {
|
|
// gpio_bits_set(GPIOB, GPIO_PINS_7);
|
|
// gpio_bits_reset(GPIOB, GPIO_PINS_7);
|
|
|
|
can_reset(CAN2);
|
|
CanPort_SetSpeed(CAN2, CAN_PORTS.Can2.canBaudRate);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
void CanPorts_Init() {
|
|
CAN_PORTS.Can1.reInit = false;
|
|
vCanPort_InitCan1();
|
|
CAN_PORTS.Can1_IO = CanPortFrame_GetIo(&CAN_PORTS.Can1);
|
|
|
|
CAN_PORTS.Can2.reInit = false;
|
|
vCanPort_InitCan2();
|
|
CAN_PORTS.Can2_IO = CanPortFrame_GetIo(&CAN_PORTS.Can2);
|
|
} |