Например TDA7294

Форум РадиоКот • Просмотр темы - GD32F427ZGT6 и фильтры CAN-фреймов: не принимаются фреймы
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт янв 06, 2026 21:54:06

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: GD32F427ZGT6 и фильтры CAN-фреймов: не принимаются фреймы
СообщениеДобавлено: Пн фев 12, 2024 23:08:46 
Открыл глаза

Зарегистрирован: Ср дек 25, 2019 23:41:33
Сообщений: 43
Рейтинг сообщения: 0
Здравствуйте!

Пишу код из 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 
Открыл глаза

Зарегистрирован: Ср дек 25, 2019 23:41:33
Сообщений: 43
Рейтинг сообщения: 0
В 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 
Друг Кота
Аватар пользователя

Карма: 17
Рейтинг сообщений: 467
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Сообщений: 5591
Откуда: Воронеж
Рейтинг сообщения: 0
dmitrij999 писал(а):
В STM32F427 CAN1 не работает, если не запустить CAN1, то же самое касается GD32F427.

:shock: :shock: :shock:

_________________
"Привет!" - соврал он.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y