Программирование AVR: работа с USB AT09333: интерфейс хоста USB для класса CDC Sun, April 30 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AT09333: интерфейс хоста USB для класса CDC Печать
Добавил(а) microsin   

USB Host Interface (UHI) для класса Communication Class Device (CDC) устройств USB предоставляет интерфейс для конфигурации и управления хостом USB для устройств USB CDC, обеспечивающих последовательный обмен данными. Здесь приведен перевод документации [1]. Схема этой документации следующая:

• Обзор API.
• Руководство быстрого старта для модуля работы с коммуникационными устройствами USB (USB Host Communication Device Class Module, UHI CDC).
• Примеры конфигурационных файлов.

Дополнительную информацию по библиотеке стека хоста USB - Atmel® Software Framework (ASF) USB Host Stack - см. апноут AVR4950 [2].

[Обзор API]

В этом обзоре приведены определения макросов, функций.

Макросы.

#define UHI_CDC

Глобальное определение, которое содержит стандартное UHI API для UHC (USB Host Core, библиотека ядра хоста USB). Это должно быть добавлено в определение USB_HOST_UHI из файла conf_usb_host.h.

Функции, требуемые для UHC.

Устанавливает интерфейс.

uhc_enum_status_t uhi_cdc_install (uhc_device_t * dev);

Выделяет конечные точки интерфейса, если они предоставлены.

Таблица 2-1. Параметры uhi_cdc_install.

Направление Имя параметра Описание
[in] uhc_device_t Запрашиваемое устройство.

Возврат: статус установки.

Разрешает интерфейс.

void uhi_cdc_enable (uhc_device_t *dev);

Разрешает интерфейс USB для соответствующего UHI.

Таблица 2-2. Параметры uhi_cdc_enable.

Направление Имя параметра Описание
[in] uhc_device_t Запрашиваемое устройство.

Деинсталлирует интерфейс (если он был установлен).

void uhi_cdc_uninstall (uhc_device_t *dev);

Таблица 2-3. Параметры uhi_cdc_uninstall.

Направление Имя параметра Описание
[in] uhc_device_t Запрашиваемое устройство.

Сигнал о том, что произошло начало фрейма (SOF).

void uhi_cdc_sof (bool b_micro);

UHI для класса CDC. Приложение высокого уровня использует общее API для применения этого класса хоста USB. Эти подпрограммы используют память для передачи своих данных в конечные точки USB CDC и из них.

Открывает порт интерфейса UHI CDC.

bool uhi_cdc_open (uint8_t port, usb_cdc_line_coding_t * configuration);

Таблица 2-4. Параметры uhi_cdc_open.

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.
[in] configuration Указатель на конфигурацию порта.

Возврат: true, если порт доступен.

Закрывает порт.

void uhi_cdc_close (uint8_t port);

Таблица 2-5. Параметры uhi_cdc_close.

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.

Эта функция проверяет, доступен ли для приема символ на линии CDC.

bool uhi_cdc_is_rx_ready (uint8_t port);

Таблица 2-6. Параметры uhi_cdc_is_rx_ready.

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.

Возврат: true, если байт готов для чтения.

Эта функция возвращает количество символов, доступных на линии устройства CDC.

iram_size_t uhi_cdc_get_nb_received (uint8_t port);

Таблица 2-7. Параметры uhi_cdc_get_nb_received.

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.

Возврат: количество принятых байт данных.

Запускает ожидание появления данных на линии CDC.

int uhi_cdc_getc (uint8_t port);

Таблица 2-8. Параметры uhi_cdc_getc().

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.

Возврат: значение, прочитанное на линии CDC.

Читает буфер RAM на линии CDC.

iram_size_t uhi_cdc_read_buf (uint8_t port, void * buf, iram_size_t size);

Таблица 2-9. Параметры uhi_cdc_read_buf().

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.
[out] buf Читаемые значения.
[in] size Количество читаемых значений.

Возврат: количество оставшихся данных.

Эта функция проверяет, можно ли послать новый байт.

bool uhi_cdc_is_tx_ready (uint8_t port);

Тип int используется для поддержки перенаправления scanf из библиотеки LIB компилятора.

Таблица 2-10. Параметры uhi_cdc_is_tx_ready().

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.

Возврат: true, если можно отправить новый символ.

Посылает байт на линию CDC.

int uhi_cdc_putc (uint8_t port, int value);

Тип int используется для перенаправления printf из библиотеки LIB компилятора.

Таблица 2-11. Параметры uhi_cdc_putc().

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.
[in] value Значение для вывода.

Возврат: true, если функция успешно выполнена, иначе false.

Записывает буфер RAM на линию CDC.

iram_size_t uhi_cdc_write_buf (uint8_t port,
                               const void * buf,
                               iram_size_t size);

Таблица 2-12. Параметры uhi_cdc_putc().

Направление Имя параметра Описание
[in] port Номер коммуникационного порта.
[in] buf Значения для записи.
[in] size Количество значений для записи.

Возврат: количество оставшихся данных.

[Быстрый старт для модуля UHI CDC]

В этом руководстве даны пошаговые инструкции запуска модуля хоста для работы с коммуникационными устройствами USB (USB Host Communication Device Class Module, UHI CDC). Показано, как конфигурировать и использовать этот модуль в различных ситуациях. Рассмотренные ситуации сопровождаются демонстрационными фрагментами кода. Для шагов настройки эти фрагменты могут быть скопированы в функцию инициализации пользователя, в то время как шаги использования могут быть скопированы, к примеру, в тело функции main приложения.

