Перейти к содержанию
    

AT32F403A, работа USB и CAN

Добрый день. 
Такая проблема. Не могу заставить в одном коде работать USB и CAN. Основу программы сделал на базе AT32F403A_407_Firmware_Library -> virtual_comport, вставил туда таймеры. Всё работает нормально.

Взял пример communication_mode, CAN работает в обе стороны, хорошо.

Вставляю код с CAN в основной листинг, и CAN не подключается. 

Подскажите пожалуйста куда копать, и какие строчки нужно привести для понимания того, что я написал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опытным путём нашёл что причина в конфигурации CAN

 

static void can_configuration(void)
{
  can_base_type can_base_struct;
  can_baudrate_type can_baudrate_struct;
  can_filter_init_type can_filter_init_struct;

  crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
  /* can base init */
  can_default_para_init(&can_base_struct);
  can_base_struct.mode_selection = CAN_MODE_COMMUNICATE; <---- меняем на loopback и работает
  can_base_struct.ttc_enable = FALSE;
  can_base_struct.aebo_enable = TRUE;
  can_base_struct.aed_enable = TRUE;
  can_base_struct.prsf_enable = FALSE;
  can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED;
  can_base_struct.mmssr_selection = CAN_SENDING_BY_ID;
  can_base_init(CAN1, &can_base_struct);

  /* can baudrate, set baudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) */
    can_baudrate_default_para_init(&can_baudrate_struct);
  can_baudrate_struct.baudrate_div = 30;
  can_baudrate_struct.rsaw_size = CAN_RSAW_1TQ;
  can_baudrate_struct.bts1_size = CAN_BTS1_6TQ;
  can_baudrate_struct.bts2_size = CAN_BTS2_1TQ;
  can_baudrate_set(CAN1, &can_baudrate_struct);

  /* can filter init */
  can_filter_init_struct.filter_activate_enable = TRUE;
  can_filter_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
  can_filter_init_struct.filter_fifo = CAN_FILTER_FIFO0;
  can_filter_init_struct.filter_number = 0;
  can_filter_init_struct.filter_bit = CAN_FILTER_32BIT;
  can_filter_init_struct.filter_id_high = 0;
  can_filter_init_struct.filter_id_low = 0;
  can_filter_init_struct.filter_mask_high = 0;
  can_filter_init_struct.filter_mask_low = 0;
  can_filter_init(CAN1, &can_filter_init_struct);

  /* can interrupt config */
  nvic_irq_enable(CAN1_SE_IRQn, 0, 0);
  nvic_irq_enable(USBFS_L_CAN1_RX0_IRQn, 0, 0);
  can_interrupt_enable(CAN1, CAN_RF0MIEN_INT, TRUE);
  
  /* error interrupt enable */
  can_interrupt_enable(CAN1, CAN_ETRIEN_INT, TRUE);
  can_interrupt_enable(CAN1, CAN_EOIEN_INT, TRUE);
}

На прерывании USBFS_L_CAN1_RX0_IRQ сидит и USB и CAN

void USBFS_L_CAN1_RX0_IRQHandler (void)
{
   can_rx_message_type rx_message_struct;
   if(can_flag_get(CAN1,CAN_RF0MN_FLAG) != RESET)
  {
    can_message_receive(CAN1, CAN_RX_FIFO0, &rx_message_struct);
    if (rx_message_struct.standard_id == 0x500) {
       at32_led_toggle(LED3);
    }
  }
  usbd_irq_handler(&usb_core_dev);
}

 

Куда двигаться дальше не знаю

Изменено пользователем sicilla

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашёл проблему

void system_clock_config(void)

CAN работает при частоте

  crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_60, CRM_PLL_OUTPUT_RANGE_GT72MHZ);

USB работает при частоте

  crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_48, CRM_PLL_OUTPUT_RANGE_GT72MHZ);


Как подружить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/24/2023 at 4:09 PM, sicilla said:

Нашёл проблему

CAN модулю вообще все равно от какой частоты тактироваться. Чтобы получить правильный битрейт нужно просто настроить правильные коэффициенты делителя в модуле CAN.

А вообще, стоило бы для начала документацию на микроконтроллер почитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, dimka76 сказал:

CAN модулю вообще все равно от какой частоты тактироваться. Чтобы получить правильный битрейт нужно просто настроить правильные коэффициенты делителя в модуле CAN.

А вообще, стоило бы для начала документацию на микроконтроллер почитать.

Естественно читал, расчет настройки can делал по их приложению. Но видимо пропустил настройку частоты. Разбираюсь. Если что, я первый раз серьёзно столкнулся с МК. Не пинайте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался, с помощью их прикладной программы AT32_New_Clock_Configuration_V3.0.05 установил тайминги как на картинке. Может кому поможет

AT32F403A CLK.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...