Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

GD32F427ZGT6 и фильтры CAN-фреймов: не принимаются фреймы

Пн фев 12, 2024 23:08:46

Здравствуйте!

Пишу код из 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);
}

GD32F427ZGT6 и фильтры CAN-фреймов: не принимаются фреймы

Чт фев 15, 2024 18:20:49

В STM32F427 CAN1 не работает, если не запустить CAN1, то же самое касается GD32F427. В случае с GD32F427 хватило включения тактирования на все CAN-модули. Теперь код выглядит так:
Код:
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);

Re: GD32F427ZGT6 и фильтры CAN-фреймов: не принимаются фрейм

Пн фев 26, 2024 17:05:08

dmitrij999 писал(а):В STM32F427 CAN1 не работает, если не запустить CAN1, то же самое касается GD32F427.

:shock: :shock: :shock:
Ответить