В этом примере применен модуль с поддержкой одного класса "USB Host CDC (Single Class support)". Использование модуля с поддержкой нескольких классов "USB Host CDC (Multiple Classes support)" описан в секции "Продвинутые случаи использования".

[Настройка]

Как и для любого хоста USB, требуются общие шаги по настройки хоста. Обратитесь к разделу "Базовая настройка хоста USB".

[Использование]

Ниже приведены примеры кода, показывающие пошаговое использование хоста.

1. Создайте файл conf_usb_host.h:

#define USB_HOST_UHI UHI_CDC
#define UHI_CDC_CHANGE(dev, b_plug) my_callback_cdc_change(dev, b_plug)
extern bool my_callback_cdc_change(uhc_device_t* dev, bool b_plug);
#define UHI_CDC_RX_NOTIFY() my_callback_cdc_rx_notify()
extern void my_callback_cdc_rx_notify(void);
#include "uhi_cdc.h" // в конце файла conf_usb_host.h

2. Добавьте к приложению модуль на языке C:

static bool my_flag_cdc_available = false;
 
bool my_callback_cdc_change (uhc_device_t* dev, bool b_plug)
{
   if (b_plug)
   {
      // USB Device CDC connected
      my_flag_cdc_available = true;
      // Open and configure USB CDC ports
      usb_cdc_line_coding_t cfg = {
                                    .dwDTERate = CPU_TO_LE32(115200),
                                    .bCharFormat = CDC_STOP_BITS_1,
                                    .bParityType = CDC_PAR_NONE,
                                    .bDataBits = 8,
                                  };
      uhi_cdc_open(0, &cfg);
   }
   else
   {
      my_flag_cdc_available = false;
   }
}
 
void my_callback_cdc_rx_notify(void)
{
   // Пробуждение задачи приема my_task_rx()
}
 
#define MESSAGE "Hello"
 
void my_task(void)
{
   static bool startup = true;
   if (!my_flag_cdc_available)
   {
      startup = true;
      return;
   }
   if (startup)
   {
      startup = false;
      // Send data on CDC communication port
      uhi_cdc_write_buf(0, MESSAGE, sizeof(MESSAGE)-1);
      uhi_cdc_putc(0,'\n');
      return;
   }
}
 
void my_task_rx(void)
{
   while (uhi_cdc_is_rx_ready(0))
   {
      int value = uhi_cdc_getc(0);
   }
}

[Рабочий процесс]

1. Убедитесь, что файл conf_usb_host.h доступен, и содержит следующую конфигурацию для хоста USB CDC:

#define USB_HOST_UHI UHI_CDC

Примечание: это определяет список интерфейсов UHI, поддерживаемых хостом USB.

#define UHI_CDC_CHANGE(dev, b_plug) my_callback_cdc_change(dev, b_plug)
extern bool my_callback_cdc_change(uhc_device_t* dev, bool b_plug);

Примечание: этот callback вызывается, когда устройство USB CDC подключается к хосту или отключается от него. Здесь может быть открыт и сконфигурирован порт для обмена данными.

#define UHI_CDC_RX_NOTIFY() my_callback_cdc_rx_notify()
extern void my_callback_cdc_rx_notify(void);

Примечание: этот callback вызывается, когда приняты новые данные. Это можно использовать для управления приемом данных через прерывание, и тем самым избежать периодического опроса наличия данных.

2. Функции доступа к данным CDC data описаны в обзоре UHI CDC API.

Для продвинутого использования модуля UHI CDC см. следующие случаи:

• Как разрешить поддержку USB High Speed.
• Поддержка нескольких классов.
• Поддержка двойной роли.

Для всех этих трех примеров требуется предварительная настойка UHI. Убедитесь, что для модуля UHI выполнены базовые шаги настройки (см. раздел "Базовая настройка хоста USB").

[Как разрешить поддержку USB High Speed]

Содержимое файла conf_usb_host.h:

#define USB_HOST_HS_SUPPORT

Убедитесь, что файл conf_usb_host.h и в нем определен макрос USB_HOST_HS_SUPPORT, включающий режим USB high speed для работы с устройствами (скорость обмена до 480 мегабит/сек).

[Поддержка нескольких классов]

В этом случае хост USB может работать сразу с несколькими классами устройств USB. Содержимое файла conf_usb_host.h:

#define USB_HOST_UHI UHI_HID_MOUSE, UHI_MSC, UHI_CDC

Убедитесь, что для исходного кода доступен файл conf_usb_host.h, где определены параметры UHI_HID_MOUSE, UHI_MSC, UHI_CDC.

Примечание: в макросе USB_HOST_UHI определяется список интерфейсов UHI, поддерживаемых хостом USB. Здесь Вы должны добавить поддержку тех классов устройств USB, которые хотите поддерживать.

[Поддержка двойной роли]

В этом случае разрешена работа как хоста, так и устройства USB, что называется двойной ролью.

Примечание: для плат разработчика компании Atmel переключение между ролями стека USB управляется автоматически благодаря наличия коннектора USB On-The-Go (OTG) и находящемуся в нем сигналу вывода идентификации роли (USB ID pin). Подробнее см. секцию "Двойная роль" в апноуте AVR4950 [2].

Содержимое файла conf_usb_host.h:

#define UHC_MODE_CHANGE(b_host_mode) my_callback_mode_change(b_host_mode)
extern void my_callback_mode_change(bool b_host_mode);

