Пн фев 12, 2024 23:08:46
void CAN_Mode_Init(uint8_t tsjw, uint8_t tbs2, uint8_t tbs1, uint16_t brp, uint8_t mode, uint32_t device_addr)
{
rcu_periph_clock_enable(CAN_HANDLE_CAN_PERIPH_RCC);
rcu_periph_clock_enable(CAN_HANDLE_CANTX_PORT_RCC);
rcu_periph_clock_enable(CAN_HANDLE_CANRX_PORT_RCC);
/* configure CAN1 GPIO */
gpio_output_options_set(CAN_HANDLE_CANRX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, CAN_HANDLE_CANRX_PIN);
gpio_mode_set(CAN_HANDLE_CANRX_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, CAN_HANDLE_CANRX_PIN);
gpio_af_set(CAN_HANDLE_CANRX_PORT, GPIO_AF_9, CAN_HANDLE_CANRX_PIN);
gpio_output_options_set(CAN_HANDLE_CANTX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, CAN_HANDLE_CANTX_PIN);
gpio_mode_set(CAN_HANDLE_CANTX_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, CAN_HANDLE_CANTX_PIN);
gpio_af_set(CAN_HANDLE_CANTX_PORT, GPIO_AF_9, CAN_HANDLE_CANTX_PIN);
_addr = device_addr & 0xFFFFFE00; // Filter address out for here
uint32_t _broadcast_addr = 0x1FFFFFFF;
can_parameter_struct can_parameter;
can_filter_parameter_struct can_filter;
can_filter_parameter_struct can_broadcast_filter;
can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);
can_struct_para_init(CAN_FILTER_STRUCT, &can_broadcast_filter);
/* initialize CAN register */
can_deinit(CAN1);
/* initialize CAN */
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = ENABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.auto_retrans = ENABLE;
can_parameter.rec_fifo_overwrite = DISABLE;
can_parameter.trans_fifo_order = DISABLE;
can_parameter.working_mode = mode;
can_parameter.resync_jump_width = tsjw;
can_parameter.time_segment_1 = tbs1;
can_parameter.time_segment_2 = tbs2;
/* baudrate 250Kbps */
can_parameter.prescaler = brp;
can_init(CAN1, &can_parameter);
/* initialize filter */
/* CAN1 device filter */
// Setting up filter on broadcast messages (all-1 in 23 most significant bits)
can_filter.filter_number = 14;
can_filter.filter_mode = CAN_FILTERMODE_MASK;
can_filter.filter_bits = CAN_FILTERBITS_32BIT;
can_filter.filter_list_high = (uint16_t)(_addr>>13);
can_filter.filter_list_low = (uint16_t)(_addr << 3) | 0x04;
can_filter.filter_mask_high = (uint16_t)(0x1FFFFE00>>13);
can_filter.filter_mask_low = (uint16_t)(0x1FFFFE00<<3) | 0x04;
can_filter.filter_fifo_number = CAN_FIFO0;
can_filter.filter_enable = ENABLE;
can_filter_init(&can_filter);
//can_filter_init_select_can(CAN1, &can_filter);
/* CAN1 broadcast filter */
can_broadcast_filter.filter_number = 16;
can_broadcast_filter.filter_mode = CAN_FILTERMODE_MASK;
can_broadcast_filter.filter_bits = CAN_FILTERBITS_32BIT;
can_broadcast_filter.filter_list_high = (uint16_t)(_broadcast_addr>>13);
can_broadcast_filter.filter_list_low = (uint16_t)(_broadcast_addr << 3) | 0x04;
can_broadcast_filter.filter_mask_high = (uint16_t)(0x1FFFFE00>>13);
can_broadcast_filter.filter_mask_low = (uint16_t)(0x1FFFFE00<<3) | 0x04; // all-1 in 29-bitmask
can_broadcast_filter.filter_fifo_number = CAN_FIFO0;
can_broadcast_filter.filter_enable = ENABLE;
can_filter_init(&can_broadcast_filter);
//can_filter_init_select_can(CAN1, &can_broadcast_filter);
//can_filter_start_bank(CAN1, can_filter.filter_number);
//can_filter_start_bank(CAN1, can_broadcast_filter.filter_number);
//can1_filter_start_bank(can_filter.filter_number);
//can1_filter_start_bank(can_broadcast_filter.filter_number);
}
Чт фев 15, 2024 18:20:49
rcu_periph_clock_enable(RCU_CAN0);
rcu_periph_clock_enable(RCU_CAN1);
rcu_periph_clock_enable(CAN_HANDLE_CANTX_PORT_RCC);
rcu_periph_clock_enable(CAN_HANDLE_CANRX_PORT_RCC);
/* configure CAN1 GPIO */
gpio_output_options_set(CAN_HANDLE_CANRX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, CAN_HANDLE_CANRX_PIN);
gpio_mode_set(CAN_HANDLE_CANRX_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, CAN_HANDLE_CANRX_PIN);
gpio_af_set(CAN_HANDLE_CANRX_PORT, GPIO_AF_9, CAN_HANDLE_CANRX_PIN);
gpio_output_options_set(CAN_HANDLE_CANTX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, CAN_HANDLE_CANTX_PIN);
gpio_mode_set(CAN_HANDLE_CANTX_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, CAN_HANDLE_CANTX_PIN);
gpio_af_set(CAN_HANDLE_CANTX_PORT, GPIO_AF_9, CAN_HANDLE_CANTX_PIN);
_addr = device_addr & 0xFFFFFE00; // Filter address out for here
uint32_t _broadcast_addr = 0x1FFFFFFF;
can_parameter_struct can_parameter;
can_filter_parameter_struct can_filter;
can_filter_parameter_struct can_broadcast_filter;
can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);
can_struct_para_init(CAN_FILTER_STRUCT, &can_broadcast_filter);
/* initialize CAN register */
can_deinit(CAN0);
can_deinit(CAN1);
/* initialize CAN0&1 */
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = ENABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.auto_retrans = ENABLE;
can_parameter.rec_fifo_overwrite = DISABLE;
can_parameter.trans_fifo_order = DISABLE;
can_parameter.working_mode = mode;
can_parameter.resync_jump_width = tsjw;
can_parameter.time_segment_1 = tbs1;
can_parameter.time_segment_2 = tbs2;
/* baudrate 250Kbps */
can_parameter.prescaler = brp;
can1_filter_start_bank(15);
//can_init(CAN0, &can_parameter);
can_init(CAN1, &can_parameter);
/* initialize filter */
/* CAN1 device filter */
// Setting up filter on broadcast messages (all-1 in 23 most significant bits)
uint16_t f_high = (uint16_t)(_addr>>13);
uint16_t f_low = ((uint16_t)(_addr << 3)) | 0x04;
can_filter.filter_number = 15;
can_filter.filter_mode = CAN_FILTERMODE_MASK;
can_filter.filter_bits = CAN_FILTERBITS_32BIT;
can_filter.filter_list_high = f_high;
can_filter.filter_list_low = f_low;
can_filter.filter_mask_high = (uint16_t)(0x1FFFFE00>>13);
can_filter.filter_mask_low = ((uint16_t)(0x1FFFFE00<<3)) | 0x04;
can_filter.filter_fifo_number = CAN_FIFO0;
can_filter.filter_enable = ENABLE;
can_filter_init(&can_filter);
can1_filter_start_bank((uint8_t)can_filter.filter_number);
//can_filter_init_select_can(CAN1, &can_filter);
/* CAN1 broadcast filter */
f_high = (uint16_t)(_broadcast_addr>>13);
f_low = ((uint16_t)(_broadcast_addr << 3)) | 0x04;
can_broadcast_filter.filter_number = 0;
can_broadcast_filter.filter_mode = CAN_FILTERMODE_MASK;
can_broadcast_filter.filter_bits = CAN_FILTERBITS_32BIT;
can_broadcast_filter.filter_list_high = f_high;
can_broadcast_filter.filter_list_low = f_low;
can_broadcast_filter.filter_mask_high = (uint16_t)(0x1FFFFE00>>13);
can_broadcast_filter.filter_mask_low = ((uint16_t)(0x1FFFFE00<<3)) | 0x04; // all-1 in 29-bitmask
can_broadcast_filter.filter_fifo_number = CAN_FIFO0;
can_broadcast_filter.filter_enable = ENABLE;
can_filter_init(&can_broadcast_filter);
can_broadcast_filter.filter_number = 16;
can_filter_init(&can_broadcast_filter);
Пн фев 26, 2024 17:05:08
dmitrij999 писал(а):В STM32F427 CAN1 не работает, если не запустить CAN1, то же самое касается GD32F427.