Здравствуйте!
Пишу код из Keil прошивку на HAL CMSIS для GD32F427ZGT6, и пытаюсь наладить работу CAN.
Настроил CAN на скорость 250 кбит/с, и удается отправить исходящие фреймы, но не удается принять фреймы по маске.
Код писал для другого проекта, он там работал, но портирую на этот контроллер.
Как ни пытался настроить фильтры, не получается на контроллер их принять.
В чем может быть проблема?
Код настройки CAN
Код:
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);
}