Добавьте к приложению модуль на языке C:

void usb_init(void)
{
   //udc_start();
   uhc_start();
}
 
bool my_host_mode;
 
void my_callback_mode_change (bool b_host_mode)
{
   my_host_mode = b_host_mode;
}
 
void my_usb_task(void)
{
   if (my_host_mode)
   {
      // Вызов задачи хоста USB
   }
   else
   {
      // Вызов задачи устройства USB
   }
}

Как это работает:

1. В случае двойных ролей USB (устройство USB или хост USB) стек USB должен быть разрешен вызовом uhc_start(), и udc_start() вызываться не должен.

//udc_start();
uhc_start();

2. В двойной роли, чтобы определить текущий режим USB может использоваться callback для оповещения об изменениях режима.

• Убедитесь, что conf_usb_host.h содержит следующие параметры:

#define UHC_MODE_CHANGE(b_host_mode) my_callback_mode_change(b_host_mode)
extern void my_callback_mode_change(bool b_host_mode);

• Убедитесь, что приложение содержит следующий код:

bool my_host_mode;
 
void my_callback_mode_change(bool b_host_mode)
{
   my_host_mode = b_host_mode;
}
 
void my_usb_task(void)
{
   if (my_host_mode)
   {
      // Вызов задачи хоста USB
   }
   else
   {
      // Вызов задачи устройства USB
   }
}

[Примеры конфигурационных файлов]

[Поддержка одного UHI CDC]

#ifndef _CONF_USB_HOST_H_
#define _CONF_USB_HOST_H_
 
#include "compiler.h"
 
#define USB_HOST_UHI UHI_CDC
#define USB_HOST_POWER_MAX 500
// #define USB_HOST_HUB_SUPPORT
 
#if (UC3A3||UC3A4)
# define USB_HOST_HS_SUPPORT
#endif
 
//#define UHC_MODE_CHANGE(b_host_mode) usb_host_mode_change(b_host_mode)
//#define UHC_VBUS_CHANGE(b_present) usb_host_vbus_change(b_present)
//#define UHC_VBUS_ERROR() usb_host_vbus_error()
//#define UHC_CONNECTION_EVENT(dev,b_present) usb_host_connection_event(dev,b_present)
//#define UHC_WAKEUP_EVENT() usb_host_wakeup_event()
//#define UHC_SOF_EVENT() usb_host_sof_event()
//#define UHC_DEVICE_CONF(dev) uint8_t usb_host_device_conf(dev)
//#define UHC_ENUM_EVENT(dev,b_status) usb_host_enum_event(dev,b_status)
#define UHI_CDC_CHANGE(dev,b_plug)
#define UHI_CDC_RX_NOTIFY()
 
#include "uhi_cdc.h"
 
#endif // _CONF_USB_HOST_H_

[Поддержка нескольких UHI CDC (композитное устройство)]

#ifndef _CONF_USB_HOST_H_
#define _CONF_USB_HOST_H_
 
#include "compiler.h"
 
#define USB_HOST_UHI // UHI_MSC, UHI_HID_MOUSE, UHI_CDC, UHI_VENDOR
#define USB_HOST_POWER_MAX 500
// #define USB_HOST_HUB_SUPPORT
 
#if (UC3A3 || UC3A4)
# define USB_HOST_HS_SUPPORT
#endif
 
//#define UHC_MODE_CHANGE(b_host_mode) usb_host_mode_change(b_host_mode)
//#define UHC_VBUS_CHANGE(b_present) usb_host_vbus_change(b_present)
//#define UHC_VBUS_ERROR() usb_host_vbus_error()
//#define UHC_CONNECTION_EVENT(dev,b_present) usb_host_connection_event(dev,b_present)
//#define UHC_WAKEUP_EVENT() usb_host_wakeup_event()
//#define UHC_SOF_EVENT() usb_host_sof_event()
//#define UHC_DEVICE_CONF(dev) uint8_t usb_host_device_conf(dev)
//#define UHC_ENUM_EVENT(dev,b_status) usb_host_enum_event(dev,b_status)
#define UHI_HID_MOUSE_CHANGE(dev,b_plug)
#define UHI_HID_MOUSE_EVENT_BTN_LEFT(b_state)
#define UHI_HID_MOUSE_EVENT_BTN_RIGHT(b_state)
#define UHI_HID_MOUSE_EVENT_BTN_MIDDLE(b_state)
#define UHI_HID_MOUSE_EVENT_MOUVE(x,y,scroll)
#define UHI_MSC_CHANGE(dev,b_plug)
#define UHI_CDC_CHANGE(dev,b_plug)
#define UHI_CDC_RX_NOTIFY()
 
#define UHI_VENDOR_CHANGE(dev, b_plug)
#define UHI_VENDOR_VID_PID_LIST {USB_VID_ATMEL, USB_PID_ATMEL_ASF_VENDOR_CLASS}
 
//#include "uhi_msc.h"
//#include "uhi_hid_mouse.h"
 
#endif // _CONF_USB_HOST_H_

[Микроконтроллеры AT32UC3A0, AT32UC3A1, AT32UC3B (USBB)]

#ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
 
/* ===== Опции источника системной тактовой частоты */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
 
/* ===== Опции PLL0 */
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL0_MUL 4 /* Fpll = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL0_DIV 1 /* Fpll = (Fclk * PLL_mul) / PLL_div */
 
/* ===== Опции PLL1 */
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC1
#define CONFIG_PLL1_MUL 8 /* Fpll = (Fclk * PLL_mul) / PLL_div */
#define CONFIG_PLL1_DIV 2 /* Fpll = (Fclk * PLL_mul) / PLL_div */
 
/* ===== Опции коэффициента деления тактовой частоты системной шины */
//#define CONFIG_SYSCLK_CPU_DIV 0 /* Fcpu = Fsys/(2 ^ CPU_div) */
//#define CONFIG_SYSCLK_PBA_DIV 0 /* Fpba = Fsys/(2 ^ PBA_div) */
//#define CONFIG_SYSCLK_PBB_DIV 0 /* Fpbb = Fsys/(2 ^ PBB_div) */
 
/* ===== Опции управления тактовой частотой периферийных устройств */
//#define CONFIG_SYSCLK_INIT_CPUMASK ((1 << SYSCLK_SYSTIMER) | (1 << SYSCLK_OCD))
//#define CONFIG_SYSCLK_INIT_PBAMASK (1 << SYSCLK_USART0)
//#define CONFIG_SYSCLK_INIT_PBBMASK (1 << SYSCLK_HMATRIX)
//#define CONFIG_SYSCLK_INIT_HSBMASK (1 << SYSCLK_MDMA_HSB)
 
/* ===== Опции тактирования USB */
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 /* Fusb = Fsys/(2 ^ USB_div) */
 
#endif /* CONF_CLOCK_H_INCLUDED */

[Микроконтроллеры AT32UC3A3 и AT32UC3A4 (USBB с поддержкой High Speed)]

#ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
 
/* ===== Опции источника системной тактовой частоты */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
 
/* ===== Опции PLL0 */
#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
#define CONFIG_PLL0_MUL 11 /* Fpll = (Fclk * PLL_mul) / PLL_div */
#define CONFIG_PLL0_DIV 2 /* Fpll = (Fclk * PLL_mul) / PLL_div */
 
/* ===== Опции PLL1 */
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL1_MUL 8 /* Fpll = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL1_DIV 2 /* Fpll = (Fclk * PLL_mul) / PLL_div */
 
/* ===== Опции коэффициента деления системной тактовой частоты шины */
#define CONFIG_SYSCLK_CPU_DIV 0 /* Fcpu = Fsys/(2 ^ CPU_div) */
#define CONFIG_SYSCLK_PBA_DIV 0 /* Fpba = Fsys/(2 ^ PBA_div) */
//#define CONFIG_SYSCLK_PBB_DIV 0 /* Fpbb = Fsys/(2 ^ PBB_div) */
 
/* ===== Опции управления тактовой частотой периферийных устройств */
//#define CONFIG_SYSCLK_INIT_CPUMASK ((1 << SYSCLK_SYSTIMER) | (1 << SYSCLK_OCD))
//#define CONFIG_SYSCLK_INIT_PBAMASK (1 << SYSCLK_USART0)
//#define CONFIG_SYSCLK_INIT_PBBMASK (1 << SYSCLK_HMATRIX)
//#define CONFIG_SYSCLK_INIT_HSBMASK (1 << SYSCLK_MDMA_HSB)
 
/* ===== Опции тактирования USB */
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 /* Fusb = Fsys/(2 ^ USB_div) */
 
#endif /* CONF_CLOCK_H_INCLUDED */

[Микроконтроллеры AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U (USBC)]

#ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
 
/* ===== Опции источника системной тактовой частоты */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC1
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC8M
 
/* ===== Опции PLL0 */
#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL0_SOURCE PLL_SRC_RC8M
#define CONFIG_PLL0_MUL 3 /* Fpll = (Fclk * PLL_mul) / PLL_div */
#define CONFIG_PLL0_DIV 1 /* Fpll = (Fclk * PLL_mul) / PLL_div */
 
/* ===== Опции PLL1 */
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL1_SOURCE PLL_SRC_RC8M
//#define CONFIG_PLL1_MUL 3 /* Fpll = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL1_DIV 1 /* Fpll = (Fclk * PLL_mul) / PLL_div */
 
/* ===== Опции коэффициента деления системной тактовой частоты шины */
//#define CONFIG_SYSCLK_CPU_DIV 0 /* Fcpu = Fsys/(2 ^ CPU_div) */
//#define CONFIG_SYSCLK_PBA_DIV 0 /* Fpba = Fsys/(2 ^ PBA_div) */
//#define CONFIG_SYSCLK_PBB_DIV 0 /* Fpbb = Fsys/(2 ^ PBB_div) */
//#define CONFIG_SYSCLK_PBC_DIV 0 /* Fpbc = Fsys/(2 ^ PBC_div) */
 
/* ===== Опции управления тактовой частотой периферийных устройств */
//#define CONFIG_SYSCLK_INIT_CPUMASK ((1 << SYSCLK_SYSTIMER) | (1 << SYSCLK_OCD))
//#define CONFIG_SYSCLK_INIT_PBAMASK (1 << SYSCLK_USART0)
//#define CONFIG_SYSCLK_INIT_PBBMASK (1 << SYSCLK_HMATRIX)
//#define CONFIG_SYSCLK_INIT_HSBMASK (1 << SYSCLK_MDMA_HSB)
 
/* ===== Опции тактирования USB */
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC1
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 /* Fusb = Fsys/(2 ^ USB_div) */
 
#endif /* CONF_CLOCK_H_INCLUDED */

[Микроконтроллеры SAM3X и SAM3A (UOTGHS: USB OTG High Speed)]

#ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
 
/* ===== Опции источника системной тактовой частоты (MCK) */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_XTAL
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_BYPASS
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_8M_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_12M_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_XTAL
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_BYPASS
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_UPLLCK
 
/* ===== Опции прескалера MCK (Fmck = Fsys / (SYSCLK_PRES)) */
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_1
#define CONFIG_SYSCLK_PRES SYSCLK_PRES_2
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_4
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_8
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_16
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_32
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_64
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_3
 
/* ===== Опции PLL0 (A) (Fpll = (Fclk * PLL_mul) / PLL_div)
  Используйте здесь эффективные значения mul и div. */
#define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL
#define CONFIG_PLL0_MUL 14
#define CONFIG_PLL0_DIV 1
 
/* ===== UPLL (UTMI) аппаратная скорость фиксирована на 480 МГц. */
/* ===== Опции тактирования USB (Fusb = FpllX / USB_div)
   Используйте здесь эффективное значение div. */
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL
#define CONFIG_USBCLK_DIV 1
 
/*===== Частота целевого процессора (частота системы)
- Частота XTAL (кварц): 12 МГц
- Источник системной тактовой частоты: PLLA
- Прескалер системной тактовой частоты: 2 (деление на 2)
- Источник тактов для PLLA: XTAL
- Выход PLLA: XTAL * 14 / 1
- Частота тактов системы: 12 * 14 / 1 /2 = 84 МГц
===== Тактовая частота USB
- Источник тактов USB: UPLL
- Делитель тактов USB: 1 (отсутствие деления)
- Частота UPLL: 480 МГц
- Частота тактов USB: 480 / 1 = 480 МГц
*/
 
#endif /* CONF_CLOCK_H_INCLUDED */

[Микроконтроллеры SAM D21 (USB)]

#include < clock.h >
 
#ifndef CONF_CLOCKS_H_INCLUDED
# define CONF_CLOCKS_H_INCLUDED
 
/* Конфигурация тактов системной шины */
# define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT false
# define CONF_CLOCK_FLASH_WAIT_STATES 2
# define CONF_CLOCK_CPU_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
# define CONF_CLOCK_APBA_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
# define CONF_CLOCK_APBB_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
# define CONF_CLOCK_APBC_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
 
/* Конфигурация SYSTEM_CLOCK_SOURCE_OSC8M - внутренний генератор 8 МГц */
# define CONF_CLOCK_OSC8M_PRESCALER SYSTEM_OSC8M_DIV_1
# define CONF_CLOCK_OSC8M_ON_DEMAND true
# define CONF_CLOCK_OSC8M_RUN_IN_STANDBY true
 
/* Конфигурация SYSTEM_CLOCK_SOURCE_XOSC - внешний генератор тактов */
# define CONF_CLOCK_XOSC_ENABLE false
# define CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL SYSTEM_CLOCK_EXTERNAL_CRYSTAL
# define CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY 12000000UL
# define CONF_CLOCK_XOSC_STARTUP_TIME SYSTEM_XOSC_STARTUP_32768
# define CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL true
# define CONF_CLOCK_XOSC_ON_DEMAND true
# define CONF_CLOCK_XOSC_RUN_IN_STANDBY false
 
/* Конфигурация SYSTEM_CLOCK_SOURCE_XOSC32K - внешний генератор 32 кГц */
# define CONF_CLOCK_XOSC32K_ENABLE true
# define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL SYSTEM_CLOCK_EXTERNAL_CRYSTAL
# define CONF_CLOCK_XOSC32K_STARTUP_TIME SYSTEM_XOSC32K_STARTUP_65536
# define CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROL false
# define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT false
# define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT true
# define CONF_CLOCK_XOSC32K_ON_DEMAND false
# define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY true
 
/* Конфигурация SYSTEM_CLOCK_SOURCE_OSC32K - внутренний генератор 32 кГц */
# define CONF_CLOCK_OSC32K_ENABLE false
# define CONF_CLOCK_OSC32K_STARTUP_TIME SYSTEM_OSC32K_STARTUP_130
# define CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT false
# define CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT true
# define CONF_CLOCK_OSC32K_ON_DEMAND true
# define CONF_CLOCK_OSC32K_RUN_IN_STANDBY false
 
/* Конфигурация SYSTEM_CLOCK_SOURCE_DFLL цифровая петля DFLL */
# define CONF_CLOCK_DFLL_ENABLE true
# define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
# define CONF_CLOCK_DFLL_ON_DEMAND true
 
/* Конфигурация режима открытой петли DFLL */
# define CONF_CLOCK_DFLL_FINE_VALUE (512)
 
/* Конфигурация режиме закрытой петли DFLL */
# define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR GCLK_GENERATOR_1
# define CONF_CLOCK_DFLL_MULTIPLY_FACTOR (48000000/32768)
# define CONF_CLOCK_DFLL_QUICK_LOCK true
# define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK true
# define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP true
# define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE true
# define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE (0x1f / 8)
# define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE (0xff / 8)
 
/* Конфигурация SYSTEM_CLOCK_SOURCE_DPLL - цифровая петля DPLL */
# define CONF_CLOCK_DPLL_ENABLE false
# define CONF_CLOCK_DPLL_ON_DEMAND false
# define CONF_CLOCK_DPLL_RUN_IN_STANDBY true
# define CONF_CLOCK_DPLL_LOCK_BYPASS false
# define CONF_CLOCK_DPLL_WAKE_UP_FAST false
# define CONF_CLOCK_DPLL_LOW_POWER_ENABLE true
# define CONF_CLOCK_DPLL_LOCK_TIME SYSTEM_CLOCK_SOURCE_DPLL_LOCK_TIME_DEFAULT
# define CONF_CLOCK_DPLL_REFERENCE_CLOCK SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_XOSC32K
# define CONF_CLOCK_DPLL_FILTER SYSTEM_CLOCK_SOURCE_DPLL_FILTER_DEFAULT
# define CONF_CLOCK_DPLL_REFERENCE_FREQUENCY 32768
# define CONF_CLOCK_DPLL_REFERENCE_DIVIDER 1
# define CONF_CLOCK_DPLL_OUTPUT_FREQUENCY 48000000
 
/* Конфигурация опорная частота DPLL GCLK */
# define CONF_CLOCK_DPLL_REFERENCE_GCLK_GENERATOR GCLK_GENERATOR_1
 
/* Конфигурация таймера петли DPLL GCLK */
# define CONF_CLOCK_DPLL_LOCK_GCLK_GENERATOR GCLK_GENERATOR_1
/* Установите это в true, чтобы конфигурировать GCLK, когда работает
 *  clocks_init. Если это установить в false, то в clocks_init()
 * не будет сконфигурирован ни один из генераторов. */
# define CONF_CLOCK_CONFIGURE_GCLK true
 
/* Конфигурация GCLK генератора 0 (главная тактовая частота) */
# define CONF_CLOCK_GCLK_0_ENABLE true
# define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true
# define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
# define CONF_CLOCK_GCLK_0_PRESCALER 1
# define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 1 */
# define CONF_CLOCK_GCLK_1_ENABLE true
# define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_1_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_XOSC32K
# define CONF_CLOCK_GCLK_1_PRESCALER 1
# define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 2 (RTC) */
# define CONF_CLOCK_GCLK_2_ENABLE false
# define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_2_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC32K
# define CONF_CLOCK_GCLK_2_PRESCALER 32
# define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 3 */
# define CONF_CLOCK_GCLK_3_ENABLE false
# define CONF_CLOCK_GCLK_3_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_3_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_3_PRESCALER 1
# define CONF_CLOCK_GCLK_3_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 4 */
# define CONF_CLOCK_GCLK_4_ENABLE false
# define CONF_CLOCK_GCLK_4_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_4_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_4_PRESCALER 1
# define CONF_CLOCK_GCLK_4_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 5 */
# define CONF_CLOCK_GCLK_5_ENABLE false
# define CONF_CLOCK_GCLK_5_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_5_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_5_PRESCALER 1
# define CONF_CLOCK_GCLK_5_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 6 */
# define CONF_CLOCK_GCLK_6_ENABLE false
# define CONF_CLOCK_GCLK_6_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_6_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_6_PRESCALER 1
# define CONF_CLOCK_GCLK_6_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 7 */
# define CONF_CLOCK_GCLK_7_ENABLE false
# define CONF_CLOCK_GCLK_7_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_7_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_7_PRESCALER 1
# define CONF_CLOCK_GCLK_7_OUTPUT_ENABLE false
 
/* Конфигурация GCLK генератора 8 */
# define CONF_CLOCK_GCLK_8_ENABLE false
# define CONF_CLOCK_GCLK_8_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_8_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_8_PRESCALER 1
# define CONF_CLOCK_GCLK_8_OUTPUT_ENABLE false
 
#endif /* CONF_CLOCKS_H_INCLUDED */

[Микроконтроллеры AT32UC3A0, AT32UC3A1, AT32UC3B (USBB)]

#ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
 
/* Разрешение порта UART */
#define CONF_BOARD_COM_PORT
 
#endif /* CONF_BOARD_H_INCLUDED */

[Микроконтроллеры AT32UC3A3 и AT32UC3A4 (USBB с поддержкой High Speed)]

#ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
 
/* Разрешение порта UART */
#define CONF_BOARD_COM_PORT
 
#endif /* CONF_BOARD_H_INCLUDED */

[Микроконтроллеры AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U (USBC)]

#ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
 
/* Разрешение порта UART */
#define CONF_BOARD_COM_PORT
 
#endif /* CONF_BOARD_H_INCLUDED */

[Микроконтроллеры SAM3X и SAM3A (UOTGHS: USB OTG High Speed)]

#ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
 
/* Описание выводов, соответствующих Rxd, Txd (выводы UART) */
#define CONSOLE_PINS {PINS_UART}
 
/* Hw ID USART используется консолью (UART0) */
#define CONSOLE_UART_ID ID_UART
/* Конфигурирование выводов UART */
#define CONF_BOARD_UART_CONSOLE
 
/* Пример конфигурирования выводов ADC */
//#define CONF_BOARD_ADC
 
/* Конфигурирование вывода PWM LED0 */
//#define CONF_BOARD_PWM_LED0
/* Конфигурирование вывода PWM LED1 */
//#define CONF_BOARD_PWM_LED1
/* Конфигурирование вывода PWM LED2 */
//#define CONF_BOARD_PWM_LED2
 
/* Конфигурирование выводов SPI0 */
//#define CONF_BOARD_SPI0
//#define CONF_BOARD_SPI0_NPCS0
//#define CONF_BOARD_SPI0_NPCS1
//#define CONF_BOARD_SPI0_NPCS2
//#define CONF_BOARD_SPI0_NPCS3
/* Конфигурирование выводов SPI1 */
//#define CONF_BOARD_SPI1
//#define CONF_BOARD_SPI1_NPCS0
//#define CONF_BOARD_SPI1_NPCS1
//#define CONF_BOARD_SPI1_NPCS2
//#define CONF_BOARD_SPI1_NPCS3
 
/* Конфигурирование выводов I2C (TWI) */
//#define CONF_BOARD_TWI0
//#define CONF_BOARD_TWI1
 
/* Конфигурирование вывода RXD USART */
//#define CONF_BOARD_USART_RXD
 
/* Конфигурирование вывода TXD USART */
//#define CONF_BOARD_USART_TXD
/* Конфигурирование вывода CTS USART */
//#define CONF_BOARD_USART_CTS
/* Конфигурирование вывода RTS USART */
//#define CONF_BOARD_USART_RTS
/* Конфигурирование вывода SCK синхронного обмена USART */
//#define CONF_BOARD_USART_SCK
 
/* Конфигурирование вывода разрешения ADM3312 */
//#define CONF_BOARD_ADM3312_EN
 
/* Конфигурирование вывода выключения трансивера IrDA */
//#define CONF_BOARD_TFDU4300_SD
 
/* Конфигурирование вывода ADM3485 RE трансивера RS485 */
//#define CONF_BOARD_ADM3485_RE
//#define CONF_BOARD_SMC_PSRAM
 
/* Конфигурирование выводов LCD EBI */
//#define CONF_BOARD_HX8347A
/* Конфигурирование вывода управления подсветкой */
//#define CONF_BOARD_AAT3194
 
/* Конфигурирование выводов USB */
#define CONF_BOARD_USB_PORT
 
#endif /* CONF_BOARD_H_INCLUDED */

[Микроконтроллеры SAM D21 (USB)]

#ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
 
/* Разрешение детектирования USB VBUS */
#define CONF_BOARD_USB_VBUS_DETECT
 
/* Разрешено детектирование ID */
#define CONF_BOARD_USB_ID_DETECT
 
#endif /* CONF_BOARD_H_INCLUDED */

Для FAQ и примеров посетите центр техподдержки Atmel [3]. 

[Базовая настройка хоста USB]

Конфигурация пользователя хоста USB. Следующая конфигурация должна быть включена в файл conf_usb_host.h приложения:

1. USB_HOST_UHI (список UHI API). Здесь определяется список интерфейсов UHI, поддерживаемые хостом USB (например: UHI_MSC, UHI_HID_MOUSE).
2. USB_HOST_POWER_MAX (mA). Задает максимальный ток, разрешенный для потребления внешними устройствами от VBUS.
3. USB_HOST_HS_SUPPORT (только определение). Авторизация хоста USB для работы в режиме High Speed.
4. USB_HOST_HUB_SUPPORT (только определение). Авторизация поддержки USB HUB.

Пользовательский callback хоста USB. Можно опционально определить следующие функции обратного вызова (callback) хоста USB в файле conf_usb_host.h приложения:

1. void UHC_MODE_CHANGE (bool b_host_mode). Служит для оповещение, что автоматически переключился режим USB (хост USB или устройство USB). Это возможно только когда доступен вывод идентификации режима (ID pin).
2. void UHC_VBUS_CHANGE (bool b_present). Для оповещения о том, что поменялся уровень VBUS (доступно только в аппаратуре USB с поддержкой мониторинга уровня VBUS).
3. void UHC_VBUS_ERROR (void). Для оповещения о том, что произошла ошибка VBUS (доступно только в аппаратуре USB с поддержкой мониторинга уровня VBUS).
4. void UHC_CONNECTION_EVENT (uhc_device_t* dev, bool b_present). Для оповещения о том, что устройство USB подключено или отключено.
5. void UHC_WAKEUP_EVENT (void). Вызывается, когда устройство USB или хост проснулось от линии USB.
6. void UHC_SOF_EVENT (void). Вызывается каждый раз, когда принят сигнал начала фрейма SOF (возникает каждую 1 миллисекунду). Доступно в режимах High Speed и Full Speed.
7. uint8_t UHC_DEVICE_CONF (uhc_device_t* dev). Вызывается, когда должна быть выбрана конфигурация устройства USB. Таким образом, приложение может выбрать номер конфигурации для этого устройства, или конфигурацию номер 0, чтобы отказаться от выбора. Если callback не определен, то будет выбрана конфигурация 1.
8. void UHC_ENUM_EVENT (uhc_device_t* dev, uint8_t b_status). Вызывается, когда либо успешно завершено перечисление устройства USB, либо перечисление потерпело неудачу.

Шаги настройки хоста USB. Имеются требования к контроллеру хоста USB (USB Host Controller, UHC), общие для всех хостов USB.

Этот модуль основан на полной поддержке прерываний стека хоста USB и поддержке sleepmgr. Для AVR® Atmel® или SMART ARM® микроконтроллеров на основе SAM3/SAM4, поддерживающих службы тактирования. Для микроконтроллеров SAM D21 поддерживается драйвер тактов.

Чтобы настройка прошла корректно, должна быть выполнены следующие процедуры:

• Указание конфигурации тактирования:
   - Микроконтроллеры UC3 и SAM3/SAM4 без поддержки USB High Speed требуют вход тактов 48 МГц. Вы должны использовать PLL и внешний источник тактов OSC.
   - Микроконтроллеры UC3 и SAM3/SAM4 с поддержкой USB High Speed требуют вход тактов 12 МГц. Вы также должны использовать внешний источник тактов OSC.
   - Микроконтроллеры UC3 с аппаратурой USBC требуют частоту CPU выше 25 МГц.
   - Микроконтроллеры SAM D21 без поддержки USB High Speed требуют вход тактов 48 МГц. Вы должны использовать DFLL и внешний источник тактов OSC.
• В файл conf_board.h должно быть добавлено определение CONF_BOARD_USB_PORT, чтобы разрешить сигналы USB (не обязательно для всех плат разработчика).
• Разрешение прерываний.
• Инициализация службы тактирования.

Использование службы sleep manager не обязательно, но рекомендуется для уменьшения потребления тока:

• Инициализация службы sleep manager.
• Активация режима сна (sleep mode), когда приложения переходит в состояние ожидания (IDLE state).

Для микроконтроллеров AVR и SAM3/SAM4 добавьте следующий код инициализации:

irq_initialize_vectors();
cpu_irq_enable();
board_init();
sleepmgr_init();           // не обязательно

Для микроконтроллеров SAM D21 добавьте следующий код инициализации:

system_init();
irq_initialize_vectors();
cpu_irq_enable();
sleepmgr_init();           // не обязательно

Добавьте ожидание в главный цикл (main IDLE loop):

sleepmgr_enter_sleep();    // не обязательно

Пример кода USB Host Controller (UHC). Это общий пример кода для всех хостов USB. Содержимое файла conf_usb_host.h:

#define USB_HOST_POWER_MAX 500

Добавьте к приложению модуль на языке C:

void usb_init(void)
{
   uhc_start();
}

Работа USB Device Controller (UHC). Здесь показан рабочий процесс хоста для всех устройств USB. 

1. Убедитесь, что в файле conf_usb_host.h доступна основная конфигурация устройства USB:

// Максимально допустимый ток от VBUS (mA), который зависит от генератора 5V.
#define USB_HOST_POWER_MAX 500 // (500mA)

2. Вызовите функцию запуска стека хоста USB, чтобы разрешить его работу:

uhc_start();

Содержимое conf_clock.h для AT32UC3A0, AT32UC3A1, и AT32UC3B (USBB):

// Конфигурация, основанная на внешней частоте тактов 12 МГц OSC:
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
#define CONFIG_PLL1_MUL 8
#define CONFIG_PLL1_DIV 2
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div)

Содержимое conf_clock.h для AT32UC3A3 и AT32UC3A4 (с поддержкой USBB High Speed):

// Конфигурация, основанная на внешней частоте тактов 12 МГц OSC:
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div)

Содержимое conf_clock.h для AT32UC3C (USBC):

// Конфигурация, основанная на внешней частоте тактов 12 МГц OSC:
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
#define CONFIG_PLL1_MUL 8
#define CONFIG_PLL1_DIV 2
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div)
// Нужна тактовая частота CPU > 25 МГц для работы с USBC
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1

Содержимое conf_clock.h для SAM3X и SAM3A (UOTGHS: USB OTG High Speed):

// Тактирование USB фиксировано на UPLL.
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL
#define CONFIG_USBCLK_DIV 1

Содержимое conf_clock.h для SAM D21 (USB):

// Тактирование USB фиксировано на UPLL.
// Конфигурация SYSTEM_CLOCK_SOURCE_XOSC32K - внешний
// генератор 32 кГц
# define CONF_CLOCK_XOSC32K_ENABLE true
# define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL SYSTEM_CLOCK_EXTERNAL_CRYSTAL
# define CONF_CLOCK_XOSC32K_STARTUP_TIME SYSTEM_XOSC32K_STARTUP_65536
# define CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROL false
# define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT false
# define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT true
# define CONF_CLOCK_XOSC32K_ON_DEMAND false
# define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY true
 
// Конфигурация SYSTEM_CLOCK_SOURCE_DFLL - DFLL (Digital// Frequency Locked Loop)
# define CONF_CLOCK_DFLL_ENABLE true
# define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
# define CONF_CLOCK_DFLL_ON_DEMAND true
 
// Конфигурация закрытой петли DFLL
# define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR GCLK_GENERATOR_1
# define CONF_CLOCK_DFLL_MULTIPLY_FACTOR (48000000/32768)
# define CONF_CLOCK_DFLL_QUICK_LOCK true
# define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK true
# define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP true
# define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE true
# define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE (0x1f / 8)
# define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE (0xff / 8)
# define CONF_CLOCK_CONFIGURE_GCLK true
 
// Конфигурация GCLK генератора 0 (основная тактовая частота)
# define CONF_CLOCK_GCLK_0_ENABLE true
# define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true
# define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
# define CONF_CLOCK_GCLK_0_PRESCALER 1
# define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
 
// Конфигурация GCLK генератора 1
# define CONF_CLOCK_GCLK_1_ENABLE true
# define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_1_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_XOSC32K
# define CONF_CLOCK_GCLK_1_PRESCALER 1
# define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE true

[Ссылки]

1. AT09333: USB Host Interface (UHI) for Communication Class Device (CDC) site:atmel.com.
2. AVR4950: USB хост AVR.
3. Design Support site:atmel.com.
4. AT09337: интерфейс хоста USB для класса HID мыши.

 

Добавить комментарий


Защитный код
Обновить

Top of Page