sicilla 0 23 марта, 2023 Опубликовано 23 марта, 2023 · Жалоба Добрый день. Такая проблема. Не могу заставить в одном коде работать USB и CAN. Основу программы сделал на базе AT32F403A_407_Firmware_Library -> virtual_comport, вставил туда таймеры. Всё работает нормально. Взял пример communication_mode, CAN работает в обе стороны, хорошо. Вставляю код с CAN в основной листинг, и CAN не подключается. Подскажите пожалуйста куда копать, и какие строчки нужно привести для понимания того, что я написал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sicilla 0 23 марта, 2023 Опубликовано 23 марта, 2023 (изменено) · Жалоба Опытным путём нашёл что причина в конфигурации 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); } Куда двигаться дальше не знаю Изменено 23 марта, 2023 пользователем sicilla Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sicilla 0 24 марта, 2023 Опубликовано 24 марта, 2023 · Жалоба Нашёл проблему 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); Как подружить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 24 марта, 2023 Опубликовано 24 марта, 2023 · Жалоба On 3/24/2023 at 4:09 PM, sicilla said: Нашёл проблему CAN модулю вообще все равно от какой частоты тактироваться. Чтобы получить правильный битрейт нужно просто настроить правильные коэффициенты делителя в модуле CAN. А вообще, стоило бы для начала документацию на микроконтроллер почитать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sicilla 0 24 марта, 2023 Опубликовано 24 марта, 2023 · Жалоба 12 минут назад, dimka76 сказал: CAN модулю вообще все равно от какой частоты тактироваться. Чтобы получить правильный битрейт нужно просто настроить правильные коэффициенты делителя в модуле CAN. А вообще, стоило бы для начала документацию на микроконтроллер почитать. Естественно читал, расчет настройки can делал по их приложению. Но видимо пропустил настройку частоты. Разбираюсь. Если что, я первый раз серьёзно столкнулся с МК. Не пинайте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sicilla 0 24 марта, 2023 Опубликовано 24 марта, 2023 · Жалоба Разобрался, с помощью их прикладной программы AT32_New_Clock_Configuration_V3.0.05 установил тайминги как на картинке. Может кому поможет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться