Программирование ARM: работа с USB STM32: контроллер USB OTG full-speed Mon, March 30 2020  

Поделиться

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

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

STM32: контроллер USB OTG full-speed Печать
Добавил(а) microsin   

Эта часть документации (перевод главы "USB on-the-go full-speed (OTG_FS)" [1]) относится к MCU семейства STM32F4xx, если не указано нечто иное. В STM32F4xx имеется два раздельных контроллера USB OTG: OTG_FS и OTG_HS. В этой статье описывается архитектура и модель программирования контроллера OTG_FS (описание OTG_HS см. в статье [6]). Все непонятные термины и сокращения см. в Словарике [2]. Также см. документы [3, 4, 5].

OTG_FS это контроллер устройства, выполняющего двойную роль (dual-role device, DRD) в архитектуре USB, т. е. поддерживает в зависимости от внешних условий как устройство USB, так и хост USB. Контроллер OTG_FS полностью совместим со спецификацией On-The-Go Supplement USB 2.0. Он может также быть сконфигурирован либо только как контроллер хоста, либо только как контроллер устройства USB, полностью совместимо со спецификацией USB 2.0. В режиме хоста OTG_FS поддерживает скорости full-speed (FS, 12 мегабит/сек) и low-speed (LS, 1.5 мегабит/сек), в то время как в режиме устройства поддерживаются только транзакции full-speed (FS, 12 мегабит/сек). OTG_FS поддерживает два новых протокола HNP и SRP. Единственный необходимый внешний компонент в режиме хоста - верхний ключ заряда (charge pump) для VBUS.

Host Negotiation Protocol (HNP). Позволяет устройствам обмениваться ролями хост/устройство, когда они оба поддерживают двойные роли устройств по спецификации OTG. При использовании HNP для смены ролей устройство USB OTG может захватить контроль над управлением планированием передачи данных. Таким образом, любое устройство OTG может инициировать передачу данных через шину USB OTG. Последняя версия дополнения также ввела HNP-опрос, в котором хост периодически опрашивает устройство USB во время активного сеанса, чтобы определить, не хочет ли оно стать хостом.

Session Request Protocol (SRP). Позволяет обоим коммуницирующим устройствам управлять моментом, когда активен линк сессии питания; в стандартной организации линка USB это может делать только хост. SRP позволяет точно управлять энергопотреблением, что очень важно для устройств, работающих от батареи (таких как камеры и мобильные телефоны). OTG или embedded-хост может оставить линк без питания, пока периферийное устройство (которым может быть устройство OTG или традиционное устройство USB) не потребует питания. OTG и embedded-хост, у которых осталось мало энергии батареи, могут оставить линк USB без питания, что увеличит время работы от батареи.

• Сертифицирован USB-IF для Universal Serial Bus Specification Rev 2.0 [4, 5].

• Включает полную поддержку (PHY) для опционального протокола On-The-Go (OTG), описанного в спецификации On-The-Go Supplement Rev 1.3 [3, 5].

   – Интегрированная поддержка идентификации устройств (A-B Device Identification, линия ID).
   – Интегрированная поддержка HNP и SRP.
   – Позволяет хосту выключить VBUS, чтобы сохранить энергию батареи в приложениях OTG.
   – Поддерживается мониторинг OTG уровней VBUS с помощью внутренних компараторов.
   – Поддерживается динамическое переключение ролей хост - устройство.

• Программное конфигурирование для работы в качестве:

   – поддержки SRP как периферийное устройство USB FS (B-устройство).
   – поддержки SRP как хост USB FS/LS (A-устройство).
   – устройства двойной роли (USB On-The-Go Full-Speed Dual Role device).

• Поддерживается FS SOF и LS импульсы для поддержания работоспособности (Keep-alive):

   – импульс SOF соединения PAD (OTG_FS_SOF).
   – импульс SOF внутреннего соединения с таймером 2 (TIM2).
   – Конфигурируемый период кадра (framing period).
   – Конфигурируемое прерывание конца фрейма (end of frame, EOF interrupt).

• Поддерживаются функции пониженного энергопотребления, такие как остановка системы во время USB Suspend, внутреннее выключение доменов тактов для цифрового ядра, управление питанием PHY и DFIFO.

• Выделенное RAM на 1.25 килобайта для продвинутого управления FIFO:

   – Конфигуриуемое разделение пространства RAM на разные стеки FIFO для гибкого и эффективного использования RAM.
   – Каждый FIFO может хранить несколько пакетов.
   – Динамическое выделение памяти.
   – Конфигурируемые размеры FIFO, которые могут быть не равны степени двойки, чтобы позволить использовать непрерывные области памяти.

• Гарантируется максимальная полоса пропускания USB до 1 фрейма (1 мс) без вмешательства системы.

[Функции режима хоста USB]

• Внешняя схема управления (charge pump) для генерации напряжения VBUS.

• До 8 каналов хоста (pipe): каждый канал динамически может переконфигурироваться, чтобы выделить любой тип транзакции USB.

• Встроенные аппаратный планировщик, обслуживающий:

   – до 8 interrupt запросов транзакций плюс isochronous запросов транзакций в периодической аппаратной очереди.
   – до 8 control запросов транзакций плюс bulk запросов транзакций в непериодической аппаратной очереди.

• Управление общим RxFIFO, периодическим TxFIFO и непериодическим TxFIFO для эффективного использования RAM данных USB.

[Функции режима устройства USB]

• 1 двунаправленная конечная точка управления 0 (control endpoint0), или она же контрольная точка по умолчанию (default endpoint).

• 3 конечные точки IN (далее конечные точки сокращенно обозначаются EP), конфигурируемые для поддержки транзакций Bulk, Interrupt или Isochronous.

• 3 EP OUT, конфигурируемые для поддержки транзакций Bulk, Interrupt или Isochronous.

• Управление общим RxFIFO и TxFIFO для эффективного использования RAM данных USB.

• Управление до 4 выделенных стеков Tx-IN FIFO (по одному для каждой активной IN EP), для уменьшения нагрузки на процессор и приложение.

• Поддержка функции программного отключения.

Основные отличия контроллеров сведены в таблицу:

Функция OTG_FS [6] OTG_HS
Поддерживаемые стандартные скорости устройства USB FS (full-speed) FS (full-speed), HS high-speed)
Поддерживаемые стандартные скорости хоста USB LS (low-speed), FS (full-speed) LS (low-speed), FS (full-speed), HS (high-speed)
Конечные точки устройства USB 0 .. 3 0 .. 5
Каналы хоста USB 0 .. 7 0 .. 11
Поддержка DMA - Есть
Дополнительный внешний интерфейс ULPI PHY [7] - Есть
Начальный адрес регистров в адресном пространстве 0x50000000 0x40040000
Split-транзакции - Есть
Ping HS - Есть

Новые функции OTG_HS потребовали дополнительных бит в регистрах (они были вставлены на места зарезервированных бит в регистрах контроллера OTG_FS) и даже потребовали добавления новых регистров. Во врезках статьи [6], в описаниях регистров высокоскоростного контроллера OTG_HS, дополнительные биты помечены оранжевым цветом.

STM32F4 OTG FS full speed block diagram fig386

Рис. 386. Блок-схема OTG full-speed.

Таблица 196. Ножки ввода/вывода OTG_FS.

Имя сигнала Тип сигнала Описание
OTG_FS_DP Цифровой двунаправленный сигнал (вход/выход) Сигнал USB OTG D+ (данные)
OTG_FS_DM Цифровой двунаправленный сигнал (вход/выход) Сигнал USB OTG D- (данные)
OTG_FS_ID Цифровой вход USB OTG ID (идентификация хост/устройство USB)
OTG_FS_VBUS Аналоговый вход USB OTG VBUS (для анализа уровня напряжения питания USB)
OTG_FS_SOF Цифровой выход USB OTG Start Of Frame (импульсы видимого сигнала начала фрейма, SOF)

Ядро OTG full-speed. USB OTG FS получает частоту тактов 48 МГц ±0.25% от контроллера сброса и тактирования (reset and clock controller, RCC), которая синтезируется от частоты внешнего кварца. Такты USB используются для домена 48 МГц на полной скорости (12 мегабит/сек) и эта тактовая частота должна быть разрешена перед конфигурированием ядра OTG FS core.

CPU читает из ядра OTG FS и записывает в него через шину периферийных устройств AHB. CPU информируется о событиях USB через одну линию прерывания USB OTG, которая описана в секции "Прерывания OTG_FS".

CPU передает данные через USB записью 32-битных слов в выделенные для этого ячейки OTG_FS (push-регистры). Эти данные автоматически сохраняются в стеки Tx-data FIFO, сконфигурированные из RAM данных USB. Здесь есть один Tx-FIFO push-регистр для каждой конечной точки IN (в режиме устройства USB) или канала OUT (в режиме хоста USB).

CPU принимает данные от USB чтением 32-битных слов из выделенных адресов OTG_FS (pop-регистры). Эти данные автоматически попадают в общие стеки Rx-FIFO, сконфигурированные в 1.25 килобайтах RAM данных USB. Здесь есть один Rx-FIFO pop-регистр для каждой конечной точки OUT или канала IN.

Слой протокола USB обслуживается подсистемой Serial Interface Engine (SIE), и поток данных преобразуется в последовательные биты USB FS/LS трансивером чипа MCU, формируя физический слой (PHY) шины USB.

Встроенный full-speed OTG PHY управляется ядром OTG FS, и передает сигналы управления и данные USB через полноскоростное подмножество шины UTMI+ (UTMIFS). Это обеспечивает физическую поддержку подключения USB.

Full-speed OTG PHY включает следующие компоненты:

• Модуль трансивера FS/LS, который используется и хостом USB, и устройством USB. Он напрямую вырабатывает сигналы передачи и считывает сигналы приема на линиях DP/DM (или D+ и D-) USB.
• Интегрированный верхний подтягивающий резистор для сигнала идентификации режима (ID pull-up) используется, чтобы прочитать уровень сигнала в процессе идентификации устройства A/B.
• Встроенные DP/DM резисторы pull-up и pull-down управляются ядром OTG_FS, в зависимости от текущей роли устройства. Если это периферийное устройство USB, то разрешается DP pull-up, чтобы сигнализировать о соединении full-speed как только VBUS была определена на допустимом уровне (допустимая B-сессия). В режиме хоста разрешаются pull-down резисторы на обоих сигналах DP/DM. Pull-up и pull-down резисторы динамически переключаются, когда меняется роль устройства по протоколу согласования хоста (HNP).
• Схема pull-up/pull-down резистора ECN. DP pull-up состоит из 2 резисторов, управляемых раздельно от OTG_FS в соответствии с указаниями Engineering Change Notice, применимые к USB Rev2.0 (см. USB_ECN_Resistor.pdf [5]). Динамическая подстройка тока DP pull-up позволяет улучшить подавление шума и качество сигнала Tx/Rx.
• Компараторы VBUS с гистерезисом, используемые для определения допустимого уровня VBUS и порогов A-B Session Valid и окончания сессии. Это используется для реализации протокола SRP, детектирования условий допустимого старта и окончания сессии, и для постоянного отслеживания уровня VBUS во время операций USB.
• Схема метода пульсации VBUS используется для заряда/разряда VBUS через резисторы во время SRP (при слабом токе).

Внимание! Чтобы гарантировать правильную работу периферийного устройства USB OTG FS, частота AHB должна быть выше 14.2 МГц.

[Устройство двойной роли (OTG dual role device, DRD]

STM32F4 OTG FS AB device connection fig387

Рис. 387. Подключение устройства OTG A-B.

Примечания:

1. Внешний регулятор напряжения нужен только когда делается устройство USB с питанием от шины VBUS.
2. STMPS2141STR нужно только если приложение должно поддерживать устройство с питанием от шины VBUS. Типовой мощный ключ может быть использован, если 5V есть на плате приложения.

Детектирование линии ID. Роль устройства USB (по умолчанию) или хоста USB распознается по ножке входа ID (OTG_FS_ID). Состояние сигнала ID определяется при подключении USB, в зависимости на какой стороне кабеля находится подключаемый коннектор-мама micro-AB:

• Если B-сторона кабеля USB подключена к плавающему проводу ID, то встроенный pull-up резистор определит высокий уровень ID, и по умолчанию будет назначена роль устройства USB. В этой конфигурации OTG_FS соответствует стандартной FSM, описанной в секции 6.8.2 On-The-Go B-device of the On-The-Go Specification Rev1.3 supplement to the USB2.0 [3, 5].
• Если A-сторона кабеля USB подключена к заземленному ID, OTG_FS выдаст прерывание изменения статуса линии ID (бит CIDSCHG в OTG_FS_GINTSTS) для инициализации ПО хоста, и происходит автоматическое переключение в роль хоста. В этой конфигурации OTG_FS соответствует стандартной FSM, описанной в секции 6.8.1: On-The-Go A-device of the On-The-Go Specification Rev1.3 supplement to the USB2.0 [3, 5].

HNP устройства двойной роли. Бит настройки функционала HNP в регистре глобальной конфигурации (регистр OTG_FS_GUSBCFG, бит HNPCAP) разрешает ядру OTG_FS динамически менять свою роль от A-хоста до A-периферийного устройства USB и обратно, или от B-периферийного устройства до B-хоста и обратно, по протоколу host negotiation protocol (HNP). Текущее состояние можно прочитать по комбинированным значениям бита Connector ID Status в регистре глобального статуса и управления OTG (бит CIDSTS в регистре OTG_FS_GOTGCTL) и биту текущего режима работы регистра глобальных прерываний и статуса (бит CMOD в регистре OTG_FS_GINTSTS).

Модель программирования HNP подробно описана далее в секции "Модель программирования OTG_FS".

SRP устройства двойной роли. Бит настройки функционала SRP в регистре глобальной конфигурации (регистр OTG_FS_GUSBCFG, бит SRPCAP) разрешает ядру OTG_FS выключать генерацию VBUS для A-устройства, чтобы экономить энергию. Обратите внимание, что A-устройство всегда управляет VBUS, независимо от роли OTG_FS - хост или периферийное устройство. Модель программирования SRP A/B-устройства подробно описано далее в секции "Модель программирования OTG_FS".

[Периферийное устройство USB]

В этом разделе приведено функциональное описание OTG_FS в режиме периферийного устройства USB. OTG_FS работает как устройство USB в следующих условиях:

• OTG B-устройство. Это состояние по умолчанию, если подключена B-сторона кабеля USB.
• OTG A-устройство. Это состояние OTG после HNP-переключения OTG_FS в роль периферийного устройства.
• B-устройство. Если есть линия ID, функция и подключение к B-стороне кабеля USB, и очищен бит HNPCAP в регистре OTG_FS_GUSBCFG (см. [3, 5], параграф 6.8.3).
• Только периферийное устройство (см. рис. 388). Установлен бит принудительного режима устройства (бит FDMOD в регистре OTG_FS_GUSBCFG), что заставляет ядро OTG_FS работать только как периферийное устройство USB (см. [3, 5], параграф 6.8.3). В этом случае линия ID игнорируется, даже если она присутствует на коннекторе USB.

Примечание: чтобы создать устройство с питанием от шины в случае B-устройства или конфигурации только разрешенного устройства USB, должен быть добавлен внешний регулятор, создающий напряжение питания VDD микроконтроллера из напряжения VBUS. Вывод VBUS может быть освобожден запретом опции анализа уровня VBUS. Это осуществляется установкой бита NOVBUSSENS в регистре OTG_FS_GCCFG. В этом случае VBUS считается внутри микроконтроллера, что у него всегда допустимый уровень для VBUS (5V).

STM32F4 OTG FS USB peripheral only connection fig388

Рис. 388. Подключение только как устройства USB.

Устройство с функцией SRP. Бит управления функцией SRP в регистре глобальной конфигурации (бит SRPCAP в регистре OTG_FS_GUSBCFG) разрешает OTG_FS поддерживать протокол запроса сессии session request protocol (SRP). Этот метод позволяет экономить питание, подаваемое на A-устройство путем выключения VBUS, когда приостанавливается сессия USB.

Подробно программная модель управления SRP описана ниже в секции "Протокол запроса сессии B-устройства".

Powered (запитано). Вход VBUS определяет допустимое напряжение B-сессии, при котором устройству USB разрешено войти в состояние powered (см. [4, 5], параграф "9.1 USB Device States"). Тогда OTG_FS автоматически подключит DP pull-up резистор, чтобы сигнализировать о подключении к хосту full-speed устройства, и генерирует прерывание запроса сессии (бит SRQINT в регистре OTG_FS_GINTSTS), чтобы оповестить MCU о состоянии powered.

Вход VBUS также гарантирует, что хостом поданы допустимые уровни VBUS во время операций USB. Если было определено, что уровень напряжения VBUS упал ниже допустимого для B-сессии (например из-за нарушения питания, или если порт хоста был выключен), то OTG_FS автоматически отключится, и детектируется окончание сессии с прерыванием (бит SEDET в регистре OTG_FS_GOTGINT), чтобы оповестить MCU о том, что OTG_FS вышел из состояния powered.

В состоянии powered OTG_FS ожидает получения некоторой сигнализации сброса от хоста. Никакие другие операции USB невозможны. Когда получен сигнал сброса, генерируется прерывание reset (бит USBRST в регистре OTG_FS_GINTSTS). Когда сигнал сброса завершится, генерируется прерывание завершения энумерации (бит ENUMDNE в регистре OTG_FS_GINTSTS), и OTG_FS входит в состояние по умолчанию (Default state).

Soft disconnect (программное отключение от шины). Из состояния powered можно выйти программно. Резистор DP pull-up отключается путем установки бита soft disconnect (бит SDIS в регистре OTG_FS_DCTL), что приводит к прерыванию отключения устройства на стороне хоста, даже если кабель USB устройства не был физически извлечен из порта хоста.

Состояние по умолчанию (Default state). В этом состоянии OTG_FS ожидает приема команды SET_ADDRESS от хоста. Никакие другие операции USB невозможны. Когда на шине USB была определена правильная команда SET_ADDRESS, программа MCU записывает соответствующий номер в поле адреса регистра конфигурации устройства (DAD в регистре OTG_FS_DCFG). После этого устройство входит в состояние адресованности (address state), и оно готово отвечать на транзакции хоста по сконфигурированному адресу USB.

Suspended (приостановка). Блок OTG_FS постоянно мониторит активность на шине USB. После 3 мс отсутствия активности (USB idleness) выдается прерывание предварительной приостановки (early suspend interrupt, бит ESUSP в регистре OTG_FS_GINTSTS), и это подтверждается на 3 мс позже, если это необходимо, прерыванием suspend (бит USBSUSP в регистре OTG_FS_GINTSTS). Тогда автоматически установится бит приостановки устройства в регистре статуса устройства (бит SUSPSTS в регистре OTG_FS_DSTS), и OTG_FS входит в состояние suspended.

Из состояния suspended может быть осуществлен выход по инициативе самого устройства. В этом случае программа MCU устанавливает бит сигнализации remote wakeup (бит RWUSIG в регистре OTG_FS_DCTL), и очистит его в интервале от 1 до 15 мс.

Когда был детектирован сигнал возобновления от хоста (resume signaling), генерируется resume interrupt (бит WKUPINT в регистре OTG_FS_GINTSTS), и автоматически очистится бит приостановки устройства.

Ядро OTG_FS устанавливает следующие конечные точки USB:

• Control endpoint 0 (EP0). Эта конечная точка двунаправленная, и обрабатывает только сообщения управления. Имеется отдельный набор регистров для обработки транзакций IN и OUT. Имеются соответствующие регистры управления (OTG_FS_DIEPCTL0/OTG_FS_DOEPCTL0), конфигурации транзакции (OTG_FS_DIEPTSIZ0/OTG_FS_DIEPTSIZ0) и статуса-прерывания (OTG_FS_DIEPINTx/OTG_FS_DOEPINT0). Биты, доступные внутри регистров управления и размеров транзакции, незначительно отличаются от других конечных точек.

• 3 конечные точки IN.

– Каждая из них может быть сконфигурирована для поддержки типов транзакций isochronous, bulk или interrupt.
– Каждая имеет соответствующие регистры управления (OTG_FS_DIEPCTLx), конфигурации транзакции (OTG_FS_DIEPTSIZx) и статуса-прерывания (OTG_FS_DIEPINTx).
– Общий регистр маски прерывания конечных точек Device IN (OTG_FS_DIEPMSK) позволяет разрешить/запретить источник прерывание одной конечной точки для всех конечных точек IN (включая EP0).
– Они поддерживают прерывание незавершенной изохронной транзакции IN (бит IISOIXFR в регистре OTG_FS_GINTSTS). Это прерывание выставляется, когда имеется по меньшей мере одна изохронная конечная точка IN, для которой транзакция не завершена в текущем кадре. Это прерывание выставляется вместе с периодическим прерыванием завершения фрейма (OTG_FS_GINTSTS/EOPF).

• 3 конечные точки OUT.

– Каждая из них может быть сконфигурирована для поддержки типов транзакций isochronous, bulk или interrupt.
– Каждая имеет соответствующие регистры управления (в регистре OTG_FS_GINTSTS), конфигурации транзакции (OTG_FS_DOEPTSIZx) и статуса-прерывания (OTG_FS_DOEPINTx).
– Общий регистр маски прерывания конечных точек Device OUT (OTG_FS_DOEPMSK) позволяет разрешить/запретить источник прерывание одной конечной точки для всех конечных точек OUT (включая EP0).
– Они поддерживают прерывание незавершенной изохронной транзакции OUT (бит INCOMPISOOUT в регистре OTG_FS_GINTSTS). Это прерывание выставляется, когда имеется по меньшей мере одна изохронная конечная точка OUT, для которой транзакция не завершена в текущем кадре. Это прерывание выставляется вместе с периодическим прерыванием завершения фрейма (OTG_FS_GINTSTS/EOPF).

Доступно управление следующими функциями конечной точки x через регистр управления IN/OUT (DIEPCTLx/DOEPCTLx):

• Разрешение/запрет конечной точки.
• Активация конечной точки в текущей конфигурации.
• Программирование типа транзакции USB (isochronous, bulk, interrupt).
• Программирование поддерживаемого размера пакета.
• Программирование номера Tx-FIFO, связанного с конечной точкой IN.
• Программирование ожидаемого или передаваемого data0/data1 PID (только для bulk/interrupt).
• Программирование четного/нечетного фрейма во время принятой или переданной транзакции (только isochronous).
• Опциональное программирование бита NAK, чтобы всегда отправлять отрицательное подтверждение хосту, независимо от статуса FIFO.
• Опциональное программирование бита STALL, чтобы всегда останавливать (stall) токены хоста для этой конечной точки.
• Опциональное программирование режима слежения (Snoop mode) для конечных точек OUT, где не проверена CRC принятых данных.

Регистры размера транзакции конечной точки x (DIEPTSIZx/DOEPTSIZx) позволяют приложению запрограммировать параметры размера транзакции и прочитать статус транзакции. Операция программирования должна быть выполнена перед установкой бита разрешения конечной точки в регистре управления конечной точкой.

Как только конечная точка разрешена, эти поля становятся только для чтения, поскольку ядро OTG_FS обновляет их текущим статусом транзакции.

Могут быть запрограммированы следующие параметры транзакции:

• Размер транзакции в байтах.
• Количество пакетов, составляющих общий размер транзакции.

Регистры прерывания конечной точки x устройства (DIEPINTx/DOPEPINTx) показывают статус конечной точки по отношению к событиям USB и AHB. Приложение должно прочитать эти регистры, когда установлен бит прерывания OUT или IN endpoint в регистре прерываний ядра (бит OEPINT в регистре OTG_FS_GINTSTS или бит IEPINT в регистре OTG_FS_GINTSTS, соответственно). Перед тем, как приложение может читать эти регистры, оно должно сначала прочитать регистр прерывания всех конечных точек (OTG_FS_DAINT), чтобы узнать точный номер регистра прерывания конечной точки X устройства. Приложение должно очистить подходящие биты в этом регистре, чтобы очистить соответствующие биты в регистрах DAINT и GINTSTS.

Ядро USB предоставляет следующие проверки статуса и генерации прерывания:

• Прерывание завершения транзакции, показывающее, что перемещение данных завершено с обоих сторон - приложение (AHB) и аппаратура (USB).
• Завершение процедуры настройки (Setup stage done, только для control-OUT).
• Связанный передающий стек (Tx-FIFO) опустошен наполовину или полностью (конечные точки IN).
• Хосту передано подтверждение NAK (только для isochronous-IN).
• Принят токен IN, когда Tx-FIFO был пуст (только для bulk-IN/interrupt-IN).
• Принят токен OUT, когда конечная точка не была еще разрешена.
• Детектирован ошибочный, помехообразный сигнал (Babble error condition).
• Действут запрет конечной точки со стороны приложения.
• Действует NAK конечной точки со стороны приложения (только для isochronous-IN).
• Принято больше чем 3 back-to-back пакета setup (только для control-OUT).
• Детектирован таймаут (только для control-in).
• Отброшен пакет isochronous OUT без генерации прерывания.

[Хост USB]

В этом разделе приведено функциональное описание работы блока OTG_FS в режиме хоста USB. OTG_FS работает как хост USB в следующих условиях:

• OTG A-хост. Состояние по умолчанию OTG A-устройства, когда подключена A-сторона кабеля USB.
• OTG B-хост. Состояние OTG B-устройства после переключения на роль хоста по протоколу HNP.
• A-устройство. Если присутствует линия ID, функционал и подключение произошло к A-стороне кабеля USB, и очищен бит функции HNP (бит HNPCAP в регистре OTG_FS_GUSBCFG). На линиях сигналов DP/DM автоматически подключатся встроенные pull-down резисторы.
• Режим работы только как хоста (см. рис. 389). Бит FHMOD в регистре OTG_FS_GUSBCFG принудительно переводит аппаратуру в режим работы хоста USB. В этом случае линия ID игнорируется, даже если она есть на коннекторе USB. На линиях сигналов DP/DM автоматически подключатся встроенные pull-down резисторы.

Примечание: генерация 5V VBUS внутри чипа MCU не поддерживается. По этой причине, если на плате доступно напряжение 5V или стабилизатор, то должен быть добавлен силовой ключ, чтобы управлять 5V шины VBUS. Внешний ключ или управляемый стабилизатор может управляться от любой выходной ножки GPIO. Это необходимо для конфигураций OTG A-хоста, A-устройства и режима "только хост". Вход VBUS обеспечивает проверку допустимых уровней VBUS, предоставленных ключом или стабилизатором во время нормальных операций USB, в то время как выходной сигнал перегрузки по току может приходить на любой вход GPIO, сконфигурированный для генерации прерываний порта. ISR перегрузки по току должен быстро запретить генерацию VBUS. Вывод VBUS может быть освобожден путем запрета опции анализа уровня VBUS (VBUS sensing). Это реализуется установкой бита NOVBUSSENS в регистре OTG_FS_GCCFG. В этом случае внутри чипа MCU считается, что на VBUS всегда допустимый уровень (5V).

STM32F4 OTG FS USB host only connection fig389

Рис. 389. Соединение только для хоста USB.

Примечания:

1. STMPS2141STR необходим только если приложение должно поддерживать устройство USB с питанием от шины (VBUS powered device). Базовый ключ питания может использоваться, если 5V доступны на плате приложения.
2. Диапазон VDD между 2V и 3.6V.

Хост с поддержкой SRP. Поддержка SRP доступна через бит опции SRP (бит SRPCAP в регистре OTG_FS_GUSBCFG). Когда функция SRP разрешена, хост может экономить энергию путем выключения напряжения VBUS, когда сессия USB приостановлена.

Подробно программная модель хоста для управления SRP описана ниже в секции "Протокол запроса сессии A-устройства".

Питание порта USB. Встроенная в MCU генерация 5V VBUS не поддерживается. По этой причине должна быть добавлена схема стабилизатора 5V (charge pump) или, если на плате приложения присутствует 5V, должен быть добавлен обычный силовой ключ, чтобы управлять уровнем 5V линии VBUS. Внешний стабилизатор (или ключ) может управляться любым выходом GPIO. Когда приложение хоста решает выдать питание на VBUS, используя выбранную ножку порта GPIO, оно также должно установить бит питания порта в регистре управления и статуса хоста (бит PPWR в регистре OTG_FS_HPRT).

Допустимость уровня VBUS. Когда функции HNP или SRP разрешены, то ножка входа для анализа уровня VBUS (VBUS sensing pin, PA9) должна быть подключена к VBUS. Вход VBUS гарантирует, что допустимые уровни VBUS подаются на устройство USB во время рабочих операций. Любое непредвиденное падение напряжения VBUS ниже порога допустимости (4.25V) приведет к генерации прерывания OTG от бита детектирования завершения сессии (бит SEDET в регистре OTG_FS_GOTGINT). Тогда приложению нужно снять питание VBUS и очистить бит питания порта (бит PPWR в регистре OTG_FS_HPRT).

Когда обе функции HNP и SRP запрещены, ножка детектирования уровня VBUS (PA9) не должна подключаться к VBUS. Она освобождается, и может использоваться как GPIO для любых целей.

Также используется флаг перегрузки по току стабилизатора (charge pump overcurrent flag) для предотвращения электрического повреждения системы питания VBUS. Подсоедините выход сигнала перегрузки по току к любому входу порта GPIO и сконфигурируйте его на генерацию прерывания при активном уровне. Обработчик прерывания перегрузки по току (overcurrent ISR) должен немедленно запретить генерацию VBUS и очистить бит питания порта (бит PPWR в регистре OTG_FS_HPRT).

Детектирование подключения периферийного устройства. Если разрешена функция SRP или HNP, то даже если периферийное устройство USB или B-устройства могут быть подключены в любой момент, OTG_FS не будет детектировать любое подключение к шине, пока на VBUS не окажется допустимый уровень (выше 4.75V). Когда VBUS на допустимом уровне, и подключено B-устройство, ядро OTG_FS выдает прерывание порта хоста, вызванное битом подключения устройства в регистре управления и статуса хоста (бит PCDET в регистре OTG_FS_HPRT).

Когда обе функции HNP и SRP запрещены, периферийные устройства USB или B-устройства, как только они были подключены. Ядро OTG_FS выдает прерывание порта хоста, вызванное битом подключения устройства в регистре управления и статуса хоста (бит PCDET в регистре OTG_FS_HPRT).

Детектирование отключения периферийного устройства. Событие отключения устройства USB приводит к срабатыванию прерывания отключения (disconnect detected interrupt, бит DISCINT в регистре OTG_FS_GINTSTS).

Энумерация хоста. После того, как хостом было детектировано подключение периферийного устройства, хост должен запустить процесс энумерации USB отправкой новому устройству команды сброса (USB reset) и команд конфигурирования.

Перед тем, как начать выдачу USB reset, приложение ждет прерывания OTG, вызванное битом окончания дребезга(debounce done, бит DBCDNE в регистре OTG_FS_GOTGINT), который показывает, что шина стала стабильной после электрических помех на pull-up резисторе DP (FS) или DM (LS), вызванных физическим подключением устройства USB к шине.

Приложение выдает сигнализацию USB reset (single-ended zero, несимметричный нуль) через шину путем удержания бита сброса порта в регистре управления и статуса порта (бит PRST в регистре OTG_FS_HPRT) на время минимум 10 мс и максимум 20 мс. Приложение заботится об отсчете этого времени, и затем очищает бит сброса порта.

Как только последовательность USB reset завершена, срабатывает прерывание порта хоста из-за изменения бита разрешения/запрета порта (бит PENCHNG в регистре OTG_FS_HPRT). Это оповещает приложение, что скорость прошедшего энумерацию устройства может быть прочитана из поля скорости порта в регистре управления и статуса хоста (бит PSPD в регистре OTG_FS_HPRT), и хост начинает выдавать сигналы начала фрейма SOF (FS) или сигналы "поддержания жизни" Keep alive (LS). Хост теперь готов завершить энумерацию периферийного устройства отправкой команд конфигурирования.

Приостановка хоста (Host Suspend). Приложение принимает решение приостановить активность USB установкой бита приостановки порта в регистре управления и статуса порта (бит PSUSP в регистре OTG_FS_HPRT). Ядро OTG_FS останавливает отправку сигналов SOF и входит в состояние suspended.

Из состояния suspended можно опционально выйти по инициативе подключенного устройства USB (remote wakeup). В этом случае при определении сигнала удаленного пробуждения генерируется прерывание remote wakeup (битом WKUPINT в регистре OTG_FS_GINTSTS), автоматически установится бит возобновления работы порта в регистре управления и статуса порта хоста (port resume, бит PRES в регистре OTG_FS_HPRT), и через USB автоматически передается сигнализация возобновления работы (resume signaling). Приложение должно выждать окно возобновления, и затем очистить бит возобновления порта, чтобы выйти из состояния suspended и перезапустить SOF.

Если из состояния suspended произошел выход по инициативе хоста, то приложение должно установить бит возобновления порта (port resume bit), чтобы запустить сигнализацию возобновления на порту хоста, выждать окно времени возобновления и в завершении очистить бит возобновления порта.

Ядро OTG_FS инстанциирует 8 каналов хоста. Каждый канал хоста поддерживает транзакцию хоста USB (USB pipe). Хост не может одновременно поддерживать больше 8 запросов транзакций. Если от приложения было выдано больше 8 запросов на транзакцию, то драйвер контроллера хоста (host controller driver, HCD) должен заново выделить каналы, когда они станут доступны после предыдущей активности, т. е. после получения прерываний завершения транзакции и приостановки канала.

Каждый канал хоста может быть сконфигурирован для поддержки направления IN/OUT и любого типа периодической или не переодической транзакции. Каждый канал хоста обеспечивает надлежащие регистры управления (HCCHARx), конфигурации транзакции (HCTSIZx) и статуса/прерывания (HCINTx) вместе со связанными регистрами маски (HCINTMSKx).

Управление каналом хоста. Для приложения доступны следующие опции управления каналом x через регистр характеристик канала (HCCHARx):

– Разрешение/запрет канала.
– Программирование скорости FS/LS целевого периферийного устройства USB.
– Программирование адреса целевого периферийного устройства USB.
– Программирование номера конечной точки целевого периферийного устройства USB.
– Программирование направления транзакции IN/OUT.
– Программирование типа транзакции USB (control, bulk, interrupt, isochronous).
– Программирование максимального размера пакета (MPS).
– Программирование периодической передачи, которая должна выполняться на нечетных/четных фреймах.

Транзакция канала хоста. Регистры размера транзакции канала (HCTSIZx) позволяют приложению запрограммировать размеры транзакции и прочитать статус транзакции. Программирование должно быть выполнено перед установкой бита разрешения канала в регистре характеристик канала. Как только конечная точка разрешена, поле счетчика пакетов становится read-only, поскольку ядро OTG_FS обновляет его в соответствии с текущим статусом транзакции.

Можно запрограммировать следующие параметры:

– Размер транзакции в байтах.
– Количество пакетов, составляющих общий размер транзакции.
– Начальный data PID.

Статус/прерывание канала хоста. Регистр прерывания канала x хоста (HCINTx) показывает состояние конечной точки, относящиеся к событиям USB и AHB. Приложение должно прочитать этот регистр, когда установится бит прерывания каналов хоста в регистре прерываний ядра (бит HCINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать эти регистры, оно должно сначала прочитать регистр прерывания всех каналов (HCAINT), чтобы получить точный номер канала для регистра прерывания канала x хоста. Приложение должно очистить подходящий бит в этом регистре, чтобы очистить соответствующие биты в регистрах HAINT и GINTSTS. Также доступны биты маски для каждого источника прерывания каждого канала в регистре OTG_FS_HCINTMSKx.

Ядро хоста предоставляет следующие проверки статуса и генерацию прерывания:

– Прерывание завершения транзакции, которое показывает завершение перемещения данных с обоих сторон - приложение (AHB) и аппаратура (USB).
– Канал был остановлен из-за завершения транзакции, USB ошибки транзакции или команды запрета от приложения.
– Связанный стек передачи (TxFIFO) опустошен наполовину или полностью (конечные точки IN).
– Принят положительный ответ/подтвеждение ACK.
– Принят отрицательный ответ/подтвеждение NAK.
– Принят ответ STALL.
– Ошибка транзакции USB из-за несовпадения CRC, таймаута, ошибки бит-стаффинга, ложного EOP.
– Ошибка сигнала (babble error).
– Переполнение кадра (frame overrun).
– Ошибка переключения данных (data toggle error).

В ядро хоста встроен аппаратный планировщик, который может автономно изменять порядок выполнения запросов USB-транзакций, которые выдало приложение, и управлять ими. В начале каждого фрейма хост сначала выполняет периодические транзакции (isochronous и interrupt), за которыми идут не периодические (control и bulk) транзакции, чтобы достичь более высокого приоритета для типов транзакций isochronous и interrupt - в соответствии со спецификацией USB.

Хост обрабатывает транзакции USB через очереди запросов (одна для периодических, другая для непериодических транзакций). Каждая очередь запросов может хранить в себе до 8 элементов. Каждый элемент очереди представляет запрос транзакции от приложения, и в нем хранится номер канала IN или OUT вместе с другой информацией, чтобы выполнять транзакции по шине USB. Порядок, в котором эти запросы были записаны в очередь, определяет последовательность выдачи транзакций через интерфейс USB.

В начале каждого фрейма хост сначала обрабатывает очередь периодических запросов, затем очередь непериодических запросов. Хост выдает прерывание незавершенной периодической транзакции (incomplete periodic transfer interrupt, бит IPXFR в регистре OTG_FS_GINTSTS), если в конце фрейма все еще ожидает обработки isochronous или interrupt транзакция, запланированная для текущего фрейма. Ядро OTG_FS полностью отвечает за обслуживание периодических и не периодических очередей запросов. Регистр периодического TxFIFO и статуса очереди (HPTXSTS) и регистр не периодического TxFIFO и статуса очереди (HNPTXSTS) предназначены только для чтения, и могут использоваться приложением для чтения статуса каждой очереди запросов. Они содержат:

• Количество свободных элементов в периодической (или не периодической) очереди запросов (всего может быть 8 максимум).
• Свободное пространство, доступное в настоящий момент в периодическом (или не периодическом) Tx-FIFO (транзакции OUT).
• Токен IN/OUT, номер канала и другая информация состояния.

Поскольку очереди запросов могут хранить максимум 8 элементов каждая, приложение может заранее планировать операции с хостом в отношении того момента, когда они физически достигают SB, максимум для 8 ожидающих периодических транзакций плюс 8 ожидающих непериодических транзакций.

Для проталкивания запроса транзакции планировщику хоста (постановки запроса в очередь) приложение должно проверить, что в периодической (не периодической) очереди доступно как минимум одно свободное место, путем чтения бит PTXQSAV в регистре OTG_FS_HNPTXSTS или бит NPTQXSAV в регистре OTG_FS_HNPTXSTS.

[Триггер SOF]

Ядро OTG_FS предоставляет способ мониторить, отслеживать и конфигурировать кадры SOF в хосте и периферийном устройстве USB, также как и функцию вывода импульса SOF.

Такие утилиты особенно полезны для техник адаптивной генерации тактов аудио, где периферийное аудиоустройство нуждается в синхронизации по изохронному потоку, предоставляемому PC, или хосту нужно обрезать свою частоту кадров в соответствии с требованиями периферийного аудиоустройства.

SOF хоста. В режиме хоста программируется количество тактов PHY, происходящих между генерацией двух идущих друг за другом токена SOF (FS) или Keep-alive (LS). Это программируется в регистре интервалов фрейма хоста (OTG_FS_HFIR), что дает возможность приложению управлять периодом фреймов SOF. Генерируется прерывание в начале любого фрейма (бит SOF в регистре OTH_FS_GINTSTS). Текущий номер фрейма и оставшееся время до следующего SOF отслеживается в регистре номера фрейма хоста (OTG_FS_HFNUM).

Сигнал импульса SOF длительностью 20 тактов HCLK, генерируемый на любом стартовом токене SOF, может быть выведен наружу через вывод OTG_FS_SOF с использованием бита SOFOUTEN в главном регистре конфигурации ядра (OTG_FS_GCCFG). Импульс SOF также внутри соединяется со входом триггера таймера 2 (TIM2), так что функции захвата по входу (input capture), сравнения по выходу (output compare) и сам таймер могут срабатывать по импульсу SOF. Соединение TIM2 разрешается битами ITR1_RMP регистра опций таймера 2 (TIM2_OR).

STM32F4 OTG FS SOF connectivity fig390

Рис. 390. Соединение SOF.

SOF периферийного устройства. В режиме устройства USB прерывание начала фрейма (start of frame, SOF) генерируется всякий раз, когда по шине USB принят токен SOF (бит SOF в регистре OTH_FS_GINTSTS). Соответствующий номер фрейма может быть прочитан в регистре статуса устройства (бит FNSOF регистра OTG_FS_DSTS). Также генерируется сигнал импульса SOF шириной 20 тактов HCLK, и он может быть доступен снаружи на выводе OTG_FS_SOF, если использовать бит разрешения выхода SOF в регистре основной конфигурации ядра (бит SOFOUTEN в регистре OTG_FS_GCCFG). Импульс SOF также внутри соединяется со входом триггера таймера 2 (TIM2), так что функции захвата по входу (input capture), сравнения по выходу (output compare) и сам таймер могут срабатывать по импульсу SOF. Соединение TIM2 разрешается битами ITR1_RMP регистра опций таймера 2 (TIM2_OR).

Прерывание завершения периодического фрейма (GINTSTS/EOPF) используется для оповещения приложения, когда истекают 80%, 85%, 90% или 95% интервала фрейма, в зависимости от поля интервала в регистре конфигурации устройства (бит PFIVL в регистре OTG_FS_DCFG). Эта функция может использоваться, чтобы определить, завершен ли весь изохронный трафик для этого фрейма.

[Режимы пониженного энергопотребления OTG]

Таблица 197 определяет режимы пониженного потребления энергии STM32 (low power modes) и их совместимость с OTG.

Таблица 197. Совместимость режимов STM32 low power с OTG.

Режим Описание Совместимость USB
Run MCU полностью активен Требуется, когда USB не в состоянии приостановки (suspend).
Sleep Выход из USB suspend приводит к выходу MCU из режима Sleep. Содержимое регистров периферии сохраняется. Доступно, пока USB в состоянии приостановки (suspend).
Stop Выход из USB suspend приводит к выходу MCU из режима Stop. Содержимое регистров периферии сохраняется(1).
Standby Полное выключение (powered-down). Периферия должна быть инициализирована заново после выхода из режима Standby. Нет совместимости с приложениями USB.

Примечание (1): в режиме Stop возможны различные настройки. Также могут существовать различные ограничения, см. секцию 5 "Power controller (PWR)" [1] для получения представления, какие накладываются ограничения (если они есть) при использовании OTG.

Потребление энергии блоком OTG PHY управляется тремя битами в основном регистре конфигурации ядра:

• PHY power down (GCCFG/PWRDWN). Он включает/выключает модуль полноскоростного трансивера PHY. Он должен быть предварительно установлен, чтобы была возможна любая операция USB.
• A-VBUS sensing enable (GCCFG/VBUSASEN). Он включает/выключает компараторы VBUS, связанные с функционированием A-устройства. Он должен быть установлен, когда используется режим A-устройства (хост USB) и во время действия функции HNP.
• B-VBUS sensing enable (GCCFG/VBUSASEN). Он включает/выключает компараторы VBUS, связанные с операциями B-устройства. Он должен быть установлен, когда активен режим B-устройства (устройство USB) и во время действия функции HNP.

Доступны техники снижения потребления энергии, когда USB находится в состоянии приостановки (suspended state), если сессия USB пока не работает, или устройство не подключено.

• Stop PHY clock (STPPCLK bit in OTG_FS_PCGCCTL). Когда установлен бит остановки тактирования PHY в регистре управления тактированием, функцией управления тактами (clock gating) выключается большая часть домена тактов 48 МГц внутреннего полноскоростного ядра OTG. Урезается динамическое энергопотребление из-за активности переключения тактов USB, даже если приложение удерживает в работе вход тактов 48 МГц. Большая часть трансивера также запрещена, и остается в работе только часть, отвечающая за определение асинхронного возобновления или события удаленного пробуждения (remote wakeup event).
• Gate HCLK (GATEHCLK bit in OTG_FS_PCGCCTL). Когда установлен бит GATEHCLK в регистре управления тактированием, большая часть системного домена тактов внутри ядра OTG_FS выключается функцией управления тактами. Доступен только интерфейс чтения и записи регистров. Урезается динамическое потребление энергии из-за активности переключения тактов USB, даже если остальная часть системных тактов остается активной для обслуживания других функций.
• USB system stop. Когда OTG_FS находится в состоянии приостановки (USB suspended state), приложение может принять решение кардинально уменьшить общее потребление энергии путем полного выключения всех источников тактирования в системе. USB System Stop активируется путем предварительной установки бита Stop PHY clock, и затем конфигурованием режима глубокого сна системы (system deep sleep mode) в модуле управления энергопотреблением системы (power control system module, PWR). Ядро OTG_FS автоматически реактивирует обе системы и такты USB путем асинхронного детектирования сигнализации remote wakeup (при работе в режиме хоста USB) или resume (при работе в режиме устройства USB) на шине USB.

Для снижения динамического энергопотребления USB data FIFO тактируется только когда к нему обращается ядро OTG_FS.

[Динамическое обновление регистра OTG_FS_HFIR]

Ядро USB обеспечивает возможность динамического обрезания периода фрейма SOF в режиме хоста, что позволяет синхронизировать внешнее устройство по фреймам SOF.

Когда регистр OTG_FS_HFIR меняется в пределах текущего фрейма SOF, в следующем фрейме применяется период коррекции SOF, как это показано на рис. 391.

STM32F4 OTG FS updating OTG FS HFIR dynamically fig391

Рис. 391. Динамическое обновление OTG_FS_HFIR.

[USB data FIFO]

В подсистеме USB применена 1.25 килобайт выделенной RAM с продвинутым механизмом управления FIFO. Модуль пакетного контроллера FIFO в ядре OTG_FS организует это пространство RAM в стеки Tx-FIFO, куда приложение проталкивает данные, где они временно хранятся до момента реальной передачи через USB. Также в этой RAM организуется один RxFIFO, куда данные принимаются через USB, и где они временно сохраняются до момента, когда их прочитает (извлечет) приложение. Количество FIFO и как они организованы внутри RAM, зависит от роли устройства. В режиме периферийного устройства для каждой активной конечной точки IN организуется дополнительный Tx-FIFO. Любой размер FIFO конфигурируется программно, чтобы лучше удовлетворить требованиям приложения.

[Архитектура FIFO устройства USB]

STM32F4 OTG FS Device mode FIFO address mapping fig392

Рис. 392. Отображение адресов FIFO в режиме устройства и отображение доступа AHB FIFO.

RxFIFO. Периферия OTG использует один FIFO приема, который получает данные, направляемые во все конечные точки OUT. Принятые пакеты укладываются друг на друга, пока в Rx-FIFO есть свободное место. Статус принятого пакета (где содержится номер конечной точки назначения OUT, количество байт, data PID и достоверность принятых данных) также сохраняется ядром поверх полезной нагрузки данных. Когда больше нет свободного места, транзакции хоста отклоняются выдачей NACK, и на адресованной конечной точке генерируется прерывание. Размер FIFO приема конфигурируется в регистре GRXFSIZ.

Архитектура одиночного FIFO приема повышает эффективность заполнения буфера приема RAM устройства USB:

• Все конечные точки OUT используют общий буфер RAM (общий FIFO).
• Ядро OTG_FS может заполнять FIFO приема до предела любой последовательностью токенов OUT хоста.

Приложение получает прерывание заполненности приема (Rx-FIFO non-empty, бит RXFLVL в регистре OTG_FS_GINTSTS), пока имеется как минимум 1 пакет, доступный для выборки из FIFO. Приложение считывает информацию о пакете из регистра статуса чтения и выборки (GRXSTSP) и в завершение извлекает данные из FIFO приема путем чтения по соответствующему адресу выборки определенной конечной точки.

TxFIFO. У ядра есть выделенный стек FIFO для каждой конечной точки IN. Приложение конфигурирует размеры FIFO записью в регистр размера FIFO не периодических передач (OTG_FS_TX0FSIZ) для IN endpoint0 и в регистры размера FIFOx конечных точек IN (DIEPTXFx) для конечной точки IN с номером x.

[Архитектура FIFO хоста USB]

STM32F4 OTG FS Host mode FIFO address mapping fig393

Рис. 393. Отображение адресов FIFO в режиме хоста и отображение доступа AHB FIFO.

RxFIFO. Хост использует один FIFO приема для всех периодических и не периодических транзакций. Этот FIFO используется как буфер приема, чтобы хранить принятые данные (полезную нагрузку принятого пакета) от USB до тех пор, пока они не будут перемещены в память системы. Пакеты, принятые от любой конечной точки remote IN, укладываются в стек друг на друга, пока есть для этого свободное место. В FIFO также сохраняется статус каждого принятого пакета с каналом назначения хоста, количеством байт, data PID и достоверностью принятых данных. Размер FIFO приема конфигурируется в регистре (GRXFSIZ).

Архитектура одиночного FIFO приема значительно повышает эффективность заполнения буфера приема данных хоста USB:

• Все каналы хоста, сконфигурированные как IN, используют общий буфер RAM (общий FIFO).
• Ядро OTG_FS может заполнять FIFO приема до предела любой последовательностью токенов IN под управлением программы хоста.

Приложение получает прерывание заполненности приема (RxFIFO not-empty), пока имеется как минимум 1 пакет, доступный для выборки из FIFO. Приложение считывает информацию пакета из регистра статуса и выборки приема, и в завершение извлекает данные из FIFO приема.

TxFIFO. Хост использует один передающий FIFO для всех не периодических (control и bulk) OUT-транзакций, и один передающий FIFO для всех периодических (isochronous и interrupt) OUT-транзакций. Стеки FIFO используются как буферы передачи, чтобы временно хранить данные (полезную нагрузку передаваемого пакета), которые должны быть переданы через USB. Размер периодического (или не периодического) TxFIFO конфигурируется в регистрах HPTXFSIZ/HNPTXFSIZ.

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

Архитектура двух FIFO передачи предоставляет хосту USB раздельную оптимизацию обслуживания периодического и не периодического буфера данных:

• Все каналы хоста конфигурируются для поддержки периодических (не периодических) транзакций в направлении OUT с использованием одного и того же RAM-буфера (общие FIFO).
• Ядро OTG_FS может заполнить периодические (не периодические) FIFO передачи до предела любой последовательностью токенов OUT под управлением программы хоста.

Ядро OTG_FS выдает прерывание опустошенности периодического TxFIFO (бит PTXFE в регистре OTG_FS_GINTSTS), пока периодический Tx-FIFO пуст наполовину или полностью, в зависимости от бита уровня опустошенности стека периодической передачи (periodic Tx-FIFO empty level bit) в регистре конфигурации AHB (бит PTXFELVL в регистре OTG_FS_GAHBCFG). Приложение может проталкивать данные передачи в стек, пока есть в нем свободное место, что справедливо как для периодического TxFIFO, так и для периодической очереди запросов. Может быть прочитан регистр статуса периодического FIFO передачи и очереди (HPTXSTS), чтобы определить сколько есть места в них обоих.

Ядро OTG_FS выдает прерывание опустошенности не периодического TxFIFO (бит NPTXFE в регистре OTG_FS_GINTSTS), пока не периодический TxFIFO опустошен наполовину или полностью, в зависимости от бита уровня опустошенности стека не периодической передачи (non periodic TxFIFO empty level bit) в регистре конфигурации AHB (бит TXFELVL в регистре OTG_FS_GAHBCFG). Приложение может проталкивать данные передачи в стек, пока есть в нем свободное место, что справедливо как для не периодического TxFIFO, так и для не периодической очереди запросов. Может быть прочитан регистр статуса не периодического FIFO передачи и очереди (HNPTXSTS), чтобы определить сколько есть места в них обоих.

[Выделение FIFO RAM]

Режим устройства USB, RxFIFO. Приложение должно выделить RAM для пакетов SETUP: 10 ячеек должно быть зарезервировано в FIFO приема, чтобы принимать пакеты настройки устройства USB (SETUP packets) на конечной точки управления (endpoint0). Ядро не использует эти ячейки, зарезервированные для пакетов SETUP, чтобы записывать туда какие-либо другие данные. Одна ячейка выделяется для Global OUT NAK. Информация статуса записывается в FIFO вместе с каждым принятым пакетом. Таким образом, для принимаемых пакетов должно быть выделено минимальное пространство (размер самого большого пакета / 4) + 1. Если разрешено несколько изохронных конечных точек, то как минимум два пространства (размер самого большого пакета / 4) + 1 должно быть выделено, чтобы принимать пакеты друг за другом. Обычно рекомендуется выделять два пространства (размер самого большого пакета / 4) + 1, чтобы когда предыдущий пакет передавался CPU, USB могло принять следующий пакет (двойная буферизация).

Вместе с последним пакетом для каждой конечной точки в FIFO также проталкивается информация полного статуса. Обычно рекомендуется одна ячейка для каждой конечной точки OUT.

Режим устройства USB, TxFIFO. Минимальное требуемое пространство RAM для каждой конечной точки IN передающего FIFO равно максимальному размеру пакета для конкретной конечной точки IN.

Примечание: чем больше выделено места на FIFO конечной точки передачи IN, тем можно получить больше производительности по шине USB.

Режим хоста USB, RxFIFO. Информация статуса записывается в FIFO вместе с каждым принятым пакетом. Таким образом, для приема пакетов должно быть выделено минимальное пространство (размер самого большого пакета / 4) + 1. Если разрешено несколько изохронных каналов, то должно быть выделено как минимум два пространства (размер самого большого пакета / 4) + 1, чтобы принимать следующие друг за другом пакеты. Обычно рекомендуется два пространства (размер самого большого пакета / 4) + 1, чтобы при обработке CPU одного уже принятого пакета по шине USB можно было принимать следующий пакет (двойная буферизация).

Вместе с последним пакетом на канале хоста в FIFO проталкивается полная информация статуса транзакции. Так что для этого должна быть выделена еще одна ячейка.

Режим хоста USB, TxFIFO. Минимальное требуемое пространство RAM для не периодического FIFO передачи хоста равно максимальному размеру пакета для всех поддерживаемых не периодических каналов OUT.

Обычно рекомендуется выделять двойной размер самого большого пакета, чтобы в процессе передачи по USB одного пакета CPU мог предоставить следующий пакет.

Примечание: чем больше выделено места на не периодический FIFO передачи, тем можно получить больше производительности по шине USB.

Минимальное требуемое пространство RAM для периодического FIFO передачи хоста равно максимальному размеру пакета для всех поддерживаемых периодических каналов OUT. Если имеется как минимум одна конечная точка Isochronous OUT, то должно быть выделено как минимум двойное пространство от самого большого размера пакета этого канала.

[Производительность системы USB]

Лучшая производительность USB и системы в целом достигается благодаря большим буферам RAM, большим возможностям по конфигурированию размеров FIFO, быстрому 32-битному доступу к FIFO через регистры push/pop шины AHB, и особенно благодаря продвинутому механизму управления FIFO. Действительно, этот механизм позволяет OTG_FS заполнять доступное пространство RAM самым лучшим образом, вне зависимости от текущей последовательности USB. С помощью этих функций:

• Приложение получает преимущества подстройки своего вмешательства в процесс передачи информации, чтобы оптимизировать использование процессорного времени CPU:

– Оно может накапливать большое количество передаваемых данных, когда данные эффективно передаются через USB.
– Получает широкие границы интервалов времени, когда можно загружает данные из одного FIFO приема.

• Ядро USB может поддерживает полную скорость (full speed, FS) передачи, обеспечивая максимальную полосу пропускания с большой автономией аппаратуры, освобождая приложение от лишних действий:

– Имеется в распоряжении большой резерв передаваемых данных, чтобы можно было автономно управлять передачей данных по шине USB.
– Имеется много свободного места в буфере приема, чтобы автономно заполнять его данными, приходящими от USB.

Поскольку ядро OTG_FS может очень эффективно заполнять буфер 1.25 килобайт RAM, и поскольку этого пространства более чем достаточно для передачи/приема данных полноскоростного фрейма, система USB может выдерживать максимальную скорость передачи данных до одного фрейма USB (следующего с интервалами 1 мс) без какого-либо вмешательства со стороны CPU.

[Прерывания OTG_FS]

Когда контроллер OTG_FS работает в одном из режимов, либо устройства USB, либо хоста, приложение не должно обращаться к регистрам другого режима. Если произойдет недопустимый доступ, то произойдет прерывание несовпадения (mismatch interrupt), и это будет отражено в регистре прерываний ядра (бит MMIS в регистре OTG_FS_GINTSTS). Когда ядро переключается из одного режима в другой, регистры в новом режиме работы должны быть перепрограммированы так же, как после перезагрузки или сброса при включении питания.

STM32F4 OTG FS interrupt hierarchy fig394

Рис. 394. Иерархия прерываний.

Примечание (1): OTG_FS_WKUP становится активным (состояние лог. 1), когда происходит событие возобновления во время состояний L1 SLEEP или L2 SUSPEND.

[Регистры управления и статуса OTG_FS]

Через чтение и запись регистров управления и статуса (control and status registers, сокращенно CSR) через интерфейс AHB slave, приложение может управлять контроллером OTG_FS. Эти регистры 32-разрядные, и их адреса выровнены на границу 32-битного блока (байтовый адрес делится нацело на 4). К регистрам OTG_FS должен осуществляться доступ только через слова (32 бита).

Регистры CSR классифицируются следующим образом:

• Глобальные регистры ядра.
• Регистры режима хоста USB.
• Глобальные регистры хоста USB.
• CSR порта хоста USB.
• Регистры, специфичные для канала хоста USB.
• Регистры режима устройства USB.
• Глобальные регистры устройства USB.
• Регистры, специфичные для конечной точки устройства USB.
• Регистры управления питанием и тактированием.
• Регистры доступа к Data FIFO (DFIFO).

В обоих режимах, и хоста и устройства USB, можно обращаться только к глобальным регистрам ядра, регистрам управления питания и тактирования, регистрам доступа к Data FIFO и к регистрам управления и статуса порта хоста. Когда контроллер OTG_FS работает в одном из режимов (хост или устройство), приложение не должно обращаться к регистрам другого режима. Если происходит недопустимый доступ, то генерируется прерывание несовпадения (mismatch interrupt), и это будет отражено в регистре прерываний ядра (бит MMIS в регистре OTG_FS_GINTSTS). Когда ядро переключается из одного режима в другой, регистры в новом режиме работы должны быть перепрограммированы так же, как после перезагрузки или сброса при включении питания.

Карта памяти CSR. Регистры режима хоста и режима устройства находятся по разным адресам. Все регистры реализованы в домене тактов AHB. Смещения адресов регистров OTG_FS в адресном пространстве STM32F4xx отсчитываются относительно адреса 0x50000000 (см. таблицу 1 в даташите [1]).

STM32F4 OTG FS CSR memory map fig395

Рис. 395. Карта памяти регистров CSR.

Примечание (1): x = 3 в режиме устройства USB и x = 7 в режиме хоста USB.

Карта памяти глобальных CSR. Эти регистры доступны в обоих режимах - и в режиме хоста, и в режиме устройства USB.

Таблица 198. Глобальные регистры ядра для управления и статуса (CSR).

Имя регистра Смещ. адреса Полное название регистра
OTG_FS_GOTGCTL 0x000 OTG_FS control and status register (регистр управления и статуса OTG FS).
OTG_FS_GOTGINT 0x004 OTG_FS interrupt register (регистр прерываний OTG FS).
OTG_FS_GAHBCFG 0x008 OTG_FS AHB configuration register (регистр конфигурации OTG FS AHB).
OTG_FS_GUSBCFG 0x00C OTG_FS USB configuration register (регистр конфигурации OTG FS USB).
OTG_FS_GRSTCTL 0x010 OTG_FS reset register (регистр сброса OTG FS).
OTG_FS_GINTSTS 0x014 OTG_FS core interrupt register (регистр прерываний ядра OTG FS).
OTG_FS_GINTMSK 0x018 OTG_FS interrupt mask register (регистр маски прерываний OTG FS).
OTG_FS_GRXSTSR 0x01C OTG_FS Receive status debug read/OTG status read and pop registers (регистр статуса приема для отладки / чтение статуса OTG и pop-регистров).
OTG_FS_GRXSTSP 0x020
OTG_FS_GRXFSIZ 0x024 OTG_FS Receive FIFO size register (регистр размера FIFO приема OTG FS).
OTG_FS_HNPTXFSIZ
/OTG_FS_DIEPTXF0(1)
0x028 OTG_FS Host non-periodic transmit FIFO size register (регистр размера не периодического FIFO хоста) / Endpoint 0 Transmit FIFO size (регистр размера передающего FIFO конечной точки 0).
OTG_FS_HNPTXSTS 0x02C OTG_FS non-periodic transmit FIFO / queue status register (регистр не периодического FIFO передачи / регистр статуса очереди).
OTG_FS_GCCFG 0x038 OTG_FS general core configuration register (основной регистр конфигурации ядра OTG FS).
OTG_FS_CID 0x03C OTG_FS core ID register (регистр ID ядра).
OTG_FS_HPTXFSIZ 0x100 OTG_FS Host periodic transmit FIFO size register (регистр размера периодического FIFO передачи хоста).
OTG_FS_DIEPTXFx 0x104
0x108
0x10C
OTG_FS device IN endpoint transmit FIFO size register (регистр размера передающего FIFO конечной точки устройства IN). Здесь x это номер FIFO в диапазоне 1 .. 3.

Примечание (1): основное правило - использовать OTG_FS_HNPTXFSIZ в режиме хоста и OTG_FS_DIEPTXF0 в режиме устройства.

Карта памяти CSR режима хоста. Эти регистры должны программироваться всякий раз, когда ядро меняет режим на хост USB.

Таблица 199. Регистры ядра управления и статуса (CSR) режима хоста.

Имя регистра Смещ. адреса Полное название регистра
OTG_FS_HCFG 0x400 OTG_FS Host configuration register (регистр конфигурации хоста OTG FS).
OTG_FS_HFIR 0x404 OTG_FS Host frame interval register (регистр интервала фрейма хоста OTG FS).
OTG_FS_HFNUM 0x408 OTG_FS Host frame number/frame time remaining register (регистр номера фрейма хоста / оставшегося времени фрейма OTG FS).
OTG_FS_HPTXSTS 0x410 OTG_FS_Host periodic transmit FIFO/queue status register (регистр периодического FIFO передачи хоста / регистр статуса очереди).
OTG_FS_HAINT 0x414 OTG_FS Host all channels interrupt register (регистр прерываний всех каналов хоста OTG FS).
OTG_FS_HAINTMSK 0x418 OTG_FS Host all channels interrupt mask register (регистр маски прерываний всех каналов хоста OTG FS).
OTG_FS_HPRT 0x440 OTG_FS Host port control and status register (регистр управления и статуса порта хоста OTG FS).
OTG_FS_HCCHARx 0x500
0x520
...
0x5E0
OTG_FS Host channel-x characteristics register (регистр характеристик канала x хоста). Здесь x это номер канала в диапазоне 0 .. 7.
OTG_FS_HCINTx 0x508 OTG_FS Host channel-x interrupt register (регистр прерываний канала x хоста). Здесь x это номер канала в диапазоне 0 .. 7.
OTG_FS_HCINTMSKx 0x50C OTG_FS Host channel-x interrupt mask register (регистр маски прерываний канала x хоста). Здесь x это номер канала в диапазоне 0 .. 7.
OTG_FS_HCTSIZx 0x510 OTG_FS Host channel-x transfer size register (регистр размера транзакции канала x хоста). Здесь x это номер канала в диапазоне 0 .. 7.

Примечание (1): основное правило - использовать OTG_FS_HNPTXFSIZ для режима хоста, и OTG_FS_DIEPTXF0 для режима устройства.

Карта памяти CSR режима устройства. Эти регистры должны программироваться всякий раз, когда ядро меняет режим на устройство USB.

Таблица 200. Регистры ядра управления и статуса (CSR) режима устройства.

Имя регистра Смещ. адреса Полное название регистра
OTG_FS_DCFG 0x800 OTG_FS device configuration register (регистр конфигурации устройства OTG FS).
OTG_FS_DCTL 0x804 OTG_FS device control register (регистр управления устройства OTG FS).
OTG_FS_DSTS 0x808 OTG_FS device status register (регистр статуса устройства OTG FS).
OTG_FS_DIEPMSK 0x810 OTG_FS device IN endpoint common interrupt mask register (регистр маски общих прерываний конечной точки IN).
OTG_FS_DOEPMSK 0x814 OTG_FS device OUT endpoint common interrupt mask register (регистр маски общих прерываний конечной точки OUT).
OTG_FS_DAINT 0x818 OTG_FS device all endpoints interrupt register (регистр прерываний всех конечных точек устройства).
OTG_FS_DAINTMSK 0x81C OTG_FS all endpoints interrupt mask register (регистр маски прерываний всех конечных точек устройства).
OTG_FS_DVBUSDIS 0x828 OTG_FS device VBUS discharge time register (регистр времени разряда разряда VBUS устройства).
OTG_FS_DVBUSPULSE 0x82C OTG_FS device VBUS pulsing time register (регистр времени импульса VBUS устройства).
OTG_FS_DIEPEMPMSK 0x834 OTG_FS device IN endpoint FIFO empty interrupt mask register (регистр маски прерываний FIFO конечной точки IN устройства).
OTG_FS_DIEPCTL0 0x900 OTG_FS device control IN endpoint 0 control register (регистр управления конечной точки IN 0 устройства).
OTG_FS_DIEPCTLx 0x920
0x940
0x960
OTG device endpoint x control register (регистр управления конечной точкой x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 3.
OTG_FS_DIEPINTx 0x908 OTG_FS device endpoint-x interrupt register (регистр прерываний конечной точки x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 3.
OTG_FS_DIEPTSIZ0 0x910 OTG_FS device IN endpoint 0 transfer size register (регистр размера транзакции конечной точки IN 0 устройства).
OTG_FS_DTXFSTSx 0x918 OTG_FS device IN endpoint transmit FIFO status register (регистр статуса передающего FIFO конечной точки IN). Здесь x это номер конечной точки в диапазоне 1 .. 3.
OTG_FS_DIEPTSIZx 0x930
0x950
0x970
OTG_FS device OUT endpoint-x transfer size register (регистр размера транзакции конечной точки OUTx). Здесь x это номер конечной точки в диапазоне 1 .. 3.
OTG_FS_DOEPCTL0 0xB00 OTG_FS device control OUT endpoint 0 control register (регистр управления конечной точкой OUT 0 устройства).
OTG_FS_DOEPCTLx 0xB20
0xB40
0xB60
OTG device endpoint x control register (регистр управления конечной точкой x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 3.
OTG_FS_DOEPINTx 0xB08 OTG_FS device endpoint-x interrupt register (регистр прерываний конечной точки x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 3.
OTG_FS_DOEPTSIZ0 0xB10 OTG_FS device OUT endpoint 0 transfer size register (регистр размера транзакции конечной точки OUT0 устройства).
OTG_FS_DOEPTSIZx 0xB30
0xB50
0xB70
OTG_FS device OUT endpoint-x transfer size register (регистр размера транзакции конечной точки OUTx устройства). Здесь x это номер конечной точки в диапазоне 1 .. 3.

Карта памяти регистров доступа к Data FIFO (DFIFO). Эти регистры доступны в обоих режимах, и хоста, и устройства USB. Они используются для записи или чтения пространства FIFO определенной конечной точки или канала, которые работают в указанном направлении. Если тип канала хоста IN, то FIFO канала можно только считывать. Подобным образом, если канал хоста типа OUT, то FIFO канала можно только записывать.

Таблица 201. Карта регистров доступа к Data FIFO (DFIFO).

Секция регистров доступа к FIFO Диапазон адресов Доступ
Конечная точка IN EP0 / Канал OUT0 хоста: DFIFO доступ на запись 0x1000 .. 0x1FFC w
Конечная точка OUT EP0 / Канал IN0 хоста: DFIFO доступ на чтение r
Конечная точка IN EP1 / Канал OUT1 хоста: DFIFO доступ на запись 0x2000 .. 0x2FFC w
Конечная точка OUT EP1 / Канал IN1 хоста: DFIFO доступ на чтение r
... ... ...
Конечная точка IN EPx(1) / Канал OUTx(1) хоста: DFIFO доступ на запись 0xX000 .. 0xXFFC w
Конечная точка OUT EPx(1) / Канал INx(1) хоста: DFIFO доступ на чтение r

Примечание (1): x = 3 в режиме устройства USB и x = 7 в режиме хоста USB.

Карта CSR питания и тактирования. Имеется только один регистр для управления питанием и тактированием. Он доступен в обоих режимах - и хоста, и устройства.

Таблица 202. Регистры управления питанием и тактированием.

Имя регистра Смещ. адреса
0xE00 .. 0xFFF
Полное название регистра
OTG_FS_PCGCCTL 0xE00 .. 0xE04 Power and clock gating control register (регистр управления питанием и управлением тактами)
... 0xE05 .. 0xFFF Зарезервировано

В описании функций регистров используются следующие сокращения:

read/write (rw) Программа может читать и записывать эти биты.

read-only (r) Программа может только читать эти биты.

write-only (w) Программа может только записывать в этот бит. Чтение бита вернет значение сброса.

read/clear (rc_w1) Программа может прочитать бит, а также сбросить его путем записью 1. Запись 0 не дает никакого эффекта.

read/clear (rc_w0) Программа может прочитать бит, а также сбросить его путем записью 0. Запись 1 не дает никакого эффекта.

read/clear by read (rc_r) Программа может прочитать этот бит. Чтение этого бита автоматически сбросит его в 0. Запись 0 в бит не дает никакого эффекта.

read/set (rs) Программа может прочитать, а также установить этот бит. Запись 0 в бит не дает никакого эффекта.

read-only write trigger (rt_w) Программа может прочитать этот бит. Запись 0 или 1 вызовет появление события (триггер), но не окажет никакого влияния на значение бита.

toggle (t) Программа может только переключить этот бит записью 1. Запись 0 не дает никакого эффекта.

Reserved (Res.) Зарезервированный бит, его значение должно сохраняться на значении сброса.

[Глобальные регистры]

Эти регистры доступны в обоих режимах - хоста и устройства, и не их не нужно перепрограммировать при переключении между этими режимами.

Значения бит в описаниях регистров выражены двоичными значениями, если не указано нечто другое.

Смещение адреса: 0x000
Значение сброса: 0x00010000

Регистр OTG_FS_GOTGCTL управляет поведением функций ядра OTG и отражает его состояние.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано BSVLD
r
ASVLD
r
DBCT
r
CIDSTS
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DHNPEN
rw
HSHNPEN
rw
HNPRQ
rw
HNGSCS
r
зарезервировано SRQ
rw
SRQSCS
r

Биты 31:20 зарезервированы и должны сохраняться в состоянии сброса (все нули).

BSVLD (бит 19): B-Session VaLiD. Показывает статус трансивера в режиме устройства USB.

0: B-сессия неправильная.
1: B-сессия корректная.

В режиме OTG можно использовать этот бит, чтобы определить, подключено устройство, или нет.

Примечание: доступно только в режиме устройства USB.

ASVLD (бит 18): A-Session VaLiD. Показывает статус трансивера в режиме хоста USB.

0: A-сессия неправильная.
1: A-сессия корректная.

Примечание: доступно только в режиме хоста USB.

DBCT (бит 17): длинное/короткое время дебоунсинга. Показывает время дебоунсинга обнаруженного подключения.

0: большое debounce time, используется для физических подключений (100 мс + 2.5 мкс).
1: малое debounce time, используется для программных подключений (2.5 мкс).

Примечание: доступно только в режиме хоста.

CIDSTS (бит 16): Connector ID STatuS. Показывает состояние ID коннектора при событии подключения.

0: контроллер OTG_FS в режиме A-device (хост USB).
1: контроллер OTG_FS в режиме B-device (устройство USB).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 15:12 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DHNPEN (бит 11): Device HNP Enabled. Приложение устанавливает этот бит, когда оно успешно получило команду SetFeature.SetHNPEnable от подключенного хоста USB.

0: HNP в приложении не разрешен.
1: HNP в приложении разрешен.

Примечание: доступно только в режиме устройства USB.

HSHNPEN (бит 10): Host Set HNP Enable. Приложение устанавливает этот бит, когда оно успешно разрешило HNP (используя команду SetFeature.SetHNPEnable) на подключенном устройстве.

0: установка хоста HNP не разрешена.
1: установка хоста HNP разрешена.

Примечание: доступно только в режиме хоста USB.

HNPRQ (бит 9): HNP ReQuest. Приложение устанавливает этот бит, чтобы инициировать запрос HNP для подключенного хоста USB. Приложение может очистить этот бит записью в него 0, когда установлен бит успешной смены состояния согласования хоста (бит HNSSCHG в регистре OTG_FS_GOTGINT). Ядро очищает этот бит, когда очищен бит HNSSCHG.

0: нет запроса HNP.
1: запрос HNP.

Примечание: доступно только в режиме устройства USB.

HNGSCS (бит 8): Host NeGotiation SuCceSs. Ядро устанавливает этот бит, когда согласование хоста успешное. Ядро очищает этот бит, когда установлен бит запроса HNP (HNPRQ) в этом регистре.

0: согласование хоста не прошло.
1: согласование хоста успешное.

Примечание: доступно только в режиме устройства USB.

Биты 7:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SRQ (бит 1): Session ReQuest. Приложение устанавливает этот бит для инициирования запроса сессии на USB. Приложение очищает этот бит записью 0, когда установлен бит успешной смены состояния согласования хоста (бит HNSSCHG в регистре OTG_FS_GOTGINT). Ядро очищает этот бит, когда очищаен бит HNSSCHG.

Если Вы используете интерфейс последовательного трансиваера USB 1.1 full-speed для инициирования запроса сессии, то приложение должно ждать момента, когда VBUS разрядится до 0.2V после того, как в этом регистре очистится бит B-Session Valid (бит BSVLD в регистре OTG_FS_GOTGCTL).

0: нет запроса сессии.
1: запрос сессии.

Примечание: доступно только в режиме устройства USB.

SRQSCS (бит 0): Session ReQuest SuCceSs. Ядро установит этот бит, когда был успешный запрос инициации сессии.

0: неудача запроса сессии.
1: успешный запрос сессии.

Примечание: доступно только в режиме устройства USB.

Смещение адреса: 0x004
Значение сброса: 0x00000000

Приложение считывает этот регистр, когда происходит прерывание OTG и очищает биты в этом регистре, чтобы очистить прерывание OTG.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано DBCDNE
rc_w1
ADTOCHG
rc_w1
HNGDET
rc_w1
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано HNSSCHG
rc_w1
SRSSCHG
rc_w1
зарезервировано SEDET
rc_w1
зарезервировано

Биты 31:20 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DBCDNE (бит 19): DeBounCe DoNE. Ядро установит этот бит, когда завершен дребезг после подключения устройства. Приложение может запустить сброс по шине (USB reset) после того, как увидит это прерывание. Этот бит достоверен только когда установлен бит HNP Capable или SRP Capable в регистре OTG_FS_GUSBCFG (соответственно бит HNPCAP или бит SRPCAP в регистре OTG_FS_GUSBCFG).

Примечание: доступно только в режиме хоста USB.

ADTOCHG (бит 18): A-Device TimeOut CHanGe. Ядро установит этот бит, чтобы показать, что на A-устройстве был таймаут, когда оно ждало подключения B-устройства.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

HNGDET (бит 17): Host NeGotiation DETected. Ядро установит этот бит, когда определило запрос согласования хоста, переданный по USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 16:10 зарезервированы и должны сохраняться в состоянии сброса (все нули).

HNSSCHG (бит 9): Host Negotiation Success Status CHanGe. Ядро установит этот бит при успехе или неудаче запроса согласования хоста USB. Приложение должно прочитать бит успеха согласования хоста (HNGSCS) в регистре OTG_FS_GOTGCTL чтобы проверить успех или неудачу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRSSCHG (бит 8): Session Request Success Status CHanGe. Ядро установит этот бит при успехе или неудаче запроса сессии. Приложение должно прочитать бит запроса сессии (SRQSCS) в регистре OTG_FS_GOTGCTL чтобы определить успех или неудачу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 7:3 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SEDET (бит 2): Session End DETected. Ядро установит этот бит чтобы показать, что уровень напряжения на VBUS больше недопустим для сессии B-периферии, когда VBUS < 0.8V.

Биты 1:0 зарезервированы и должны сохраняться в состоянии сброса (все нули).

Смещение адреса: 0x008
Значение сброса: 0x00000000

Этот регистр может использоваться для конфигурирования ядра после включения питания или смены режима. В регистре содержатся главным образом системные конфигурационные параметры AHB. Не меняйте этот регистр после начального программирования. Приложение должно программировать этот регистр перед началом любых транзакций либо на AHB, либо на USB.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано PTXFELVL
rw
TXFELVL
rw
зарезервировано GINTMSK
rw

Биты 31:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PTXFELVL (бит 8): Periodic TxFIFO Empty LeVeL. Показывает, когда переключаться биту прерывания опустошения периодического TxFIFO (бит PTXFE) в регистре OTG_FS_GINTSTS.

0: прерывание бита PTXFE (находится в регистре OTG_FS_GINTSTS) показывает, что периодический TxFIFO наполовину опустошен.
1: прерывание бита PTXFE (находится в регистре OTG_FS_GINTSTS) показывает, что периодический TxFIFO полностью пуст.

Примечание: доступно только в режиме хоста USB.

TXFELVL (бит 7): TxFIFO Empty LeVeL.

В режиме устройства: бит показывает, когда срабатывает прерывание опустошения стека передачи конечной точки IN (IN endpoint Transmit FIFO empty, бит TXFE в регистре OTG_FS_DIEPINTx).

0: прерывание бита TXFE (находится в регистре OTG_FS_DIEPINTx) показывает, что IN Endpoint TxFIFO опустошен наполовину.
1: прерывание бита TXFE (находится в регистре OTG_FS_DIEPINTx) показывает, что IN Endpoint TxFIFO полностью пуст.

В режиме хоста: бит показывает, когда сработает прерывание опустошения непериодического стека передачи (nonperiodic TxFIFO empty, бит NPTXFE в регистре OTG_FS_GINTSTS).

0: прерывание бита NPTXFE (находится в регистре OTG_FS_GINTSTS) показывает, что непериодический TxFIFO наполовину опустошен.
1: прерывание бита NPTXFE (находится в регистре OTG_FS_GINTSTS) показывает, что непериодический TxFIFO полностью пуст.

Биты 6:1 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GINTMSK (бит 0): Global INTerrupt MaSK. Приложение использует этот бит, чтобы замаскировать или отменить маскирование линии прерывания. Независимо от состояния этого бита регистры статуса прерывания все равно будут изменяться ядром.

0: маскирование прерывания для приложения. Прерывание при событиях USB генерироваться не будет, но приложение все равно может определить состояние событий USB чтением бит регистров статуса прерывания.
1: отмена маскирования прерываний для приложения.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Смещение адреса: 0x00C
Значение сброса: 0x00001440

Этот регистр может использоваться для конфигурирования ядра после включения питания или при смене режима (хоста или устройства USB). Регистр содержит конфигурационные параметры, относящиеся к USB и USB-PHY. Приложение должно программировать этот регистр перед запуском любых транзакций либо на AHB, либо на USB. Не меняйте этот регистр после начального программирования.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
CTXPKT
rw
FDMOD
rw
FHMOD
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано TRDT
rw
HNPCAP
rw
SRPCAP
rw
зарез. PHYSEL
r
зарезервировано TOCAL
rw

CTXPKT (бит 31): Corrupt Tx PacKeT. Этот бит предназначен только для отладки. Никогда не устанавливайте его в 1.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

FDMOD (бит 30): Force Device MODe. Запись 1 в этот бит переведет ядро в режим устройства USB независимо от уровня на выводе входа OTG_FS_ID.

0: нормальный режим.
1: принудительный режим устройства USB.

После установки этого бита приложение должно подождать как минимум 25 мс перед тем, как изменение вступит в силу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

FHMOD (бит 29): Force host MODe. Запись 1 в этот бит переведет ядро в режим хоста USB независимо от уровня на выводе входа OTG_FS_ID.

0: нормальный режим.
1: принудительный режим хоста USB.

После установки этого бита приложение должно подождать как минимум 25 мс перед тем, как изменение вступит в силу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 28:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TRDT (биты 13:10): USB TuRnaround Time. Эти биты позволяют установить время выполнения работы в тактах PHY. Они должны быть установлены по таблице 203, в зависимости от частоты AHB в приложении. Чем больше значения TRDT, тем больше разрешается растянуть время ответа USB на токены IN, чтобы компенсировать латентность доступа на чтение AHB при обращении к Data FIFO.

Примечание: доступно только в режиме устройства USB.

Таблица 203. Значения TRDT.

Диапазон частот AHB Минимальное значение TRDT
min MAX
14.2 15 0xF
15 16 0xE
16 17.2 0xD
17.2 18.5 0xC
18.5 20 0xB
20 21.8 0xA
21.8 24 0x9
24 27.5 0x8
27.5 32 0x7
32 - 0x6

HNPCAP (бит 9): HNP-CAPable. Приложение использует этот бит для управления возможностями HNP контроллера OTG_FS.

0: функционал HNP не разрешен.
1: функционал HNP разрешен.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRPCAP (бит 8): SRP-CAPable. Приложение использует этот бит для управления возможностями HNP контроллера OTG_FS. Если ядро работает с B-устройством, несовместимым с SRP, то оно не может запросить подключенное A-устройство (хост USB) активировать VBUS и начать сессию.

0: функционал SRP не разрешен.
1: функционал SRP разрешен.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 7 зарезервирован, и должен сохраняться в состоянии сброса (0).

PHYSEL (бит 6): Full speed serial transceiver SELect, выбор последовательного полноскоростного трансивера. Этот бит всегда в состоянии лог. 1, и доступен только для чтения.

Биты 5:3 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TOCAL (биты 2:0): FS TimeOut CALibration. Количество тактов PHY, которое приложение программирует в этом поле, добавляется к длительности таймаута интервала между пакетами для любых дополнительных задержек, вводимых PHY при генерации состояния линии. Эта задержка может меняться для разных PHY.

Стандартное значение таймаута USB для операций full-speed составляет от 16 до 18 интервалов бит включительно. Приложение должно запрограммировать это поле на основе скорости энумерации. Количество интервалов бит, добавленных на такт PHY, составляет 0.25 интервала бита.

Смещение адреса: 0x010
Значение сброса: 0x80000000

Приложение использует этот регистр для сброса различных аппаратных функций внутри ядра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
AHBIDL
r
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано TXFNUM
rw
TXFFLSH
rs
RXFFLSH
rs
зарез. FCRST
rs
HSRST
rs
CSRST
rs

AHBIDL (бит 31): AHB master IDLe. Показывает, что машина состояний мастера AHB находится в состоянии ожидания.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 30:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TXFNUM (биты 10:6): TxFIFO NUMber. Это номер FIFO, содержимое которого должно быть сброшено (flush) с использованием бита TxFIFO Flush. Это поле не должно изменяться, пока ядро не очистит бит TxFIFO Flush.

00000:
– сброс не периодического TxFIFO в режиме хоста.
– сброс TxFIFO 0 в режиме устройства.

00001:
– сброс периодического TxFIFO в режиме хоста.
– сброс TxFIFO 1 в режиме устройства.

00010: сброс TxFIFO 2 в режиме устройства.

...

00101: сброс TxFIFO 15 в режиме устройства.

10000: сброс всех передающих FIFO в режиме устройства или в режиме хоста.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

TXFFLSH (бит 5): TxFIFO FLuSH. Этот бит селективно сбрасывает один или все передающие FIFO, но не может это делать, если ядро находится посередине транзакции.

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

Read - NAK Effective Interrupt гарантирует, что ядро не читает из FIFO.
Write - бит AHBIDL в регистре OTG_FS_GRSTCTL гарантирует, что ядро ничего не пишет в FIFO.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

RXFFLSH (бит 4): RxFIFO FluSH. Приложение с помощью этого бита может сбросить (flush) весь RxFIFO, но должно сначала убедиться, что ядро не находится посередине транзакции. Приложение должно записать этот бит только после проверки, что ядро ни читает из RxFIFO, ни пишет в RxFIFO. Приложение должно подождать очистки этого бита перед выполнением любых других операций. Для очистки этот бит требует 8 тактов (самая медленная частота тактов PHY или AHB).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 3 зарезервирован, и должен сохраняться в состоянии сброса (0).

FCRST (бит 2): Host Frame Counter ReSeT. Приложение записывает этот бит, чтобы сбросить счетчик количества фреймов, находящийся внутри ядра. Когда счетчик фреймов сброшен, последующие SOF, отправленные ядром, будут нумероваться от 0.

Примечание: доступно только в режиме хоста USB.

HSRST (бит 1): HCLK Soft ReSeT. Приложение использует этот бит, чтобы сбросит логику управления в домене тактов AHB. Сбросятся только конвейеры доменов тактов AHB (AHB Clock Domain pipelines). Стеки FIFO этим битом не сбрасываются.

Все машины состояний в домене тактов AHB сбрасываются в состояние ожидания (Idle state) после обрыва транзакций AHB по следующему протоколу.

Очищаются биты управления CSR, используемые машинами состояний домена тактов AHB.

Чтобы очистить это прерывание, очищаются биты маски состояния, которые управляют состоянием прерывания и генерируются машиной состояния домена синхронизации AHB.

Из-за того, что биты статуса прерывания не очищаются, приложение может получить статус любых событий ядра, которые произошли посте установки этого бита.

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

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

CSRST (бит 0): Core Soft ReSeT. Сбрасывает домены HCLK и PCLK следующим образом. Очистятся прерывания и все биты регистра CSR, кроме следующих бит:

RSTPDMODL в регистре OTG_FS_PCGCCTL
GAYEHCLK в регистре OTG_FS_PCGCCTL
PWRCLMP в регистре OTG_FS_PCGCCTL
STPPCLK в регистре OTG_FS_PCGCCTL
FSLSPCS в регистре OTG_FS_HCFG
DSPD в регистре OTG_FS_DCFG

Все машины состояния модуля (кроме блока AHB slave) сбрасываются в состояние ожидания (Idle state), и сбрасываются все передающие FIFO и приемные FIFO.

Любые транзакции на AHB Master обрываются, как только это становится возможным, после завершения последней фазы данных транзакции AHB. Любые транзакции USB обрываются немедленно. Приложение может записать этот бит в любой момент времени, когда необходимо сбросить ядро. Этот бит обладает функцией самоочистки, ядро очистит его после того, как сбросится вся необходимая логика ядра, что может занимать несколько тактов, в зависимости от текущего состояния ядра. Как только этот бит очистился, программа должна подождать минимум 3 такта PHY перед тем, как осуществлять доступ к домену PHY (задержка синхронизации). Программа должна также проверить, что бит 31 в этом регистре (AHB Master is Idle) установился в лог. 1 перед запуском любой операции.

Обычно программный сброс используется во время разработки программного обеспечения, и также когда Вы динамически меняете биты выбора PHY в вышеперечисленных регистрах конфигурации USB. Когда Вы меняете PHY, выбирается соответствующая тактовая частота для PHY, и она используется в домене PHY. Как только выбрана новая частота тактов, домен PHY для правильного функционирования должен быть сброшен.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Смещение адреса: 0x014
Значение сброса: 0x04000020

Это регистр прерываний приложения для событий системного уровня текущего режима (режим устройства или режим хоста USB).

Некоторые биты в этом регистры достоверны только в режиме хоста, в то время как другие доступны только в режиме устройства. Чтобы очистить биты статуса прерывания типа rc_w1, приложение должно записать 1 в этот бит.

Статус прерываний FIFO только для чтения; как только программа читает FIFO или записывает его при обслуживании этих прерываний, события прерывания FIFO очищаются автоматически.

Приложение должно очистить регистр OTG_FS_GINTSTS при инициализации перед демаскированием бита прерывания, чтобы избежать генерации любых прерываний до инициализации.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
WKUINT
rc_w1
SRQINT
rc_w1
DISCINT
rc_w1
CIDSCHG
rc_w1
зарез. PTXFE
r
HCINT
r
HPRTINT
r
зарезервировано
IPXFR/
INCOMPISOOUT

rc_w1
IISOIXFR
rc_w1
OEPINT
r
IEPINT
r
зарезерв.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
EOPF
rc_w1
ISOODRP
rc_w1
ENUMDNE
rc_w1
USBRST
rc_w1
USBSUSP
rc_w1
ESUSP
rc_w1
зарезерв. GONAKEFF
r
GINAKEFF
r
NPTXFE
r
RXFLVL
r
SOF
rc_w1
OTGINT
r
MMIS
rc_w1
CMOD
r

WKUPINT (бит 31): Resume/remote WaKeUP detected INTerrupt. В режиме устройства это прерывание выставляется, когда на USB было определено возобновление (resume). В режиме хоста это прерывание выставляется, когда на USB определен сигнал пробуждения, полученное от подключенного устройства USB (функция remote wakeup).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRQINT (бит 30): Session ReQuest/new session detected INTerrupt. В режиме хоста это прерывание срабатывает, когда был определен запрос сессии от устройства USB. В режиме устройства это прерывание выставляется, когда уровень VBUS в допустимом диапазоне для B-устройства.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

DISCINT (бит 29): DISConnect detected INTerrupt. Выставляется, когда определено отключение устройства.

Примечание: доступно только в режиме хоста USB.

CIDSCHG (бит 28): Connector ID Status CHanGe. Ядро установит этот бит, когда поменялось состояние сигнала идентификации коннектора (connector ID).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 27 зарезервирован, и должен сохраняться в состоянии сброса (0).

PTXFE (бит 26): Periodic TxFIFO Empty. Выставляется, когда периодический передающий FIFO пуст либо наполовину, либо полностью, и есть как минимум одна свободная ячейка для записи в очередь периодических запросов. Половинчатое или полное опустошение определяется битом уровня опустошения периодического TxFIFO (бит PTXFELVL в регистре OTG_FS_GAHBCFG).

Примечание: доступно только в режиме хоста USB.

HCINT (бит 25): Host Channels INTerrupt. Ядро установит этот бит, чтобы показать наличие ожидающего обработки прерывания на одном из каналов ядра (режим хоста). Приложение должно прочитать регистр OTG_FS_HAINT, чтобы определить точный номер канала, на котором произошло прерывание, и затем прочитать соответствующий регистр OTG_FS_HCINTx, чтобы точно определить причину прерывания. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса в регистре OTG_FS_HCINTx.

Примечание: доступно только в режиме хоста USB.

HPRTINT (бит 24): Host PoRt INTerrupt. Ядро установит этот бит, чтобы показать изменение статуса портов контроллера OTG_FS в режиме хоста. Приложение должно прочитать регистр OTG_FS_HPRT, чтобы точно определить событие, которое привел к этому прерыванию. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса регистра OTG_FS_HPRT.

Примечание: доступно только в режиме хоста USB.

Биты 23:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

IPXFR (бит 21): Incomplete Periodic transFeR.

В режиме хоста: ядро установит этот бит, когда все еще ожидают обработки незавершенные периодические транзакции, запланированные в текущем фрейме.

В режиме устройства INCOMPISOOUT: INCOMPlete ISOchronous OUT transfer. В режиме устройства ядро установит это прерывание, чтобы показать как минимум одну изохронную конечную точку OUT, на которой не завершена транзакция в текущем фрейме. Это прерывание установится вместе с битом прерывания окончания периодического фрейма (бит EOPF, который находится в этом регистре).

IISOIXFR (бит 20): Incomplete ISOchronous IN transFeR. Ядро установит это прерывание, чтобы показать как минимум одну изохронную конечную точку IN, транзакция которой не завершена в текущем фрейме. Это прерывание установится вместе с битом прерывания окончания периодического фрейма (бит EOPF, который находится в этом регистре).

Примечание: доступно только в режиме устройства USB.

OEPINT (бит 19): OUT EndPoint INTerrupt. Ядро установит этот бит, чтобы показать ожидающее прерывания на одной из конечных точек OUT (режим устройства). Приложение должно прочитать регистр OTG_FS_DAINT, чтобы определить точный номер конечной точки OUT, на которой произошло прерывание, и затем прочитать соответствующий регистр OTG_FS_DOEPINTx для точного определения причины прерывания. Для очистки этого бита приложение должно очистить соответствующий бит статуса регистра OTG_FS_DOEPINTx.

Примечание: доступно только в режиме устройства USB.

IEPINT (бит 18): IN EndPoint INTerrupt. Ядро установит этот бит, чтобы показать ожидающее обработки прерывание на одной из конечных точек IN (в режиме устройства). Приложение должно прочитать регистр OTG_FS_DAINT, чтобы точно определить номер конечной точки, для которой произошло прерывание, и затем прочитать соответствующий регистр OTG_FS_DIEPINTx, чтобы точно определить причину прерывания. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса регистра OTG_FS_DIEPINTx.

Примечание: доступно только в режиме устройства USB.

Биты 17:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

EOPF (бит 15): End Of Periodic Frame interrupt. Показывает, что в текущем фрейме достигнут период, указанный в поле интервала периодического фрейма (бит PFIVL) регистра OTG_FS_DCFG.

Примечание: доступно только в режиме устройства USB.

ISOODRP (бит 14): ISOchronous OUT packet DRoPped interrupt. Ядро установит этот бит, когда не смогло записать изохронный пакет OUT packet в RxFIFO, потому что в RxFIFO не было достаточно места для размещения пакета максимального размера конечной точки isochronous OUT.

Примечание: доступно только в режиме устройства USB.

ENUMDNE (бит 13): ENUMeration DoNE. Ядро установит этот бит, чтобы показать завершение быстрой энумерации (speed enumeration). Приложение должно прочитать регистр OTG_FS_DSTS, чтобы получить скорость энумерации.

Примечание: доступно только в режиме устройства USB.

USBRST (бит 12): USB ReSeT. Ядро установит этот бит, когда определит сброс по шине USB.

Примечание: доступно только в режиме устройства USB.

USBSUSP (бит 11): USB SUSPend. Ядро установит этот бит, чтобы показать детектирование приостановки (suspend) на USB. Ядро входит в состояние Suspended, когда нет активности на линиях данных в течение 3 мс.

Примечание: доступно только в режиме устройства USB.

ESUSP (бит 10): Early SUSPend. Ядро установит этот бит, чтобы показать детектирование состояния ожидания (Idle state) на USB для 3 мс.

Примечание: доступно только в режиме устройства USB.

Биты 9:8 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GONAKEFF (бит 7): Global OUT NAK EFFective. Показывает, что бит Set global OUT NAK (бит SGONAK) в регистре OTG_FS_DCTL, установленный приложением, вступил в действие для ядра. Бит GONAKEFF может быть очищен запись бита Clear global OUT NAK (бит CGONAK) в регистре OTG_FS_DCTL.

Примечание: доступно только в режиме устройства USB.

GINAKEFF (бит 6): Global IN non-periodic NAK EFFective. Показывает, что бит Set global non-periodic IN NAK (бит SGINAK) в регистре OTG_FS_DCTL, установленный приложением, вступил в действие для ядра. Таким образом, ядро произвело выборку бита Global IN NAK, установленного приложением. Бит GINAKEFF можно очистить путем очистки бита (бит CGINAK) в регистре OTG_FS_DCTL.

Это прерывание необязательно означает, что через USB было отправлено отрицательное подтверждение (NAK handshake). Бит STALL имеет приоритет над битом NAK.

Примечание: доступно только в режиме устройства USB.

NPTXFE (бит 5): Non-Periodic TxFIFO Empty. Это прерывание выставляется, когда непериодический передающий FIFO опустошен наполовину или полностью, и есть место для как минимум одной записи в непериодическую очередь запросов передачи. Статус половинной или полной опустошенности определяется по биту non-periodic TxFIFO empty level (бит TXFELVL) в регистре OTG_FS_GAHBCFG.

Примечание: доступно только в режиме хоста USB.

RXFLVL (бит 4): RxFIFO non-empty. Показывает, что в RxFIFO есть как минимум один пакет, ожидающий чтения.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SOF (бит 3): Start Of Frame. В режиме хоста ядро установит этот бит, чтобы показать передачу через USB сигнала SOF (FS) или сигнала Keep-Alive (LS). Приложение должно записать 1 в этот бит, чтобы очистить прерывание. В режиме устройства ядро установит этот бит, чтобы показать прием через USB токена SOF. Приложение может прочитать регистр состояния устройства (Device Status register), чтобы получить текущий номер фрейма. Это прерывание видно только когда ядро работает в FS.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

OTGINT (бит 2): OTG INTerrupt. Ядро установит этот бит, чтобы показать событие протокола OTG. Приложение должно прочитать регистр OTG Interrupt Status (OTG_FS_GOTGINT), чтобы точно определить событие, вызвавшее это прерывание. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса в регистре OTG_FS_GOTGINT.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

MMIS (бит 1): Mode MISmatch interrupt. Ядро установит этот бит, когда приложение пытается получить доступ к регистру, к которому в этом режиме доступ невозможен. Например, ядро находится в режиме устройства USB, и при этом обращается к регистру режима хоста. Доступ к регистру завершается на AHB ответом OKAY, однако внутренне игнорируется ядром, и не оказывает влияние на работу ядра.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

CMOD (бит 0): Current MODe of operation. Показывает текущий режим работы ядра.

0: режим устройства USB.
1: режим хоста USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Смещение адреса: 0x018
Значение сброса: 0x00000000

Этот регистр работает вместе с регистром прерываний ядра (Core interrupt register, OTG_FS_GINTSTS). Когда бит прерывания замаскирован, то связанное с этим битом прерывание не генерируется. Однако все еще установится бит регистра прерываний ядра (OTG_FS_GINTSTS), соответствующий этому прерыванию.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
WUIM
rw
SRQIM
rw
DISCINT
rw
CIDSCHGM
rw
зарез. PTXFEM
rw
HCIM
rw
PRTIM
rw
зарезерв. IPXFRM/
IISOOXFRM

rw
IISOIXFRM
rw
OEPINT
rw
IEPINT
rw
зарезерв.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
EOPFM
rw
ISOODRPM
rw
ENUMDNEM
rw
USBRST
rw
USBSUSPM
rw
ESUSPM
rw
зарезерв. GONAKEFFM
rw
GINAKEFFM
rw
NPTXFEM
rw
RXFLVLM
rw
SOFM
rw
OTGINT
rw
MMISM
rw
зарез.

WUIM (бит 31): Resume/remote WakeUp detected Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания от события возобновления / удаленного пробуждения USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRQIM (бит 30): Session ReQuest/new session detected Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания от события запроса сессии / новой сессии USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

DISCINT (бит 29): DISConnect detected INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при обнаружении отключения от шины USB.

Примечание: доступно только в режиме устройства USB.

CIDSCHGM (бит 28): Connector ID Status CHanGe Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при изменении состояния сигнала идентификации устройства на коннекторе USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 27 зарезервирован, и должен сохраняться в состоянии сброса (0).

PTXFEM (бит 26): Periodic TxFIFO Empty Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания опустошения (наполовину или полностью) периодического передающего FIFO.

Примечание: доступно только в режиме хоста USB.

HCIM (бит 25): Host Channels Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания канала хоста.

Примечание: доступно только в режиме хоста USB.

PRTIM (бит 24): Host PoRT Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания порта хоста.

Примечание: доступно только в режиме хоста USB.

Биты 23:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

IPXFRM (бит 21): Incomplete Periodic transFer Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания незавершенной периодической транзакции.

Примечание: доступно только в режиме хоста USB.

IISOOXFRM (бит 21): Incomplete isochronous OUT transfer mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания незавершенной изохронной транзакции OUT.

Примечание: доступно только в режиме устройства USB.

IISOIXFRM (бит 20): Incomplete ISOchronous IN transFeR Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания незавершенной изохронной транзакции IN.

Примечание: доступно только в режиме устройства USB.

OEPINT (бит 19): OUT EndPoints INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания конечных точек OUT.

Примечание: доступно только в режиме устройства USB.

IEPINT (бит 18): IN EndPoints INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания конечных точек IN.

Примечание: доступно только в режиме устройства USB.

Биты 17:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

EOPFM (бит 15): End Of Periodic Frame interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания окончания периодического фрейма.

Примечание: доступно только в режиме устройства USB.

ISOODRPM (бит 14): ISOchronous OUT packet DRoPped interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания отброшенного изохронного пакета OUT.

Примечание: доступно только в режиме устройства USB.

ENUMDNEM (бит 13): ENUMeration DoNE Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания по окончанию энумерации.

Примечание: доступно только в режиме устройства USB.

USBRST (бит 12): USB ReSeT mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания сброса по шине USB.

Примечание: доступно только в режиме устройства USB.

USBSUSPM (бит 11): USB SUSPend Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при входе в состояние приостановки USB.

Примечание: доступно только в режиме устройства USB.

ESUSPM (бит 10): Early SUSPend Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при входе в состояние ранней приостановки USB.

Примечание: доступно только в режиме устройства USB.

Биты 9:8 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GONAKEFFM (бит 7): Global OUT NAK EFFective Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания, когда для ядра вступил в действие бит Set global OUT NAK (бит SGONAK) в регистре OTG_FS_DCTL, установленный приложением.

Примечание: доступно только в режиме устройства USB.

GINAKEFFM (бит 6): Global non-periodic IN NAK EFFective mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания, когда для ядра вступил в действие бит Set global non-periodic IN NAK (бит SGINAK) в регистре OTG_FS_DCTL, установленный приложением.

Примечание: доступно только в режиме устройства USB.

NPTXFEM (бит 5): Non-Periodic TxFIFO Empty Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания опустошения не периодического передающего FIFO.

Примечание: доступно только в режиме хоста USB.

RXFLVLM (бит 4): RxFIFO non-empty Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания наличия принятых данных в FIFO приема.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SOFM (бит 3): Start Of Frame Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания начала фрейма.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

OTGINT (бит 2): OTG INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания события OTG.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

MMISM (бит 1): Mode MISmatch interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания ошибочного доступа (несоответствия режима) к регистрам OTG_FS.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 0 зарезервирован и должен сохраняться в состоянии сброса (0).

Смещение адреса для Read: 0x01C
Смещение адреса для Pop: 0x020
Значение сброса: 0x00000000

Чтение регистра Receive status debug read возвращает содержимое вершины RxFIFO. Чтение регистра Receive status read and pop дополнительно извлекает данные из вершины RxFIFO.

Содержимое статуса приема должно интерпретироваться по-разному для режимов хоста и устройства. Ядро игнорирует receive status pop/read, когда RxFIFO пуст, и вернет при этом значение 0x00000000. Приложение должно делать выборку (pop) Receive Status FIFO только когда установлен бит RxFIFO non-empty (бит RXFLVL) в регистре прерываний ядра (OTG_FS_GINTSTS).

[Режим хоста USB]

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PKTSTS
r
DPID[1]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DPID[0]
r
BCNT
r
CHNUM
r

Биты 31:21 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTSTS (биты 20:17): PacKeT STatuS. Показывает статус принятого пакета.

0010: принят пакет данных IN.
0011: завершена транзакция IN (срабатывает прерывание).
0101: ошибка переключения данных (Data toggle error, срабатывает прерывание).
0111: канал остановлен (срабатывает прерывание).
Другие значения: зарезервировано.

DPID (биты 16:15): Data PID. Показывает Data PID принятого пакета.

00: DATA0
10: DATA1
01: DATA2
11: MDATA

BCNT (биты 14:4): Byte CouNT. Показывает количество байт данных принятого пакета IN.

CHNUM (биты 3:0): CHannel NUMber. Показывает номер канала, которому принадлежит текущий принятый пакет.

[Режим устройства USB]

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано FRMNUM
r
PKTSTS
r
DPID[1]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DPID[0]
r
BCNT
r
EPNUM
r

Биты 31:25 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FRMNUM (24:21): FRaMe NUMber. Это младшие значащие 4 бита номера фрейма USB, в котором был принят пакет. Это поле поддерживается только когда поддерживаются изохронные конечные точки OUT.

PKTSTS (биты 20:17): PacKeT STatuS. Показывает состояние принятого пакета.

0001: Global OUT NAK (срабатывает прерывание).
0010: принят пакет данных OUT.
0011: завершена транзакция OUT (срабатывает прерывание).
0100: завершена транзакция SETUP (срабатывает прерывание).
0110: принят пакет данных SETUP.
Другие значения: зарезервировано.

DPID (биты 16:15): Data PID. Показывает Data PID принятого пакета данных OUT.

00: DATA0
10: DATA1
01: DATA2
11: MDATA

BCNT (биты 14:4): Byte CouNT. Показывает количество байт данных принятого пакета.

EPNUM (биты 3:0): EndPoint NUMber (биты 3:0): CHannel NUMber. Показывает номер конечной точки, которой принадлежит текущий принятый пакет.

Смещение адреса: 0x024
Значение сброса: 0x00000200

Приложение может запрограммировать размер RAM, которое должно быть выделено для RxFIFO.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
RXFD
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

RXFD (биты 15:0): RxFIFO Depth. Это значение показывает глубину стека приема в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256. Значение после сброса в этом регистре указано как самая большая глубина данных RxFIFO.

Смещение адреса: 0x028
Значение сброса: 0x00000200

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
NPTXFD/TX0FD
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
NPTXFSA/TX0FSA
rw

[Режим хоста USB]

NPTXFD (биты 31:16): Non-Periodic TxFIFO Depth. Это значение показывает глубину стека передачи в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256.

NPTXFSA (биты 15:0): Non-Periodic Transmit RAM Start Address. Это поле содержит начальный адрес RAM для не периодического передающего FIFO.

[Режим устройства USB]

TX0FD (биты 31:16): Endpoint 0 TxFIFO Depth. Это значение показывает глубину стека передачи конечной точки 0 в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256.

TX0FSA (биты 15:0): Endpoint 0 transmit RAM Start Address. Это поле содержит начальный адрес RAM для передающего FIFO конечной точки 0.

Смещение адреса: 0x02C
Значение сброса: 0x00080200

Примечание: в режиме устройства USB этот регистр недопустим.

Это регистр только для чтения, содержащий информацию о свободном месте не периодического TxFIFO и очереди не периодических запросов на передачу.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. NPTXQTOP
r
NPTQXSAV
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
NPTXFSAV
r

Бит 31 зарезервирован, и должен сохраняться в состоянии сброса (0).

NPTXQTOP (биты 30:24): TOP of the Non-Periodic Transmit request queue. Элемент очереди не периодических запросов на передачу, который в настоящий момент обрабатывает MAC.

Биты 30:27: номер канала/конечной точки.

Биты 26:25:

00: токен IN/OUT.
01: пакет передачи нулевой длины (Zero-length transmit packet, для устройства IN, для хоста OUT).
11: команда остановки канала (Channel halt).

Бит 24: Terminate (последний элемент для выбранного канала / выбранной конечной точки).

NPTQXSAV (биты 23:16): Non-Periodic Transmit request Queue Space AVailable. Показывает количество свободного доступного места в очереди не периодических запросов передачи. Эта очередь в режиме хоста хранит запросы обоих видов - IN и OUT. В режиме устройства имеются только запросы IN.

00000000: очередь не периодических запросов передачи заполнена.
00000001: есть 1 свободная ячейка.
00000010: есть 2 свободных ячейки.
...
00001000: есть 8 свободных ячеек.
Другие значения: зарезервировано.

NPTXFSAV (биты 15:0): Non-Periodic TxFIFO Space AVailable. Показывает количество доступного пространства в не периодическом TxFIFO. Значения указываются в единицах 32-битных слов.

0x0000: не периодический TxFIFO заполнен.
0x0001: доступно свободное место для 1 слова.
0x0002: доступно свободное место для 2 слов.
...
0x0100: доступно свободное место для 256 слов.
Другие значения: зарезервировано.

Смещение адреса: 0x038
Значение сброса: 0x0000XXXX

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано NOVBUSSENS
rw
SOFOUTEN
rw
VBUSBSEN
rw
VBUSASEN
rw
зарез. PWRDWN
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано

Биты 31:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NOVBUSSENS (бит 21): опция запрета определения корректности уровня VBUS. Когда этот бит установлен, ядро считается всегда допустимым уровень VBUS (5V), т. е. этот уровень не анализируется. При этом освобождается для других функций выделенная ножка порта, предназначенная для анализа уровня VBUS. Соединение с VBUS может быть переназначено на другую ножку корпуса, и уровень VBUS может отслеживаться программно.

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

0: аппаратный анализ уровня VBUS.
1: анализ уровня VBUS недоступен для аппаратуры.

SOFOUTEN (бит 20): SOF OUTput ENable.

0: импульс SOF недоступен на выделенной ножке корпуса (OTG_FS_SOF).
1: импульс SOF доступен на выделенной ножке корпуса (OTG_FS_SOF).

VBUSBSEN (бит 19): разрешение детектирования уровня VBUS для B-устройства (устройство USB).

0: детектирование VBUS устройства B запрещено.
1: детектирование VBUS устройства B разрешено.

VBUSASEN (бит 18): разрешение детектирования уровня VBUS для A-устройства (хост USB).

0: детектирование VBUS устройства A запрещено.
1: детектирование VBUS устройства A разрешено.

Бит 17 зарезервирован, и должен сохраняться в состоянии сброса (0).

PWRDWN (бит 16): PoWeR DoWN. Используется для активации трансивера при передаче/приеме.

0: трансивер выключен.
1: трансивер активен.

Биты 15:0 зарезервированы и должны сохраняться в состоянии сброса.

Смещение адреса: 0x03C
Значение сброса: 0x00001200

Этот регистр содержит значение идентификатора продукта (Product ID).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
PRODUCT_ID[31:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PRODUCT_ID[15:0]
rw

PRODUCT_ID (биты 31:0): Поле Product ID. В нем содержится программируемый приложением идентификатор.

Смещение адреса: 0x100
Значение сброса: 0x02000400

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
PTXFSIZ
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PTXSA
r

PTXFD (биты 31:16): глубина периодического TxFIFO хоста. Это значение указывается в единицах 32-битных слов, минимальное значение 16.

PTXSA (биты 15:0): начальный адрес периодического TxFIFO хоста. Значение после сброса в этом регистре равна сумме самой большой глубины данных RxFIFO и самой большой глубины данных не периодического TxFIFO.

Здесь x (в диапазоне от 1 до 3) обозначает номер FIFO.

Смещение адреса: 0x104 + 0x04 * (x - 1)
Значение сброса: 0x02000200

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
INEPTXFD
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
INEPTXSA
r

INEPTXFD (биты 31:16): IN EndPoint TxFIFO Depth. Глубина FIFO передачи конечной точки IN. Значение указывается в единицах 32-битных слов. Минимальное значение 16. Значение после сброса в этом регистре указывается как самая большая глубина IN endpoint FIFO.

INEPTXSA (биты 15:0): IN EndPoint FIFOx Rransmit RAM Start Address. Это поле содержит начальный адрес для передающего FIFO конечной точки IN. Этот адрес должен быть выровнен на адрес 32-битного слова (т. е. байтовый адрес должен нацело делиться на 4).

[Регистры режима хоста USB]

Значения бит в описании регистров выражены двоичными значениями, если не указано нечто иное.

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

Смещение адреса: 0x400
Значение сброса: 0x00000000

Через этот регистр программа конфигурирует ядро после включения питания. Не изменяйте этот регистр после инициализации хоста.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано FSLSS
r
FSLSPCS
rw

Биты 31:3 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FSLSS (бит 2): поддерживать только FS и LS. Приложение использует этот бит, чтобы управлять скоростью энумерации ядра. Используя этот бит, приложение может сделать энумерацию ядра как хоста FS, даже если подключенное устройство поддерживает трафик HS. Не меняйте это поле после начального программирования.

1: поддержка только FS/LS (Full-Speed и Low-Speed), даже если подключенное устройство может поддерживать HS (High Speed, только чтение).

FSLSPCS (биты 1:0): выбор тактов FS/LS PHY.

Когда ядро работает в режиме хоста FS:

01: такты PHY работают на 48 МГц.

Другие значения: зарезервировано.

Когда ядро работает в режиме хоста LS:

00: зарезервировано.
01: для PHY выбрана тактовая частота 48 МГц.
10: для PHY выбрана тактовая частота 6 МГц.
11: зарезервировано.

Примечание: FSLSPCS должно быть установлено на событии подключения в соответствии со скоростью подключенного устройства (после изменения этого бита должен быть произведен программный сброс).

Смещение адреса: 0x404
Значение сброса: 0x0000EA60

В этом регистре хранится информация по интервалу фрейма для текущей скорости, с которой прошел энумерацию контроллер OTG_FS.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
FRIVL
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FRIVL (биты 15:0): FRame InterVaL. Значение, которое приложение программирует в это поле, задает интервал между двумя следующими друг за другом токенами SOF (FS) или Keep-Alive (LS). В этом поле содержится количество тактов PHY, которое составляет требуемый интервал фрейма. Приложение может записать значение в этот регистр только после того, как установлен бит разрешения порта в регистре управления и статуса порта хоста (бит PENA в регистре OTG_FS_HPRT). Если никакое значение не запрограммировано, ядро вычисляет значение на основе тактов PHY, указанных в поле FS/LS PHY Clock Select регистра конфигурации хоста (FSLSPCS в регистре OTG_FS_HCFG). Не меняйте значение в этом поле после начальной конфигурации.

Интервал фрейма = 1 мс x (FRIVL - 1)

Смещение адреса: 0x408
Значение сброса: 0x00003FFF

В этом регистре показывается текущий номер фрейма. Также в нем показано оставшееся время (в единицах количества тактов PHY) в текущем фрейме.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
FTREM
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
FRNUM
r

FTREM (биты 31:16): Frame Time REMaining. Показывает количество времени, оставшееся в текущем фрейме, в единицах тактов PHY. Это поле автоматически декрементируется с каждым тактом PHY. Когда оно достигает 0, то автоматически перезагружается значением из регистра интервала фрейма, и новый SOF передается через USB.

FRNUM (биты 15:0): FRame NUMber. Это поле инкрементируется, когда новый SOF передается через USB, и очищается в 0, когда достигает 0x3FFF.

Смещение адреса: 0x410
Значение сброса: 0x00080100

Это регистр только для чтения, где содержится информация свободного пространства для периодического TxFIFO и очереди периодических запросов.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
PTXQTOP
r
PTXQSAV
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PTXFSAVL
r

PTXQTOP (биты 31:24): TOP of the Periodic Transmit request Queue. Показывает элемент в очереди периодических запросов передачи, который в настоящий момент обрабатывает MAC. Этот регистр используется для отладки.

Бит 31: нечетный/четный фрейм.

0: отправляется четный фрейм.
1: отправляется нечетный фрейм.

Биты 30:27: номер канала/конечной точки.

Биты 26:25: тип.

00: IN/OUT.
01: пакет нулевой длины (Zero-length packet).
11: команда запрета канала.

Бит 24: Terminate (последнего элемента выбранного канала/конечной точки).

PTXQSAV (биты 23:16): Periodic Transmit request Queue Space AVailable. Показывает количество свободных ячеек, доступное для записи в очередь периодических запросов передачи. Эта очередь хранит оба вида направлений запросов - IN и OUT.

00000000: очередь периодических запросов передачи заполнена.
00000001: доступна 1 свободная ячейка в очереди.
00000010: доступны 2 свободных ячейки в очереди.
...
00001000: доступно 8 свободных ячеек в очереди.
Другие значения: зарезервировано.

PTXFSAVL (биты 15:0): Periodic Transmit data FIFO Space AVailable. Показывает количество свободных ячеек, доступное для записи в периодический TxFIFO. Значение представлено в единицах 32-битных слов.

0x0000: периодический TxFIFO заполнен.
0x0001: доступно 1 слово.
0x0002: доступно 2 слова.
...
n: доступно n слов (здесь n в диапазоне от 0 до PTXFD включительно).
Другие значения: зарезервировано.

Смещение адреса: 0x414
Значение сброса: 0x00000000

Когда на канале происходит значительное событие, в приложении происходит прерывание по биту прерывания в регистре прерываний ядра (бит HCINT в регистре OTG_FS_GINTSTS) с информации о прерывании в регистре OTG_FS_HAINT. Это показано на рис. 394. Здесь находится по одному биту прерывания на канал, максимум до 16 бит. Биты в этом регистре устанавливаются и очищаются, когда приложение устанавливает и очищает биты в соответствующем регистре прерываний канала x хоста.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
HAINT
r

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

HAINT (биты 15:0): прерывания каналов. Один бит на канал: бит 0 для канала 0, бит 15 для канала 15.

Смещение адреса: 0x418
Значение сброса: 0x00000000

Регистр маски прерываний всех каналов хоста (OTG_FS_HAINTMSK) работает вместе с регистром прерываний всех каналов (OTG_FS_HAINT), когда на канале происходит событие. Имеется по одному биту маски на канал, максимум 16 бит.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
HAINTM
r

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

HAINTM (биты 15:0): маска прерываний каналов.

0: прерывание замаскировано (запрещено).
1: прерывание не замаскировано (разрешено).

Один бит на канал: бит 0 для канала 0, бит 15 для канала 15.

Смещение адреса: 0x440
Значение сброса: 0x00000000

Этот регистр доступен только в режиме хоста. В настоящий момент хост OTG поддерживает только один порт.

Один регистр хранит информацию, относящуюся к хосту USB, такую как USB reset, разрешение, приостановка (suspend), возобновление (resume), статус подключения и режим тестирования для каждого порта (это показано на рис. 394). Биты rc_w1 в этом регистре могут привести к прерыванию в приложении через бит прерываний порта хоста (бит HPRTINT в регистре OTG_FS_GINTSTS). На прерывании порта приложение должно прочитать этот регистр и очистить бит, который привел к прерыванию. Для бит rc_w1 приложение должно записать 1 в бит, чтобы очистить прерывание.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PSPD
r
PTCTL[3]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PTCTL[2:1]
rw
PPWR
rw
PLSTS
r
зарез. PRST
rw
PSUSP
rs
PRES
rw
POCCHNG
rc_w1
POCA
r
PENCHNG
rc_w1
PENA
rc_w0
PCDET
rc_w1
PCSTS
r

Биты 31:19 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PSPD (биты 18:17): Port SPeeD. Показывает скорость устройства, подключенного к этому порту.

01: Full speed (FS, полная скорость).
10: Low speed (LS, низкая скорость).
11: зарезервировано.

PTCTL (биты 16:13): Port Test ConTroL. Приложение записывает ненулевое значение в это поле, чтобы перевести порт в режим тестирования, и на порту появляется соответствующий шаблон сигнализации.

0000: режим тестирования запрещен.
0001: режим Test_J.
0010: режим Test_K.
0011: режим Test_SE0_NAK.
0100: режим Test_Packet.
0101: Test_Force_Enable.
Другие значения: зарезервировано.

PPWR (бит 12): Port PoWeR. Приложение использует этот бит, чтобы управлять питанием этого порта, и ядро очищает этот бит при событии перегрузки по току (overcurrent condition).

0: Power off (порт выключен).
1: Power on (порт включен).

PLSTS (биты 11:10): Port Line STatuS. Показывает текущие логические уровни на линиях данных USB D+ (DP) и D- (DM).

Бит 10: логический уровень OTG_FS_DP.
Бит 11: логический уровень OTG_FS_DM.

Бит 9 зарезервирован, и должен сохраняться в состоянии сброса (0).

PRST (бит 8): Port ReSeT. Когда приложение установит этот бит, на порту запустится последовательность сброса. Приложение должно отследить период времени сброса, и очистить этот бит после завершения последовательности сброса.

0: порт не в состоянии сброса.
1: порт в состоянии сброса.

Приложение должно оставить этот бит установленным на время как минимум 10 мс, чтобы запустить сброс порта. Приложение может оставить этот бит установленным на еще 10 мс дополнительно перед очисткой, несмотря на отсутствие максимального предела, установленного стандартом USB.

PSUSP (бит 7): Port SUSPend. Приложение установит этот бит, чтобы перевести порт в режим приостановки (Suspend mode). Ядро только останавливает отправку SOF, когда этот бит установлен. Для остановки тактов PHY, приложение должно установить бит остановки тактов порта, который устанавливает входной вывод приостановки PHY.

Значение чтения этого бита отражает текущее состояние приостановки порта. Этот бит очищается ядром после детектирования сигнала удаленного пробуждения (remote wakeup), или когда приложение установит бит сброса порта или бит возобновления порта в этом регистре, или бит Resume/remote wakeup detected interrupt bit, или бит прерывания Disconnect в регистре прерываний ядра (бит WKUINT или бит DISCINT в OTG_FS_GINTSTS, соответственно).

0: порт не в режиме приостановки.
1: порт в режиме приостановки (Suspend mode).

PRES (бит 6): Port RESume. Приложение установит этот бит, чтобы выдать сигнал возобновления в порт. Ядро продолжает выдавать сигнализацию resume до тех пор, пока приложение не очистит этот бит.

Если ядро детектировало последовательность удаленного пробуждения (USB remote wakeup), что показвается битом прерывания Port resume/remote wakeup в регистре прерываний ядра (бит WKUINT в регистре OTG_FS_GINTSTS), ядро запустит сигнализацию возобновления без всякого вмешательства приложения и очистит его, когда обнаружит событие разъединения. Прочитанное значение в этом бите показывает, выдается ли в настоящий момент сигнал возобновления.

0: нет выдачи resume.
1: выдается сигнал resume.

POCCHNG (бит 5): Port OverCurrent CHaNGe. Ядро установит этот бит, когда меняется состояния активности перегрузки порта (бит 4) в этом регистре.

POCA (бит 4): Port OverCurrent Active. Показывает перегрузку на порту USB.

0: нет перегрузки по току.
1: перегрузка по току (Overcurrent).

PENCHNG (бит 3): Port ENable/disable CHaNGe. Ядро установит этот бит, когда поменяется статус разрешения порта (бит 2 в этом регистре).

PENA (бит 2): Port ENAble. Порт разрешается только ядром после последовательности сброса, и запрещается событием перегрузки по току, событием отключения или приложением, очистившим этот бит. Приложение не может установить этот бит путем записью в регистр. Оно может только очистить этот бит, чтобы запретить порт. Этот бит не вызывает никакое прерывание для приложения.

0: порт запрещен.
1: порт разрешен.

PCDET (бит 1): Port Connect DETected. Ядро установит этот бит, когда было определено подключение устройства для срабатывания прерывания с использованием бита прерывания порта хоста в регистре прерываний ядра (бит HPRTINT в регистре OTG_FS_GINTSTS). Приложение должно записать 1 в этот бит для очистки прерывания.

PCSTS (бит 0): Port Connect STatuS.

0: к порту не подключено ни одного устройства.
1: к порту подключено устройство.

Здесь x это номер канала в диапазоне от 0 до 7 включительно.

Смещение адреса: 0x500 + 0x20 * x
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
CHENA
rs
CHDIS
rs
ODDFRM
rw
DAD
rw
MCNT
rw
EPTYP
rw
LSDEV
rw
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
EPDIR
rw
EPNUM
rw
MPSIZ
rw

CHENA (бит 31): CHannel ENAble. Это поле устанавливается приложением и очищается хостом OTG.

0: канал запрещен.
1: канал разрешен.

CHDIS (бит 30): CHannel DISable. Приложение установит этот бит для остановки передачи/приема данных на канале, даже до завершения передачи по этому каналу. Приложение должно ждать прерывания запрета канала перед тем, как может считать этот канал запрещенным.

ODDFRM (бит 29): ODD FRaMe. Это поле устанавливается (сбрасывается) приложением, чтобы показать, что хост OTG должен выполнить транзакцию на нечетном фрейме. Это поле применимо применимо только для периодических (isochronous и interrupt) транзакций.

0: четный фрейм.
1: нечетный фрейм.

DAD (биты 28:22): Device ADdress. Это поле выбирает определенное устройство, которое представляет собой источник или место назначения данных.

MCNT (биты 21:20): MultiCouNT. Эта поле показывает для хоста количество транзакций, которые должны быть выполнены на фрейм для этой периодической конечной точки. Для не периодических передач это поле не используется.

00: зарезервировано. Это значение приведет к непредсказуемым результатам.
01: 1 транзакция.
10: 2 транзакции на фрейм для выдачи на этой конечной точке.
11: 3 транзакции на фрейм для выдачи на этой конечной точке.

Примечание: это поле должно быть установлено в значение как минимум 01.

EPTYP (биты 19:18): EndPoint TYPe. Показывает выбранный тип транзакции.

00: Control
01: Isochronous
10: Bulk
11: Interrupt

LSDEV (бит 17): Low-Speed DEVice. Этот бит устанавливается приложением, чтобы показать работу этого канала в режиме низкоскоростного устройства (low-speed device).

Бит 16 зарезервирован, и должен сохраняться в состоянии сброса (0).

EPDIR (бит 15): EndPoint DIRection. Показывает направление транзакции - IN или OUT.

0: OUT
1: IN

EPNUM (биты 14:11): EndPoint NUMber. Показывает номер конечный точки на устройстве, которое работает либо как источник, либо как место назначения данных.

MPSIZ (биты 10:0): Maximum Packet SIZe. Показывает максимальный размер пакета связанной конечной точки.

Здесь x это номер канала в диапазоне от 0 до 7 включительно.

Смещение адреса: 0x508 + 0x20 * x
Значение сброса: 0x00000000

Этот регистр показывает статус канала по отношению к USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерывания канала хоста в регистре прерываний ядра (бит HCINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_FS_HAINT), чтобы получить точный номер канала для регистра прерываний канала x хоста. Чтобы очистить соответствующие биты в регистрах OTG_FS_HAINT и OTG_FS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_FS_HCINTx.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DTERR
rc_w1
FRMOR
rc_w1
BBERR
rc_w1
TXERR
rc_w1
зарез. ACK
rc_w1
NAK
rc_w1
STALL
rc_w1
зарез. CHH
rc_w1
XFRC
rc_w1

Биты 31:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DTERR (бит 10): Data Toggle ERRor, ошибка переключения данных.

FRMOR (бит 9): FRaMe OverRun, превышение кадра.

BBERR (бит 8): BaBble ERRor, ошибка помехообразного сигнала.

TXERR (бит 7): Transaction ERRor. Показывает одно из следующих ошибок, произошедших на USB:

CRC check failure (ошибка контрольной суммы)
Timeout (таймаут)
Bit stuff error (ошибка бит-стаффинга)
False EOP (неправильный конец пакета)

Бит 6 зарезервирован и должен сохраняться в состоянии сброса (0).

ACK (бит 5): прерывание подтверждения ACK приема/передачи.

NAK (бит 4): прерывание принятого подтверждения NAK.

STALL (бит 3): прерывание принятого ответа STALL.

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

CHH (бит 1): CHannel Halted. Показывает, что транзакция завершилась ненормально либо из-за ошибки транзакции USB, либо в ответ на запрос запрета от приложения.

XFRC (бит 0): транзакция завершена нормально без какой-либо ошибки.

Здесь x это номер канала в диапазоне от 0 до 7 включительно.

Смещение адреса: 0x50C + 0x20 * x
Значение сброса: 0x00000000

Этот регистр показывает маску статуса каждого канала, описанного ранее.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DTERRM
rw
FRMORM
rw
BBERRM
rw
TXERRM
rw
зарез. ACKM
rw
NAKM
rw
STALLM
rw
зарез. CHHM
rw
XFRCM
rw

Биты 31:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DTERRM (бит 10): Data Toggle ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки переключения данных маскировано (запрещено).

FRMORM (бит 9): FRaMe OverRun Mask. Если этот бит сброшен в 0, то прерывание выхода за пределы фрейма маскировано (запрещено).

BBERRM (бит 8): BaBble ERRor Mask. Если этот бит сброшен в 0, то прерывание помехообразного сигнала маскировано (запрещено).

TXERRM (бит 7): Transaction ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки транзакции маскировано (запрещено).

Бит 6 зарезервирован, и должен сохраняться в состоянии сброса (0).

ACKM (бит 5): ACK response received/transmitted interrupt Mask. Если этот бит сброшен в 0, то прерывание положительного подтверждения приема/передачи маскировано (запрещено).

NAKM (бит 4): NAK response received interrupt Mask. Если этот бит сброшен в 0, то прерывание получения отрицательного подтверждения маскировано (запрещено).

STALLM (бит 3): STALL response received interrupt Mask. Если этот бит сброшен в 0, то прерывание получения STALL маскировано (запрещено).

Бит 2 зарезервирован, и должен сохраняться в состоянии сброса (0).

CHHM (бит 1): CHannel Halted Mask. Если этот бит сброшен в 0, то прерывание остановки канала маскировано (запрещено).

XFRCM (бит 0): Transfer Completed Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено).

Здесь x это номер канала в диапазоне от 0 до 7 включительно.

Смещение адреса: 0x510 + 0x20 * x
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. DPID
rw
PKTCNT
rw
XFRSIZ[18:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XFRSIZ[15:0]
rw

Бит 31 зарезервирован, и должен сохраняться в состоянии сброса (0).

DPID (биты 30:29): Data PID. Приложение программирует это поле типом PID для использования в начальной транзакции. Хост обслуживает это поле для остальной части транзакции.

00: DATA0
01: DATA2
10: DATA1
11: MDATA (non-control, пакет, не относящийся к управлению)/SETUP (control, управление)

PKTCNT (биты 28:19): PacKeT CouNT. В это поле приложение программирует ожидаемое количество пакетов для передачи (OUT) или приема (IN). Хост декрементирует этот счетчик при каждой успешной передаче или успешном приеме пакета OUT/IN. Как только этот счетчик достигает 0, в приложении происходит прерывание, сигнализирующее нормальное завершение транзакции.

XFRSIZ (биты 18:0): Transfer SIZe. Для OUT в этом поле находится количество байт, которое хост отправляет во время транзакции. Для IN в этом поле находится размер буфера, который приложение резервирует для транзакции. Ожидается, что приложение запрограммирует это поле как целое число, кратное максимальному размеру пакета для транзакций IN (периодических и непериодических).

[Регистры режима устройства USB]

Смещение адреса: 0x800
Значение сброса: 0x0x02200000

Этим регистром ядро программируется в режиме устройства после включения питания или после определенных команд управления или энумерации. Не меняйте этот регистр после начальной инициализации.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано PFIVL
rw
DAD
rw
зарез. NZLSOHSK
rw
DSPD
rw

Биты 31:13 зарезервированы и должны сохраняться в состоянии сброса.

PFIVL (биты 12:11): Periodic Frame InterVaL. Показывает время внутри фрейма, в котором приложение должно быть оповещено прерыванием окончания периодического фрейма. Это может использоваться для определения, завершен ли весь изохронный трафик для этого фрейма.

00: 80% от интервала фрейма.
01: 85% от интервала фрейма.
10: 90% от интервала фрейма.
11: 95% от интервала фрейма.

DAD (биты 10:4): Device ADdress. Приложение должно запрограммировать это поле после каждой команды управления SetAddress.

Бит 3 зарезервирован и должен сохраняться в состоянии сброса (0).

NZLSOHSK (бит 2): Non-Zero-Length Status OUT HandShaKe. Приложение может использовать это поле, чтобы выбрать подтверждение (handshake), которое ядро посылает при приеме пакета не нулевой длины во время транзакции OUT стадии управления Status.

1: отправляется STALL handshake на ненулевой транзакции status OUT и не отправляет приложению принятый пакет OUT.
0: отправляется приложению принятый пакет OUT (нулевой или ненулевой длины) и отправляется handshake на основе бит NAK и STALL для конечной точки в регистре конечной точки управления устройства.

DSPD (биты 1:0): Device SPeeD. Указывает скорость, с которой приложение требует энумерации ядра, или максимальную скорость, которую может поддерживать приложение. Однако реальная скорость шины определяется только после завершения chirp-последовательности, и основывается на скорости хоста USB, к которому ядро подключено.

00: зарезервировано.
01: зарезервировано.
10: зарезервировано.
11: Full speed (тактовая частота трансивера USB 1.1 равна 48 МГц).

Смещение адреса: 0x804
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано POPRGDNE
rw
CGONAK
w
SGONAK
w
CGINAK
w
SGINAK
w
TCTL
rw
GONSTS
r
GINSTS
r
SDIS
rw
RWUSIG
rw

Биты 31:12 зарезервированы и должны сохраняться в состоянии сброса (все нули).

POPRGDNE (бит 11): Power-On PRoGramming DoNE. Приложение использует этот бит, чтобы показать, что программирования этого регистра завершено после выхода из режима пониженного потребления энергии (wakeup from power down mode).

CGONAK (бит 10): Clear Global OUT NAK. Запись 1 в этот бит очищает Global OUT NAK.

SGONAK (бит 9): Set Global OUT NAK. Запись 1 в этот бит установит Global OUT NAK. Приложение использует этот бит, чтобы отправить отрицательное подтверждение NAK на всех конечных точках OUT. Приложение должно установить этот бит только после наличии гарантии, что очищен бит Global OUT NAK в регистре прерываний ядра (бит GONAKEFF в регистре OTG_FS_GINTSTS).

CGINAK (бит 8): Clear Global IN NAK. Запись 1 в этот бит очистит Global IN NAK.

SGINAK (бит 7): Set Global IN NAK. Запись 1 в этот бит установит Global non-periodic IN NAK. Приложение использует этот бит для отправки отрицательного подтверждения NAK на всех не периодических конечных точках IN. Приложение должно установить этот бит только после наличии гарантии, что очищен бит Global IN NAK в регистре прерываний ядра (бит GINAKEFF в регистре OTG_FS_GINTSTS).

TCTL (биты 6:4): Test ConTroL, управление тестированием.

000: режим тестирования (Test mode) запрещен.
001: Test_J mode.
010: Test_K mode.
011: Test_SE0_NAK mode.
100: Test_Packet mode.
101: Test_Force_Enable.
Другие значения: зарезервировано.

GONSTS (бит 3): Global OUT NAK STatuS.

0: подтверждение (handshake) отправляется на основе статуса FIFO и настроек бит NAK и STALL.
1: не были записаны данные в RxFIFO, независимо от наличия свободного места. На все пакеты отправляется отрицательное подтверждение NAK, кроме транзакций SETUP. Все изохронные пакеты OUT отбрасываются.

GINSTS (бит 2): Global IN NAK STatuS.

0: подтверждение (handshake) отправляется на основе доступности данных в FIFO передачи.
1: отрицательное подтверждение NAK отправляется на всех не периодических конечных точек IN, независимо от доступности данных в FIFO передачи.

SDIS (бит 1): Soft DISconnect. Приложение использует этот бит для сигнала ядру USB OTG выполнить программное отключение (soft disconnect). Пока этот бит установлен, хост не видит, что устройство подключено, и устройство не получает сигналы по USB. Ядро остается в отключенном состоянии, пока приложение не очистит этот бит.

0: нормальное функционирование. Когда этот бит очищен после soft disconnect, ядро генерирует событие подключения устройства к хосту USB. Когда устройство подключается повторно, хост USB перезапускает энумерацию устройства.
1: ядро генерирует событие отключения устройства для хоста USB.

RWUSIG (бит 0): Remote WakeUp SIGnaling. Когда приложение установит этот бит, ядро инициирует сигнализацию удаленного пробуждения, чтобы вывести хост USB (wake up) из состояния пониженного энергопотребления. Приложение должно установить этот бит, чтобы инструктировать ядро выйти из состояния приостановки (Suspend state). Как указано в спецификации USB 2.0, приложение должно очистить этот бит в интервале времени от 1 до 15 мс после его установки.

В таблице 204 содержится минимальная длительность (по состояниям устройства), для которой должен быть установлен бит программного отключения (soft disconnect, SDIS), чтобы хост определил отключение устройства. Чтобы учесть джиттер тактов, приложению рекомендуется добавить некоторую дополнительную задержку к указанной минимальной длительности.

Таблица 204. Минимальная длительность soft disconnect.

Рабочая скорость Состояние устройства Минимальная длительность
Full speed (FS) Suspended (приостановлено) 1 мс + 2.5 мкс
Full speed (FS) Idle (ожидание) 2.5 мкс
Full speed (FS) ни Idle, ни Suspended (выполнение транзакций) 2.5 мкс

Смещение адреса: 0x808
Значение сброса: 0x00000010

Этот регистр показывает состояние ядра по отношению к событиям USB. Он должен быть прочитан при прерываниях регистра (OTG_FS_DAINT).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано FNSOF[13:8]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
FNSOF[7:0]
r
зарезервировано EERR
r
ENUMSPD
r
SUSPSTS
r

Биты 31:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FNSOF (биты 21:8): Frame Number of the received SOF. Номер фрейма принятого сигнала начала фрейма.

Биты 7:4 зарезервированы и должны сохраняться в состоянии сброса.

EERR (бит 3): Erratic ERRor. Ядро установит этот бит, чтобы сообщить о любом ошибочном поведении. Из-за этих ошибок контроллер OTG_FS переходит в состояние приостановки (Suspended state), и генерируется прерывание с битом ранней приостановки (Early suspend, бит ESUSP) в регистре OTG_FS_GINTSTS. Если early suspend был выставлен из-за erratic error, то приложение может только выполнить восстановление программного отключения (soft disconnect recover).

ENUMSPD (биты 2:1): ENUMerated SPeeD. Показывает скорость, на которой контроллер OTG_FS был запущен в работу после chirp-последовательности определения скорости.

01: зарезервировано.
10: зарезервировано.
11: Full speed (полная скорость FS, такты PHY работают на частоте 48 МГц).
Другие значения: зарезервировано.

SUSPSTS (бит 0): SUSPend STatuS. В режиме устройства этот бит установлен, пока на USB определено событие приостановки (Suspend condition). Ядро входит в Suspended state, когда на линиях данных USB нет активности в течение 3 мс. Ядро выходит из suspend:

– Когда появляется активность на линиях сигнала данных USB.
– Когда приложение записывает бит удаленного пробуждения (Remote wakeup, бит RWUSIG в регистре OTG_FS_DCTL).

Смещение адреса: 0x810
Значение сброса: 0x00000000

Этот регистр работает с каждым из регистров OTG_FS_DIEPINTx для всех конечных точек, чтобы генерировать прерывание конечной точки IN. Прерывание конечной точки IN для определенного состояния в регистре OTG_FS_DIEPINTx может быть замаскировано (запрещено) записью соответствующего бита в регистре OTG_FS_DIEPMSK. Биты статуса по умолчанию замаскированы.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезерв. NAKM
rw
зарезервировано INEPNEM
rw
INEPNMM
rw
ITTXFEMSK
rw
TOM
rw
зарез. EPDM
rw
XFRCM
rw

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAKM (бит 13): NAK interrupt Mask. Если этот бит сброшен в 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено).

Биты 12:7 зарезервированы и должны сохраняться в состоянии сброса (все нули).

INEPNEM (бит 6): IN EndPoint NAK Effective Mask. Если этот бит сброшен в 0, то соответствующее прерывание маскировано (запрещено).

INEPNMM (бит 5): IN token received with EP Mismatch Mask. Если этот бит сброшен в 0, то соответствующее прерывание маскировано (запрещено).

ITTXFEMSK (бит 4): IN Token received when TxFIFO Empty MaSK. Если этот бит сброшен в 0, то прерывание при получении токена IN, когда передающий буфер пуст, маскировано (запрещено).

TOM (бит 3): TimeOut condition Mask (не изохронные конечные точки). Если этот бит сброшен в 0, то прерывание таймаута маскировано (запрещено).

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDM (бит 1): EndPoint Disabled interrupt Mask. Если этот бит сброшен в 0, то прерывание запрещения конечной точки маскировано (запрещено).

XFRCM (бит 0): TransfeR Completed interrupt Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено).

Смещение адреса: 0x814
Значение сброса: 0x00000000

Этот регистр работает с каждым из регистров OTG_FS_DOEPINTx для всех конечных точек, чтобы генерировать прерывания конечных точек OUT. Прерывание конечной точки OUT для определенного статуса в регистре OTG_FS_DOEPINTx можно маскировать записью соответствующего бита в регистре OTG_FS_DOEPMSK. Биты статуса по умолчанию замаскированы (запрещены).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезерв. NAKM
rw
BERRM
rw
зарезервировано OUTPKTERRM
rw
зарезерв. STSPHSRXM
rw
OTEPDM
rw
STUPM
rw
зарез. EPDM
rw
XFRCM
rw

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAKM (бит 13): NAK interrupt Mask. Если этот бит сброшен в 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено).

BERRM (бит 12): Babble ERRor interrupt Mask. Если этот бит сброшен в 0, то прерывание помехообразного сигнала маскировано (запрещено).

Биты 11:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

OUTPKTERRM (бит 8): OUT PacKeT ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки пакета OUT маскировано (запрещено).

Биты 7:6 зарезервированы и должны сохраняться в состоянии сброса (все нули).

STSPHSRXM (бит 5): StaTuS PHaSe Received for control write Mask. Если этот бит сброшен в 0, то прерывание фазы статуса для управляющей записи маскировано (запрещено).

OTEPDM (бит 4): OUT Token received when EndPoint Disabled Mask. Если этот бит сброшен в 0, то маскировано (запрещено) прерывание, когда получен токен OUT при запрещенной конечной точке.

STUPM (бит 3): SETUP Phase done Mask. то прерывание завершения фазы настройки маскировано (запрещено).

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDM (бит 1): EndPoint Disabled interrupt Mask. Если этот бит сброшен в 0, то прерывание запрещения конечной точки маскировано (запрещено).

XFRCM (бит 0): TransfeR Completed interrupt Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено).

Смещение адреса: 0x818
Значение сброса: 0x00000000

Когда на конечной точке происходит значимое событие, регистр OTG_FS_DAINT генерирует прерывание, используя бит прерываний конечных точек OUT устройства или конечных точек IN устройства (биты OEPINT или IEPINT в регистре OTG_FS_GINTSTS соответственно). Здесь имеется один бит прерывания на конечную точку, всего до 16 бит для конечных точек OUT и до 16 бит для конечных точек IN. Для двунаправленной конечной точки, используются соответствующие бит прерываний IN и OUT. Биты в регистре OTG_FS_DAINT устанавливаются и очищаются, когда приложение устанавливает и очищает биты в регистре соответствующей конечной точки x устройства (OTG_FS_DIEPINTx/OTG_FS_DOEPINTx).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
OEPINT
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
IEPINT
r

OEPINT (биты 31:16): OUT EndPoint INTerrupt bits, биты прерываний конечных точек OUT, по одному биту на конечную точку: бит 16 соответствует конечной точке OUT номер 0, бит 19 конечной точке OUT номер 3.

IEPINT (биты 15:0): IN EndPoint INTerrupt bits, биты прерываний конечных точек IN, по одному биту на конечную точку: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3.

Смещение адреса: 0x81C
Значение сброса: 0x00000000

Регистр OTG_FS_DAINTMSK работает вместе с регистром прерываний конечных точек, когда происходит прерывание на конечной точке устройства. Биты OTG_FS_DAINTMSK позволяют маскировать (запретить) прерывание соответствующей конечной точки, однако биты регистра OTG_FS_DAINT при этом все равно будут устанавливаться, даже если прерывание запрещено.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
OEPM
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
IEPM
rw

OEPM (биты 31:16): OUT EP interrupt Mask bits, биты маски прерываний конечной точки OUT, по одному биту на конечную точку: бит 16 соответствует конечной точке OUT номер 0, бит 19 конечной точке OUT номер 3.

IEPM (биты 15:0): IN EP interrupt Mask bits, биты маски прерываний конечной точки IN, по одному биту на конечную точку: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3.

Смещение адреса: 0x828
Значение сброса: 0x000017D7

Этот регистр задает время разряда VBUS после импульса VBUS во время SRP.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
VBUSDT
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

VBUSDT (биты 15:0): Device VBUS Discharge Time. Задает время разряда VBUS следующим образом: время разряда VBUS в тактах PHY / 1024. Это значение может меняться в зависимости от нагрузки на шину VBUS (чем больше нагрузка по току и меньше емкость конденсатора фильтра VBUS, тем меньше постоянная времени разряда VBUS).

Смещение адреса: 0x82C
Значение сброса: 0x000005B8

Этот регистр задает время импульса VBUS во время SRP.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DVBUSP
rw

Биты 31:12 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DVBUSP (биты 11:0): Device VBUS Pulsing time. Задает время импульса VBUS следующим образом: время импульса VBUS в тактах PHY/1024.

Смещение адреса: 0x834
Значение сброса: 0x00000000

Этот регистр используется для управления генерацией прерывания опустошения FIFO конечной точки IN (TXFE_OTG_FS_DIEPINTx).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
INEPTXFEM
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

INEPTXFEM (биты 15:0): IN EP TxFIFO Empty interrupt Mask. Эти биты работают как маска дляOTG_FS_DIEPINTx. Если они установлены в 0, то маскируют (запрещают) прерывание опустошения стека передачи конечной точки IN: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3.

Смещение адреса: 0x900
Значение сброса: 0x00000000

Регистр управления конечной точкой 0. Не нулевые конечные точки управления используют регистры для конечных точек 1 .. 3.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
r
EPDIS
r
зарезерв. SNAK
w
CNAK
w
TXFNUM
rw
STALL
rs
зарез. EPTYP
r
NAKSTS
r
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
r
зарезервировано MPSIZ
rw

EPENA (бит 31): EndPoint ENAble. Приложение использует этот бит, чтобы запустить передачу на конечной точке 0. Ядро очищает этот бит перед установкой любого из следующих прерываний этой конечной точки:

– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения.

Биты 29:28 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. Используя этот бит, приложение может управлять передачей отрицательного подтверждения NAK конечной точки. Ядро может также установить этот бит для конечной точки после того, как для этой конечной точки принят пакет SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для конечной точки.

TXFNUM (биты 25:22): TxFIFO NUMber. Значение в этом поле устанавливает номер FIFO, назначенного для конечной точки IN номер 0.

STALL (бит 21): STALL handshake. Приложение может только установить этот бит, и ядро очистит его, когда для этой конечной точки принят токен SETUP. Если вместе с битом STALL установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет.

Бит 20 зарезервирован и должен сохраняться в состоянии сброса (0).

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. В этом поле жестко закодировано значение 00.

NAKSTS (бит 17): NAK STatuS. Показывает следующее:

0: ядро передает не-NAK подтверждения на основе статуса FIFO.
1: ядро передает отрицательные подтверждения NAK на этой конечной точке.

Когда этот бит установлен либо приложением, либо ядром, ядро останавливает передачу данных, даже если в TxFIFO есть данные для передачи. Независимо от значения этого бита ядро всегда отвечает на данные пакетов SETUP положительным подтверждением ACK.

Бит 16 зарезервирован и должен сохраняться в состоянии сброса (0).

USBAEP (бит 15): USB Active EndPoint. Этот бит всегда установлен в 1, показывая тем самым, что конечная точка 0 активна всегда во всех конфигурациях и на всех интерфейсах.

Биты 14:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 1:0): Maximum Packet SIZe. Приложение должно запрограммировать это поле максимальным размером пакета для текущей логической конечной точки.

00: 64 байта
01: 32 байта
10: 16 байт
11: 8 байт

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0x900 + 0x20 * x
Значение сброса: 0x00000000

Приложение использует этот регистр для управления поведением любой конечной точки, отличающейся от конечной точки управления 0 (endpoint 0, так называемая конечная точка по умолчанию).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
rs
EPDIS
rs
SODDFRM
w
SD0PID/
SEVNFRM

w
SNAK
w
CNAK
w
TXFNUM
rw
STALL
rw
зарез. EPTYP
rw
NAKSTS
r
EONUM/
DPID

r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
rw
зарезервировано MPSIZ
rw

EPENA (бит 31): EndPoint ENAble. Приложение устанавливает этот бит, чтобы запустить передачу на этой конечной точке. Ядро очистит этот бит перед установкой любого из следующих прерываний этой конечной точки:

– завершена фаза SETUP
– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения.

SODDFRM (бит 29): Set ODD FRaMe. Применимо только к изохронным конечным точкам IN и OUT. Запись в это поле установит поле Even/Odd фрейма (EONUM) в нечетный (odd) фрейм.

SD0PID (бит 28): Set DATA0 PID. Применимо только для конечных точек interrupt/bulk IN. Запись в это поле установит поле PID (DPID) данных конечной точки в этом регистре на DATA0.

SEVNFRM (бит 28): Set EVeN FRaMe. Применимо только к конечным точкам isochronous IN. Запись в это поле установит поле фрейма Even/Odd (EONUM) в четный (even) фрейм.

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. С использованием этого бита приложение может управлять передачей отрицательными подтверждениями NAK на конечной точке. Ядро также может установить этот бит для конечных точек OUT на прерывание завершения транзакции, или после приема на этой конечной точке пакета SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для этой конечной точки.

TXFNUM (биты 25:22): TxFIFO NUMber. Эти биты задают номер FIFO, связанный с этой конечной точкой. Каждая активная конечная точка IN должна быть запрограммирована на отдельный номер FIFO. Это поле допустимо только для конечных точек IN.

STALL (бит 21): STALL handshake. Применимо только для не управляющих и не изохронных конечных точек IN (тип доступа rw, чтение и запись). Приложение устанавливает этот бит для приостановки всех токенов от хоста USB к этой конечной точке. Если вместе с этим битом установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет. Очистить этот бит может только приложение, но не ядро.

Бит 20 зарезервирован и должен сохраняться в состоянии сброса (0).

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. Здесь указывается тип транзакции, поддерживаемый этой логической конечной точкой.

00: Control
01: Isochronous
10: Bulk
11: Interrupt

NAKSTS (бит 17): NAK STatuS. Означает следующее:

0: ядро передает не-NAK подтверждения, базируясь на статусе FIFO.
1: ядро передает отрицательные подтверждения NAK для этой конечной точки.

Когда либо приложение, либо ядро установит этот бит, для не изохронных конечных точек IN: ядро прекращает передавать любые данные на конечной точке IN, даже если в TxFIFO есть данные для передачи.

Когда либо приложение, либо ядро установит этот бит, для изохронных конечных точек IN: ядро передает пакет данных нулевой длины (zero-length data packet), даже если в TxFIFO есть данные для передачи.

Независимо от состояния этого бита ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP.

EONUM (бит 16): Even/Odd frame NUMber. Применимо только к конечным точкам isochronous IN. Показывает номер пакета, в котором ядро передает/принимает изохронные данные для этой конечной точки. Приложение должно запрограммировать это поле четным/нечетным (even/odd) номером фрейма, в котором намереваются передать/принять изохронные данные для этой конечной точки, используя поля SEVNFRM и SODDFRM в этом регистре.

0: четный (even) фрейм
1: нечетный (odd) фрейм

DPID (бит 16): Endpoint Data PID. Применимо только для конечных точек interrupt/bulk IN. Содержит PID пакета для приема или передачи на этой конечной точке. Приложение должно запрограммировать PID первого пакета для передачи или приема на этой конечной точке после того, как конечная точка активирована. Приложение использует поле SD0PID регистра для программирования либо DATA0, либо DATA1 PID.

0: DATA0
1: DATA1

USBAEP (бит 15): USB Active EndPoint. Показывает, активна ли эта конечная точка в текущей конфигурации и на текущем интерфейсе. Ядро очищает этот бит для всех конечных точек (отличающихся от EP0) после детектирования USB reset. После получения команд SetConfiguration и SetInterface, приложение должно правильно запрограммировать регистры конечных точек и установить этот бит.

Биты 14:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 10:0): Maximum Packet SIZe. Приложение должно установить в это поле максимальный размер пакета для текущей логической конечной точки. Значение указывается в байтах.

Смещение адреса: 0xB00
Значение сброса: 0x00008000

Это регистр для настройки поведения конечной точки управления (она же конечная точка по умолчанию, или конечная точка номер 0, EP0). Для настройки ненулевых конечных точек 1 .. 3 используются другие регистры (см. далее).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
w
EPDIS
r
зарезерв. SNAK
w
CNAK
w
зарезервировано STALL
rs
SNPM
rw
EPTYP
r
NAKSTS
r
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
r
зарезервировано MPSIZ
r

EPENA (бит 31): EndPoint ENAble. Приложение устанавливает этот бит, чтобы запустить передачу на конечной точке 0. Ядро очистит этот бит перед установкой любого из следующих прерываний этой конечной точки:

– завершена фаза SETUP
– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение не может запретить управляющую конечную точку OUT 0.

Биты 29:28 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. Используя этот бит, приложение может управлять передачей отрицательных подтверждений NAK конечной точки. Ядро может также установить этот бит для прерывания завершения транзакции конечной точки, или после того, как на конечной точке принят пакет SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для конечной точки.

Биты 25:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

STALL (бит 21): STALL handshake. Приложение может только установить этот бит, и ядро очистит его, когда для этой конечной точки принят токен SETUP. Если вместе с этим битом установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет. Независимо от настройки этого бита ядро всегда отвечает положительным подтверждением ACK на пакет данных SETUP.

SNPM (бит 20): SNooP Mode. Этот бит конфигурирует конечную точку в режим слежения (Snoop mode). В этом режиме ядро не проверяет корректность пакетов OUT перед тем, как передать их в память приложения.

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. Жестко закодировано 00, потому что это конечная точка управления.

NAKSTS (бит 17): NAK STatuS. Показывает следующее:

0: ядро передает не-NAK подтверждение, основываясь на статусе FIFO.
1: ядро передает отрицательные подтверждения NAK для этой конечной точки.

Когда либо приложение, либо ядро установит этот бит, ядро прекратит принимать данные, даже если есть свободное место в RxFIFO, чтобы сохранить пришедший пакет. Независимо от настройки этого бита, ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP.

Бит 16 зарезервирован и должен сохраняться в состоянии сброса (0).

USBAEP (бит 15): USB Active EndPoint. Этот бит всегда установлен в 1, показывая тем самым, что конечная точка 0 всегда активна для всех конфигураций и интерфейсов.

Биты 14:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 1:0): Maximum Packet SIZe. Максимальный размер пакета для control OUT endpoint 0, который программируется точно так же, как и для control IN endpoint 0.

00: 64 байта
01: 32 байта
10: 16 байт
11: 8 байт

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0xB00 + 0x20 * x
Значение сброса: 0x00000000

Приложение использует этот регистр для управления поведением любой конечной точки, отличающейся от конечной точки управления 0 (endpoint 0, так называемая конечная точка по умолчанию).

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
rs
EPDIS
rs
SODDFRM/
SD1PID

w
SD0PID/
SEVNFRM

w
SNAK
w
CNAK
w
зарезервировано STALL
rw
SNPM
rw
EPTYP
rw
NAKSTS
r
EONUM/
DPID

r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
rw
зарезервировано MPSIZ
rw

EPENA (бит 31): EndPoint ENAble. Применимо к конечным точкам IN и OUT. Приложение устанавливает этот бит, чтобы запустить передачу на этой конечной точке. Ядро очистит этот бит перед установкой любого из следующих прерываний этой конечной точки:

– завершена фаза SETUP
– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения.

SD1PID (бит 29): Set DATA1 PID. Применимо только к конечным точкам interrupt/bulk IN и OUT. Запись в это поле регистра установит поле данных PID конечной точки (DPID) этого регистра в DATA1.

SODDFRM (бит 29): Set ODD FRaMe. Применимо только к изохронным конечным точкам IN и OUT. Запись в это поле установит поле четности/нечетности (Even/Odd) фрейма (EONUM) в нечентый (odd) фрейм.

SD0PID (бит 28): Set DATA0 PID. Применимо только для конечных точек interrupt/bulk OUT. Запись в это поле установит поле PID (DPID) данных конечной точки в этом регистре на DATA0.

SEVNFRM (бит 28): Set EVeN FRaMe. Применимо только к конечным точкам isochronous OUT. Запись в это поле установит поле фрейма Even/Odd (EONUM) в четный (even) фрейм.

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. С использованием этого бита приложение может управлять передачей отрицательными подтверждениями NAK на конечной точке. Ядро также может установить этот бит для конечных точек OUT на прерывание завершения транзакции, или после приема на этой конечной точке пакета SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для этой конечной точки.

Биты 25:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

STALL (бит 21): STALL handshake. Применимо только для не управляющих, не изохронных конечных точек OUT (тип доступа rw, чтение и запись). Приложение устанавливает этот бит для приостановки всех токенов от хоста USB к этой конечной точке. Если вместе с этим битом установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет. Очистить этот бит может только приложение, но не ядро.

SNPM (бит 20): SNooP Mode. Этот бит конфигурирует конечную точку в режиме слежения (Snoop mode). В этом режиме ядро не проверяет корректность пакетов OUT перед передачей их в память приложения.

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. Здесь указывается тип транзакции, поддерживаемый этой логической конечной точкой.

00: Control
01: Isochronous
10: Bulk
11: Interrupt

NAKSTS (бит 17): NAK STatuS. Означает следующее:

0: ядро передает не-NAK подтверждения, базируясь на статусе FIFO.
1: ядро передает отрицательные подтверждения NAK для этой конечной точки.

Когда либо приложение, либо ядро установит этот бит: ядро прекращает принимать любые данные на конечной точке OUT, даже если в RxFIFO есть свободное место для сохранения поступившего пакета.

Независимо от состояния этого бита ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP.

EONUM (бит 16): Even/Odd frame NUMber. Применимо только к конечным точкам isochronous IN и OUT. Показывает номер пакета, в котором ядро передает/принимает изохронные данные для этой конечной точки. Приложение должно запрограммировать это поле четным/нечетным (even/odd) номером фрейма, в котором намереваются передать/принять изохронные данные для этой конечной точки, используя поля SEVNFRM и SODDFRM в этом регистре.

0: четный (even) фрейм
1: нечетный (odd) фрейм

DPID (бит 16): Endpoint Data PID. Применимо только для конечных точек interrupt/bulk OUT. Содержит PID пакета для приема или передачи на этой конечной точке. Приложение должно запрограммировать PID первого пакета для передачи или приема на этой конечной точке после того, как конечная точка активирована. Приложение использует поле SD0PID регистра для программирования либо DATA0, либо DATA1 PID.

0: DATA0
1: DATA1

USBAEP (бит 15): USB Active EndPoint. Показывает, активна ли эта конечная точка в текущей конфигурации и на текущем интерфейсе. Ядро очищает этот бит для всех конечных точек (отличающихся от EP0) после детектирования USB reset. После получения команд SetConfiguration и SetInterface, приложение должно правильно запрограммировать регистры конечных точек и установить этот бит.

Биты 14:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 10:0): Maximum Packet SIZe. Приложение должно установить в это поле максимальный размер пакета для текущей логической конечной точки. Значение указывается в байтах.

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0x908 + 0x20 * x
Значение сброса: 0x00000080

Этот регистр показывает статус конечной точки по отношению к событиям USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерываний конечной точки IN в регистре прерываний ядра (бит IEPINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_FS_DAINT), чтобы получить точный номер конечной точки для регистра прерываний конечной точки x устройства. Чтобы очистить соответствующие биты в регистрах OTG_FS_DAINT и OTG_FS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_FS_DIEPINTx.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано NAK
rc_w1
зарез. PKTDRPSTS
rc_w1
зарезервировано TXFE
r
INEPNE
rc_w1
INEPNM
rc_w1
ITTXFE
rc_w1
TOC
rc_w1
зарез. EPDISD
rc_w1
XFRC
rc_w1

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAK (бит 13): NAK input. Ядро генерирует это прерывание, когда устройством передается или принимается NAK. В случае изохронных конечных точек IN прерывание генерируется, когда передается пакет нулевой длины (zero length packet) из-за отсутствия данных в TxFIFO.

Бит 12 зарезервирован и должен сохраняться в состоянии сброса (0).

PKTDRPSTS (бит 11): PacKeT DRoPped STatuS. Этот бит показывает приложению, что был отброшен пакет ISOC OUT. У этого бита нет связанного бита маски, и он не генерирует прерывание.

Биты 10:8 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TXFE (бит 7): Transmit FIFO Empty. Это прерывание выставляется, когда TxFIFO для этой конечной точки пуст либо наполовину, либо полностью. Наполовину ил полностью - определяется битом уровня опустошенности стека передачи TxFIFO Empty Level (бит TXFELVL) в регистре OTG_FS_GAHBCFG.

INEPNE (бит 6): IN EndPoint NAK Effective. Этот бит может быть очищен, когда приложение очищает IN endpoint NAK записью бита CNAK в регистре OTG_FS_DIEPCTLx.

Это прерывание показывает, что ядро получило настройку бита NAK (установленную либо приложением, либо самим ядром). Прерывание показывает, что настройка IN endpoint NAK, установленная приложением, вступила для ядра в силу.

Это прерывание не гарантирует, что отрицательное подтверждение NAK отправлено через USB. Бит STALL имеет приоритет над битом NAK.

INEPNM (бит 5): IN token received with EP Mismatch. Показывает, что данные на вершине непериодического TxFIFO принадлежат конечной точке, отличающейся от той, для которой был получен токен IN. Это прерывание выставляется на той конечной точке, на которой был получен токен IN.

ITTXFE (бит 4): IN Token received when TxFIFO is Empty. Применимо только для не периодических конечных точек IN. Показывает, что токен IN был принят, когда связанный TxFIFO (периодический / не периодический) был пуст. Это прерывание выставляется на той конечной точке, для которой был принят токен IN.

TOC (бит 3): TimeOut Condition. Применимо только к конечным точкам Control IN. Показывает, что ядро определило событие таймаута на USB для последнего токена IN на этой конечной точке.

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDISD (бит 1): EndPoint DISableD interrupt. Этот бит показывает, что конечная точка запрещена по запросу приложения.

XFRC (бит 0): Transfer Completed interrupt. Показывает, что запрограммированная для этой конечной точки транзакция завершена как на AHB, так и на USB.

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0xB08 + 0x20 * x
Значение сброса: 0x00000080

Этот регистр показывает статус конечной точки по отношению к событиям USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерываний конечной точки OUT в регистре прерываний ядра (бит OEPINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_FS_DAINT), чтобы получить точный номер конечной точки для регистра прерываний конечной точки x устройства OTG_FS_DOEPINTx. Чтобы очистить соответствующие биты в регистрах OTG_FS_DAINT и OTG_FS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_FS_DOEPINTx.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано NAK
rc_w1
BERR
rc_w1
зарезервировано OUTPKTERR
rc_w1
зарезерв. STSPHSRX
rc_w1
OTEPDIS
rc_w1
STUP
rc_w1
зарез. EPDISD
rc_w1
XFRC
rc_w1

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAK (бит 13): NAK input. Ядро генерирует это прерывание, когда устройством передается или принимается NAK. В случае изохронных конечных точек IN прерывание генерируется, когда передается пакет нулевой длины (zero length packet) из-за отсутствия данных в TxFIFO.

BERR (бит 12): Babble ERRor interrupt. Ядро генерирует это прерывание, тогда для этой конечной точки получен помехообразный сигнал (babble).

Биты 11:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

OUTPKTERR (бит 8): OUT PacKeR ERRor. Это прерывание выставляется, когда ядро детектирует переполнение или ошибку CRC для пакета OUT. Это прерывание допустимо только когда разрешена пороговая обработка (thresholding).

Биты 7:6 зарезервированы и должны сохраняться в состоянии сброса.

STSPHSRX (бит 5): STatuS PHaSe Received for control write. Это прерывание генерируется только после того, как ядро передало все данные в буфер системной памяти, когда хост передал всю полезную нагрузку на фазе данных транзакции control write. Прерывание показывает приложению, что хост переключился с фазы данных на фазу статуса транзакции control write. Приложение может использовать это прерывание, чтобы положительно подтвердить через ACK или подтвердить остановкой STALL фазу статуса, после того как оно декодировало фазу данных.

OTEPDIS (бит 4): OUT Token received when EndPoint DISabled. Применимо только к конечным точкам control OUT. Показывает, что был принят токен OUT, когда конечная точка еще не была разрешена. Это прерывание выставляется на той конечной точке, для которой был принят токен OUT.

STUP (бит 3): SETUP phase done. Применимо только к конечным точкам control OUT. Показывает, что фаза SETUP управляющей конечной точки (control endpoint) завершена и для текущей передачи управления больше не были получены пакеты установки с обратной передачей (back-toback SETUP packets). На этом прерывании приложение может декодировать принятый пакет данных SETUP.

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDISD (бит 1): EndPoint DISableD interrupt. Этот бит показывает, что конечная точка запрещена по запросу приложения.

XFRC (бит 0): Transfer Completed interrupt. Это поле показывает, что для этой конечной точки завершена запрограммированная транзакция как на AHB, так и на USB.

Смещение адреса: 0x910
Значение сброса: 0x00000000

Приложение должно изменять этот регистр перед разрешением конечной точки 0. Как только конечная точка 0 разрешена соответствующим битом в регистре управления конечной точкой 0 (бит EPENA в регистре OTG_FS_DIEPCTL0), этот регистр модифицирует ядро. Приложение может только читать этот регистр, как только ядро очистило бит разрешения конечной точки.

Ненулевые конечные точки 1 .. 3 используют другие регистры.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PKTCNT
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано XFRSIZ
rw

Биты 31:21 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTCNT (биты 20:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) данных для конечной точки 0. Это поле декрементируется каждый раз, когда пакет (максимального размера или короче) прочитан из TxFIFO.

Биты 18:7 зарезервированы и должны сохраняться в состоянии сброса (все нули).

XFRSIZ (биты 6:0): Transfer size. Показывает размер транзакции в байтах для конечной точки 0. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет перемещается из внешней памяти в TxFIFO.

Смещение адреса: 0xB10
Значение сброса: 0x00000000

Как только конечная точка 0 разрешена соответствующим битом в регистре управления конечной точкой 0 (бит EPENA в регистре OTG_FS_DIEPCTL0), этот регистр модифицирует ядро. Приложение может только читать этот регистр, как только ядро очистило бит разрешения конечной точки.

Ненулевые конечные точки 1 .. 3 используют другие регистры.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. STUPCNT
rw
зарезервировано PKTCNT
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано XFRSIZ
rw

Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0).

STUPCNT (бит 30:29): SETUP Packet CouNT. Это поле задает количество пакетов данных back-to-back SETUP, которое может принять конечная точка.

01: 1 пакет
10: 2 пакета
11: 3 пакета

Биты 28:20 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTCNT (бит 19): PacKeT CouNT. Это поле декрементируется до нуля после того, как пакет записывается в RxFIFO.

Биты 18:7 зарезервированы и должны сохраняться в состоянии сброса (все нули).

XFRSIZ (биты 6:0): Transfer size. Показывает размер транзакции в байтах для конечной точки 0. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается в TxFIFO и перемещается во внешнюю память.

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0x910 + 0x20 * x
Значение сброса: 0x00000000

Приложение должно менять этот регистр перед тем, как разрешит эту конечную точку. Как только конечная точка разрешена соответствующим битом (бит EPENA в регистре OTG_FS_DIEPCTLx), этот регистр модифицирует ядро. Приложение может только читать этот регистр, ккогда ядро очистит бит разрешения конечной точки.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PKTCNT
rw
XFRSIZ[18:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XFRSIZ[15:0]
rw

Биты 31:29 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTCNT (биты 28:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) объема данных для этой конечной точки.

Это поле декрементируется всякий раз, когда пакет (максимального размера или меньше) считывается из TxFIFO.

XFRSIZ (биты 18:0): Transfer size. Показывает размер транзакции в байтах для текущей конечной точки. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается из внешней памяти и перемещается в TxFIFO.

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0x918 + 0x20 * x

Это регистр только для чтения, содержащий информацию свободного пространства TxFIFO для конечной точки Device IN.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
INEPTFSAV
r

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса.

INEPTFSAV (биты 15:0): IN EndPoint TxFIFO Space AVailable. Показывает количество свободного пространства, доступного в TxFIFO конечной точки. Значение указывается в 32-битных словах:

0x0000: TxFIFO конечной точки заполнен.
0x0001: есть место для 1 слова.
0x0002: есть место для 2 слов.
n: есть место для n слов.
Другие значения: зарезервировано.

Здесь x это номер конечной точки от 1 до 3.

Смещение адреса: 0xB10 + 0x20 * x
Значение сброса: 0x00000000

Приложение должно модифицировать этот регистр перед разрешением конечной точки. Как только конечная точка разрешена соответствующим битом (бит EPENA в регистре OTG_FS_DOEPCTLx), этот регистр модифицирует ядро. Приложение может только считывать этот регистр, когда ядро очистит бит разрешения конечной точки.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. RXDPID/
STUPCNT

r/rw
PKTCNT
rw
XFRSIZ[18:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XFRSIZ[15:0]
rw

Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0).

RXDPID (биты 30:29): Received Data PID. Применимо только к конечным точкам isochronous OUT. Это PID данных, принятый в последнем пакете для этой конечной точки.

00: DATA0
01: DATA2
10: DATA1
11: MDATA

STUPCNT (биты 30:29): SETUP packet CouNT. Применимо только к конечным точкам control OUT. Это поле задает количество пакетов данных back-to-back SETUP, которое может принять конечная точка.

01: 1 пакет
10: 2 пакета
11: 3 пакета

PKTCNT (биты 28:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) объема данных для этой конечной точки.

Это поле декрементируется всякий раз, когда пакет (максимального размера или меньше) записывается в RxFIFO.

XFRSIZ (биты 18:0): Transfer size. Показывает размер транзакции в байтах для текущей конечной точки. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается из RxFIFO и перемещается во внешнюю память.

Смещение адреса: 0xE00
Значение сброса: 0x00000000

Регистр управления питанием и тактированием, он доступен в режиме хоста USB и в режиме устройства USB.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано PHYSUSP
rw
зарезерв. GATEHCLK
rw
STPPCLK
rw

Биты 31:5 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PHYSUSP (бит 4): PHY SUSPended. Показывает, что PHY был приостановлен. Этот бит обновляется, как только PHY приостановлен после того, как приложение установило бит STPPCLK (бит 0 этого регистра).

Биты 3:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GATEHCLK (бит 1): Gate HCLK. Приложение установит этот бит, чтобы подать HCLK на модули, отличающиеся от AHB Slave и Master и логики пробуждения (wakeup logic), когда USB приостанавливается, или сессия неправильная. Приложение очищает этот бит, когда USB возобновляет работу, или когда начинается новая сессия.

STPPCLK (бит 0): SToP PHY CLocK. Приложение установит этот бит для остановки тактов PHY, когда USB приостанавливается, сессия неправильная, или когда устройство отключается. Приложение очищает этот бит, когда USB возобновляет работу, или когда начинается новая сессия.

Смещения адресов регистров OTG_FS в адресном пространстве STM32F4xx отсчитываются относительно адреса 0x50000000 (см. таблицу 1 в даташите [1]).

STM32F4 OTG FS FS register map

[Модель программирования OTG_FS]

Инициализация ядра. Приложение должно выполнить последовательность инициализации ядра. Если при включении питания кабель подключен, то бит текущего режима работы (бит CMOD в регистре OTG_FS_GINTSTS) показывает, как работает ядро - как хост или как устройство USB. Контроллер OTG_FS входит в режим хоста, когда подключен коннектор "A", или в режим устройства, когда подключен коннектор "B".

В этом разделе описывается инициализация контроллера OTG_FS после включения питания. Приложение должно следовать этой последовательности инициализации, независимо от режима работы - как хост или как устройство. Все глобальные регистры ядра инициализируются в соответствии с конфигурацией ядра (эта процедура общая как для режима хоста, так и для режима устройства):

1. Запрограммируйте следующие поля в регистре OTG_FS_GAHBCFG:

– Бит глобальной маски прерываний (Global interrupt mask bit) GINTMSK = 1.
– RxFIFO non-empty (бит RXFLVL в регистре OTG_FS_GINTSTS).
– Уровень опустошенности периодического стека передачи (Periodic TxFIFO empty level).

2. Запрограммируйте следующие поля в регистре OTG_FS_GUSBCFG:

– Бит разрешения функции смены ролей хост-устройство (HNP capable bit).
– Бит разрешения управления питанием порта USB (SRP capable bit).
– Поле калибровки таймаута полной скорости (FS timeout calibration).
– Поле срока обработки (USB turnaround time).

3. Программа должна демаскировать следующие биты в регистре OTG_FS_GINTMSK:

- Маска прерывания OTG.
- Маска прерывания несоответствия режима (Mode mismatch).

4. Программа может прочитать бит CMOD в регистре OTG_FS_GINTSTS, чтобы определить, в каком режиме работает контроллер OTG_FS - в режиме хоста или в режиме устройства USB.

Инициализация хоста USB. Чтобы инициализировать ядро как хост, приложение должно выполнить следующие шаги:

1. Запрограммировать HPRTINT в регистре OTG_FS_GINTMSK, чтобы демаскировать это прерывание.

2. Запрограммировать регистр OTG_FS_HCFG, чтобы выбрать full-speed (FS) хост.

3. Запрограммировать бит PPWR регистра OTG_FS_HPRT в лог. 1. Это включит VBUS на USB.

4. Подождать прерывания PCDET в регистре OTG_FS_HPRT0. Оно покажет, что устройство подключено к порту.

5. Запрограммировать бит PRST регистра OTG_FS_HPRT в лог. 1. Это начнет процесс сброса по шине USB (USB reset).

6. Подождать как минимум 10 мс, чтобы завершился USB reset.

7. Запрограммировать бит PRST регистра OTG_FS_HPRT в лог. 0.

8. Подождать прерывания PENCHNG в регистре OTG_FS_HPRT.

9. Прочитать бит PSPD регистра OTG_FS_HPRT, чтобы получить скорость, с которой прошла энумерация.

10. Запрограммировать регистр HFIR значением, соответствующим выбранной PHY clock 1.

11. Запрограммировать поле FSLSPCS в регистре OTG_FS_HCFG в соответствии со скоростью, которая была определена на шаге 9. Если FSLSPCS было изменено, то должен быть выполнен сброс порта.

12. Запрограммировать регистр OTG_FS_GRXFSIZ для выбора размера FIFO приема.

13. Запрограммировать регистр OTG_FS_HNPTXFSIZ для выбора размера и начального адреса не периодического FIFO передачи для не периодических транзакций.

14. Запрограммировать регистр OTG_FS_HPTXFSIZ для выбора размера и начального адреса периодического FIFO для периодических транзакций.

Чтобы обмениваться данными с устройствами, системное ПО должно инициализировать и разрешить как минимум один канал.

Инициализация устройства USB. Приложение должно выполнить следующие шаги для инициализации ядра в качестве устройства при включении питания, или при смене режима с хоста на устройство.

1. Запрограммируйте следующие поля в регистре OTG_FS_DCFG:

– Скорость устройства (Device speed).
– Статус ненулевой длины подтверждения OUT (Non-zero-length status OUT handshake).

2. Запрограммируйте регистр OTG_FS_GINTMSK для демаскирования следующих прерываний:

– Сброс по шине (USB reset).
– Завершение энумерации (Enumeration done).
– Ранняя приостановка (Early suspend).
– Приостановка шины (USB suspend).
– Начало фрейма (SOF).

3. Запрограммируйте бит VBUSBSEN в регистре OTG_FS_GCCFG, чтобы разрешить анализ уровня VBUS в режиме "B" устройства, и подачи 5V через верхний подтягивающий резистор (pull-up) линии данных D+ (DP).

4. Подождите прерывания USBRST в регистре OTG_FS_GINTSTS. Это показывает, что был определен сброс по шине USB длительностью около 10 мс или больше.

Потом нужно подождать прерывания ENUMDNE в регистре OTG_FS_GINTSTS. Это прерывание показывает окончание сброса по шине USB. При получении этого прерывания, приложение должно прочитать регистр OTG_FS_DSTS, чтобы определить скорость энумерации и выполнить шаги, перечисленные далее в секции "Инициализация конечной точки по завершению энумерации".

Начиная с этого момента устройство готово принять пакеты SOF и выполнить управляющие передачи на конечной точке 0.

[Модель программирования хоста USB]

Инициализация канала. Приложение должно инициализировать один или большее количество каналов перед тем, как оно может обмениваться данными с подключенными устройствами. Для инициализации и разрешения канала, приложение должно выполнить следующие шаги:

1. Запрограммируйте регистр OTG_FS_GINTMSK, чтобы демаскировать следующее:

2. Прерывание канала.

– Прерывание опустошения не периодического FIFO передачи для транзакций OUT (применимо при работе на конвейерном уровне транзакции с полем подсчета пакетов, запрограммированным на более чем один пакет).
– Прерывание опустошения наполовину непериодического FIFO передачи для транзакций OUT (применимо при работе на конвейерном уровне транзакции с полем подсчета пакетов, запрограммированным на более чем один пакет).

3. Запрограммируйте регистр OTG_FS_HAINTMSK для демаскирования выбранных прерываний каналов.

4. Запрограммируйте регистр OTG_FS_HCINTMSK для демаскирования интересующих прерываний, связанных с транзакциями, заданных в регистре каналов прерываний хоста.

5. Запрограммируйте в регистр OTG_FS_HCTSIZx выбранных каналов общий размер транзакции, в байтах, и ожидаемое количество пакетов, включая короткие пакеты. Приложение должно запрограммировать поле PID начальным PID данных (для использования на первой транзакции OUT, или ожидаемым от первой транзакции IN).

6. Запрограммируйте регистр OTG_FS_HCCHARx выбранного канала характеристиками конечной точки устройства, такими как тип, скорость, направление, и т. д. (канал может быть разрешен установкой в 1 бита разрешения канала только когда приложение готово передавать или принимать какой-либо пакет).

Остановка (halt) канала. Приложение может запретить любой канал программированием регистра OTG_FS_HCCHARx с установкой в 1 бит CHDIS и CHENA. Это разрешает хосту OTG_FS сбросить (flush) выставленные запросы (если они есть) и сгенерировать прерывание остановки канала (channel halted interrupt). Приложение должно подождать прерывания CHH в OTG_FS_HCINTx перед повторным выделением канала для других транзакций. Хост OTG_FS не прерывает транзакции, которые уже запущены по USB.

Перед запретом канала приложение должно убедиться в наличии хотя бы одного свободного места в очереди не периодических запросов (когда запрещается не периодический канал) или в очереди периодических запросов (когда запрещается периодический канал). Приложение может просто сбросить (flush) выставленные запросы в очереди запросов (перед запретом канала) путем программирования регистра OTG_FS_HCCHARx с битом CHDIS, установленным в 1, и бита CHENA, очищенным в 0.

Ожидается, что приложение запрещает канал при любом из следующих условий:

1. Когда для канала IN или OUT получено прерывание STALL, TXERR, BBERR или DTERR в регистре OTG_FS_HCINTx. Приложение должно быть в состоянии принять другие прерывания (DTERR, Nak, Data, TXERR) на том же канале пред получением остановки (halt).

2. Когда получено прерывание DISCINT (Disconnect Device, отключение устройства) в регистре OTG_FS_GINTSTS (ожидается, что приложение запретит все разрешенные каналы).

3. Когда приложение обрывает транзакцию перед её нормальным завершением.

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

• Запись в передающий FIFO (TxFIFO)

Хост OTG_FS автоматически записывает элемент (запрос OUT) в очередь периодических / не периодических запросов, вместе с последним словом записи пакета. Приложение должно гарантировать, что доступно как минимум одна свободная ячейка в очереди периодических / не периодических запросов перед тем, как начать записывать в FIFO передачи. Приложение всегда должно записывать в FIFO слова (32-битный доступ). Если размер в байтах пакета не делится нацело на 4, то приложение должно дополнить пакет данными (обычно нулевыми, или заранее известного значения). Хост OTG_FS определяет реальный размер пакета, базируясь на запрограммированном максимальном размере пакета и размере транзакции.

STM32F4 OTG FS Transmit FIFO write task fig396

Рис. 396. Задача записи в TxFIFO.

Примечание: MPS Maximum packet size (максимальный размер пакета), LPS Last packet size (размер последнего пакета).

• Чтение FIFO приема (RxFIFO)

Приложение должно игнорировать все состояния пакета, отличающиеся от IN data packet (0010b).

STM32F4 OTG FS Receive FIFO read task fig397

Рис. 397. Задача чтения из RxFIFO.

• Транзакции bulk и control OUT/SETUP

Типовые конвейеризированные операции bulk или control OUT/SETUP на уровне транзакции показаны на рис 398. См. channel 1 (ch_1). Передается два пакета bulk OUT. Транзакция control SETUP работает так же, однако имеет только один пакет. Предположения следующие:

– Приложение пытается отправить 2 пакета максимального размера (размер транзакции transfer size = 1024 байта).
– Не периодический TxFIFO может хранить 2 пакета (128 байт для FS).
– Глубина очереди не периодических запросов = 4.

STM32F4 OTG FS normal bulk control OUT SETUP and bulk control IN fig398

Рис. 398. Нормальные транзакции bulk/control OUT/SETUP и bulk/control IN.

• Операции bulk и control OUT/SETUP

Последовательность операции (channel 1) следующая:

a) Инициализация канала 1 (channel 1).
b) Запись первого пакета для 1.
c) Вместе с записью последнего слова ядро записывает элемент в очередь не периодических запросов.
d) Как только не периодическая очередь окажется не пустой, ядро попытается отправить токен OUT в текущем фрейме.
e) Запись второго (последнего) пакета для channel 1.
f) Ядро генерирует прерывание XFRC, какт только последняя транзакция успешно завершится.
g) В ответ на прерывание XFRC производится отмена выделения канала для других транзакций.
h) Обработка не-ACK ответов.

В следующих примерах на псевдокоде показаны обработчики прерывания (interrupt service routine, ISR) для транзакций bulk и control OUT/SETUP.

• ISR для транзакций bulk/control OUT/SETUP и bulk/control IN

a) Bulk/Control OUT/SETUP

Демаскирование (NAK/TXERR/STALL/XFRC)
if (XFRC)
{
   Сброс счетчика ошибок
   Маскирование ACK
   Отмена выделения канала
}
else if (STALL)
{
   Transfer Done = 1
   Демаскирование CHH
   Запрет канала
}
else if (NAK or TXERR )
{
   Возврат указателей буфера (Rewind Buffer Pointers)
   Демаскирование CHH
   Запрет канала
   if (TXERR)
   {
      Инкремент счетчика ошибок
      Демаскирование ACK
   }
   else
   {
      Сброс счетчика ошибок
   }
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}

Приложение ожидает записи пакетов данных в TxFIFO, когда появится свободное место в TxFIFO и очереди запросов. Приложение может использовать прерывание NPTXFE в OTG_FS_GINTSTS, чтобы найти пространство в TxFIFO.

b) Bulk/Control IN

Демаскирование (TXERR/XFRC/BBERR/STALL/DTERR)
if (XFRC)
{
   Сброс счетчика ошибок
   Демаскирование CHH
   Запрет канала
   Сброс счетчика ошибок
   Маскирование ACK
}
else if (TXERR or BBERR or STALL)
{
   Демаскирование CHH
   Запрет канала
   if (TXERR)
   {
      Инкремент счетчика ошибок
      Демаскирование ACK
   }
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}
else if (DTERR)
{
   Сброс счетчика ошибок
}

Приложение ожидает записи запросов, когда появится место в очереди запросов, и пока не будет получено прерывание XFRC.

• Транзакции bulk и control IN

Типовые операции уровня транзакции для bulk или control IN показаны на рис. 399. See channel 2 (ch_2). Предположения следующие:

– Приложение пытается принять 2 пакета максимального размера (размер транзакции transfer size = 1024 байта).
– RxFIFO может содержать как минимум один пакет максимального размера и два слова статуса на пакет (72 байта для FS).
– Глубина очереди не периодических запросов = 4.

STM32F4 OTG FS bulk control IN transactions fig399

Рис. 399. Транзакции bulk/control IN.

Последовательность операций следующая:

a) Инициализация канала 2.
b) Установка бита CHENA в HCCHAR2 для записи запроса IN в очередь не периодических запросов.
c) Ядро пытается отправить токен IN после завершения текущей транзакции OUT.
d) Ядро генерирует прерывание RXFLVL, как только принятый пакет записан в RxFIFO.
e) В ответ на прерывание RXFLVL маскируется прерывание RXFLVL и считывается статус пакета, чтобы определить количество принятых байт, затем соответственно считывается RxFIFO. После этого демаскируется прерывание RXFLVL.
f) Ядро генерирует прерывание RXFLVL для элемента статуса завершения транзакции в RxFIFO.
g) Приложение должно прочитать и проигнорировать статус принятого пакета, если это не IN data packet (PKTSTS в GRXSTSR != 0010b).
h) Ядро генерирует прерывание XFRC, как только прочитан статус принятого пакета.
i) В ответ на прерывание XFRC запрещается канал и останавливается запись регистра OTG_FS_HCCHAR2 для будущих передач. Ядро записывает запрос запрета канала в очередь не периодических запросов как только записан регист OTG_FS_HCCHAR2.
j) Ядро генерирует прерывание RXFLVL, как только в RxFIFO записан статус останова (halt status).
k) Чтение и игнорирование статуса принятого пакета.
l) Ядро генерирует прерывание CHH, как только halt status извлекается из RxFIFO.
m) В ответ на прерывание CHH отменяется выделение канала для других транзакций.
n) Обработка ответов не-ACK.

• Транзакции управления (control transfer)

Стадии Setup, Data и Status транзакции управления должны быть выполнены как три отдельные транзакции. Транзакции OUT стадий Setup, Data или Status выполняются подобно транзакциям bulk OUT, описанным выше. Транзакции IN стадий Data или Status также выполняются подобно транзакциям bulk IN, описанным выше. Для всех трех стадий приложение ожидает установки значения Control в поле EPTYP регистра OTG_FS_HCCHAR1. Во время стадии Setup приложение ожидает установки значения SETUP в поле PID регистра OTG_FS_HCTSIZ1.

• Транзакции Interrupt OUT

Типовая операция interrupt OUT показана на рис. 400. Предположения следующие:

– Приложение пытается отправить один пакет в каждом фрейме (до одного пакета максимального размера), начиная с нечетного фрейма (transfer size = 1024 байта).
– Периодический TxFIFO может содержать 1 пакет (1 килобайт).
– Глубина очереди периодических запросов = 4.

STM32F4 OTG FS normal interrupt OUT IN transactions fig400

Рис. 400. Нормальные транзакции interrupt OUT/IN.

Последовательность операций следующая:

a) Инициализация и разрешение канала 1 (channel 1). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR1.
b) Запись первого пакета для channel 1.
c) Вместе с записью последнего слова каждого пакета хост OTG_FS записывает элемент в очередь периодических запросов.
d) Хост OTG_FS пытается отправить токен OUT в следующем (нечетном) фрейме.
e) Хост OTG_FS генерирует прерывание XFRC, как только был успешно передан последний пакет.
f) В ответ на прерывание XFRC канал переинициализируется для следующей транзакции.

• ISR для транзакций interrupt OUT/IN

a) Interrupt OUT

Демаскирование (NAK/TXERR/STALL/XFRC/FRMOR)
if (XFRC)
{
   Сброс счетчика ошибок
   Маскирование ACK
   Отмена выделения канала
}
else if (STALL or FRMOR)
{
   Маскирование ACK
   Демаскирование CHH
   Запрет канала
   if (STALL)
   {
      Transfer Done = 1
   }
}
else if (NAK or TXERR)
{
   Rewind Buffer Pointers
   Сброс счетчика ошибок
   Маскирование ACK
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала (in next b_interval - 1 Frame)
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}

Приложение использует прерывание NPTXFE в OTG_FS_GINTSTS, чтобы найти пространство в TxFIFO.

b) Interrupt IN

Демаскирование (NAK/TXERR/XFRC/BBERR/STALL/FRMOR/DTERR)
if (XFRC)
{
   Сброс счетчика ошибок
   Маскирование ACK
   if (OTG_FS_HCTSIZx.PKTCNT == 0)
   {
      Отмена выделения канала
   }
   else
   {
      Transfer Done = 1
      Демаскирование CHH
      Запрет канала
   }
}
else if (STALL or FRMOR or NAK or DTERR or BBERR)
{
   Маскирование ACK
   Демаскирование CHH
   Запрет канала
   if (STALL or BBERR)
   {
      Сброс счетчика ошибок
      Transfer Done = 1
   }
   else if (!FRMOR)
   {
      Сброс счетчика ошибок
   }
}
else if (TXERR)
{
   Инкремент счетчика ошибок
   Демаскирование ACK
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала (следующем b_interval - 1 /Frame)
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}

• Транзакции Interrupt IN

Предположения следующие:

– Приложение пытается принять один пакет (до одного пакета максимального размера) в каждом фрейме, начиная с нечетного (размер транзакции transfer size = 1024 байта).
– RxFIFO может хранить как минимум 1 пакет максимального размера и 2 слова статуса на пакет (1031 байт).
– Глубина очереди периодических запросов = 4.

• Нормальное функционирование interrupt IN

Последовательность операций следующая:

a) Инициализация канала 2 (channel 2). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR2.
b) Установка бита CHENA в регистре OTG_FS_HCCHAR2, чтобы записать запрос IN в очередь периодических запросов.
c) Хост OTG_FS записывает запрос IN в очередь периодических запросов для каждой записи регистра OTG_FS_HCCHAR2 с установленным битом CHENA.
d) Хост OTG_FS пытается отправить токен IN в следующем (нечетном) фрейме.
e) Как только принят пакет IN и записан в RxFIFO, хост OTG_FS генерирует прерывание RXFLVL.
f) В ответ на прерывание RXFLVL считывается статус принятого пакета, чтобы определить количество принятых байт, и соответственно происходит чтение RxFIFO. Приложение должно маскировать прерывание RXFLVL перед чтением RxFIFO, и демаскировать после полного чтения пакета.
g) Ядро генерирует прерывание RXFLVL для элемента завершения транзакции в RxFIFO. Приложение должно прочитать и проигнорировать статус принятого пакета, когда принятый статус пакета не соответствует IN data packet (PKTSTS в GRXSTSR != 0010b).
h) Ядро генерирует прерывание XFRC, как только прочитан статус принятого пакета.
i) В ответ на прерывание XFRC, считывается поле PKTCNT в регистре OTG_FS_HCTSIZ2. Если бит PKTCNT в регистре OTG_FS_HCTSIZ2 не равен 0, запрещается канал перед повторной инициализацией канала для следующей транзакции (если она есть). Если бит PKTCNT в регистре OTG_FS_HCTSIZ2 равен 0, переинициализируется канал для следующей транзакции. На этот раз приложение должно сбросить бит ODDFRM в регистре OTG_FS_HCCHAR2.

• Транзакции isochronous OUT

Типовая операция isochronous OUT показана на рис. 401. Предположения следующие:

– Приложение пытается отправить 1 пакет каждый фрейм (до одного пакета максимального размера), начиная с нечетного фрейма (размер транзакции transfer size = 1024 байта).
– Периодический TxFIFO может хранить один пакет (1 килобайт).
– Глубина очереди периодических запросов = 4.

Последовательность операций следующая:

a) Инициализация и разрешение канала 1 (channel 1). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR1.
b) Запись первого пакета для channel 1.
c) Вместе с записью последнего слова каждого пакета хост OTG_FS записывает элемент в очередь периодических запросов.
d) Хост OTG_FS пытается отправить токен OUT в следующем фрейме (нечетном).
e) Хост OTG_FS генерирует прерывание XFRC, как только был успешно передан последний пакет.
f) В ответ на прерывание XFRC канал переинициализируется для следующей транзакции.

g) Обработка не-ACK ответов.

STM32F4 OTG FS normal isochronous OUT IN transactions fig401

Рис. 401. Нормальные транзакции isochronous OUT/IN.

• ISR для транзакций isochronous OUT/IN

Пример кода для Isochronous OUT:

Демаскирование (FRMOR/XFRC)
if (XFRC)
{
   Отмена выделения канала
}
else if (FRMOR)
{
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   Отмена выделения канала
}

Пример кода для Isochronous IN:

Демаскирование (TXERR/XFRC/FRMOR/BBERR)
if (XFRC or FRMOR)
{
   if (XFRC и (OTG_FS_HCTSIZx.PKTCNT == 0))
   {
      Сброс счетчика ошибок
      Отмена выделения канала
   }
   else
   {
      Демаскирование CHH
      Запрет канала
   }
}
else if (TXERR or BBERR)
{
   Инкремент счетчика ошибок
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала
   }
}

• Транзакции isochronous IN

Предположения следующие:

– Приложение пытается принять один пакет (до одного пакета максимального размера) в каждом фрейме, начиная со следующего нечетного фрейма (размер транзакции transfer size = 1024 байта).
– RxFIFO может хранить как минимум один пакет максимального размера и 2 слова статуса на пакет (1031 байт).
– Глубина очереди периодических запросов = 4.

Последовательность операций следующая:

a) Инициализация канала 2 (channel 2). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR2.
b) Установка бита CHENA в регистре OTG_FS_HCCHAR2, чтобы записать запрос IN в очередь периодических запросов.
c) Хост OTG_FS записывает запрос IN в очередь периодических запросов для каждой записи регистра OTG_FS_HCCHAR2 с установленным битом CHENA.
d) Хост OTG_FS пытается отправить токен IN в следующем нечетном фрейме.
e) Как только принят и записан в RxFIFO пакет IN, хост OTG_FS генерирует прерывание RXFLVL.
f) В ответ на прерывание RXFLVL считывается статус принятого пакета, чтобы определить количество принятых байт, затем соответственно читается RxFIFO. Приложение должно маскировать прерывание RXFLVL перед чтением RxFIFO, и демаскировать его после чтения всего пакета.
g) Ядро генерирует прерывание RXFLVL для элемента статуса завершения транзакции в RxFIFO. Теперь приложение должно причитать и проигнорировать статус принятого пакета, когда он не соответствует IN data packet (биты PKTSTS в OTG_FS_GRXSTSR != 0010b).
h) Ядро генерирует прерывание XFRC, как только прочитан статус принятого пакета.
i) В ответ на прерывание XFRC считывается поле PKTCNT в регистре OTG_FS_HCTSIZ2. Если PKTCNT != 0 в регистре OTG_FS_HCTSIZ2, запрещается канал перед повторной инициализацией канала для следующей передачи, если она есть. Если PKTCNT = 0 в OTG_FS_HCTSIZ2, переинициализируется канал для следующей передачи. На этот раз приложение должно сбросить бит ODDFRM в регистре OTG_FS_HCCHAR2.

• Выбор глубины очереди

Тщательно выбирайте глубину очереди периодических и не периодических запросов, чтобы это соответствовало количеству периодических / не периодических конечных точек, к которым осуществляется доступ.

Глубина очереди непериодических запросов влияет на производительность не периодических транзакций. Чем глубже очередь (при условии достаточного пространства в FIFO), тем чаще ядро может запланировать конвейеризацию транзакций не периодических передач. Если размер очереди мал, то ядро может помещать в неё новые запросы только по мере освобождения ячеек в очереди.

Глубина очереди периодических запросов является критической для выполнения запланированных периодических транзакций. Выберите глубину периодической очереди на основе количества периодических передач, запланированных в микрофрейме. Если глубина периодической очереди меньше, чем периодические транзакции, запланированные в микрофрейме, то произойдет событие недогрузки фрейма (frame overrun).

• Обработка событий помехообразного сигнала (babble)

Контроллер OTG_FS обрабатывает 2 случая подобной ошибки: packet babble и port babble. Packet babble произойдет, если устройство отправило больше данных, чем максимальный размер пакета на канале. Port babble произойдет, если ядро продолжает получать данные от устройства на EOF2 (окончание фрейма 2, очень близко к SOF).

Когда контроллер OTG_FS детектирует packet babble, он прекращает записывать данные в буфер Rx, и ждет окончания пакета (end of packet, EOP). Когда контроллер определил EOP, он сбрасывает (flush) уже записанные в буфер Rx данные, и генерирует прерывание Babble.

Когда контроллер OTG_FS детектирует port babble, он сбрасывает (flush) RxFIFO и запрещает порт. Затем ядро генерирует прерывание запрета порта (Port disabled, бит HPRTINT в регистре OTG_FS_GINTSTS, бит PENCHNG в регистре OTG_FS_HPRT). При получении этого прерывания приложение должно определить, что оно произошло не из-за перегрузки по току (overcurrent condition, это еще одна причина прерывания Port Disabled) путем проверки POCA в регистре OTG_FS_HPRT, затем должно выполнить программный сброс (soft reset). Ядро не отправляет больше никаких токенов после того, как оно детектирует событие port babble.

[Модель программирования устройства USB]

Инициализация конечной точки при USB reset:

1. Установка бита NAK для всех конечных точек OUT: SNAK = 1 в регистре OTG_FS_DOEPCTLx (для всех конечных точек OUT, x это номер конечной точки).

2. Демаскирование следующих бит прерывания:

INEP0 = 1 в регистре OTG_FS_DAINTMSK (control 0 IN endpoint)
OUTEP0 = 1 в регистре OTG_FS_DAINTMSK (control 0 OUT endpoint)
STUP = 1, XFRC = 1 в регистре DOEPMSK
XFRC = 1, TOC = 1 в регистре DIEPMSK

3. Настройка Data FIFO RAM для каждого FIFO:

- Запрограммируйте регистр OTG_FS_GRXFSIZ, чтобы иметь возможность принять данные control OUT и данные setup. Если порог не разрешен, то на минимуме он должен быть равным 1 пакету максимального размера control endpoint 0 плюс 2 слова (для статуса пакета данных control OUT) плюс 10 слов (для пакетов setup).
– Запрограммируйте регистр OTG_FS_TX0FSIZ (в зависимости от выбранного количества FIFO), чтобы иметь возможность передавать данные control IN. Как минимум, это должно быть равно 1 пакету максимального размера control endpoint 0.

4. Запрограммируйте следующие поля в регистрах, относящихся к конечной точке control OUT endpoint 0, чтобы принять пакет SETUP: STUPCNT = 3 в регистре OTG_FS_DOEPTSIZ0 (чтобы принять до 3 пакетов back-to-back SETUP).

На этом этапе выполнена вся требуемая инициализация для приема пакетов SETUP.

Инициализация конечной точки по завершению энумерации:

1. На прерывании Enumeration Done (завершение энумерации, бит ENUMDNE в регистре OTG_FS_GINTSTS), прочитайте регистр OTG_FS_DSTS, чтобы определить скорость энумерации.

2. Запрограммируйте поле MPSIZ в регистре OTG_FS_DIEPCTL0, чтобы установить максимальный размер пакета. Этот шаг конфигурирует control endpoint 0. Максимальный размер пакета для control endpoint зависит от скорости энумерации.

На этом этапе устройство готово принять пакеты SOF и оно сконфигурировано для выполнения управляющих транзакций на control endpoint 0.

Инициализация конечной точки на команде SetAddress. Здесь описывается, что должно делать приложение, когда оно получает команду SetAddress в пакете SETUP.

1. Запрограммировать регистр OTG_FS_DCFG адресом устройства, полученным в команде SetAddress.
2. Запрограммировать ядро для отправки пакета IN статуса.

Инициализация конечной точки на команде SetConfiguration/SetInterface. Здесь описывается, что должно делать приложение, когда оно получает команду SetConfiguration или SetInterface в пакете SETUP.

1. Когда получена команда SetConfiguration, приложение должно запрограммировать регистры конечной точки, чтобы сконфигурировать в ней характеристики правильной конечной точки в новой конфигурации.

2. Когда принята команда SetInterface, приложение должно запрограммировать регистры конечной точки на тех конечных точках, на которые влияет команда установки интерфейса.

3. Некоторые конечные точки, которые были активными в предыдущей конфигурации или на альтернативной настройке, могут быть недопустимы в новой конфигурации, и тогда они должны быть деактивированы.

4. Демаскировать прерывание для каждой активной конечной точки, и замаскировать прерывания для всех не активных конечных точек в регистре OTG_FS_DAINTMSK.

5. Настроить Data FIFO RAM для каждого FIFO.

6. После того, как все требуемые конечные точки сконфигурированы, приложение должно запрограммировать ядро для отправки пакета status IN.

На этом этапе ядро устройства сконфигурировано для приема и передачи пакета данных любого типа.

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

1. Запрограммировать характеристики требуемой конечной точки в следующие поля регистра OTG_FS_DIEPCTLx (для конечных точек IN или двунаправленных конечных точек) или регистра OTG_FS_DOEPCTLx (для конечных точек OUT или двунаправленных конечных точек):

– максимальный размер пакета
– USB active endpoint = 1
– start data toggle (для конечных точек interrupt и bulk)
– Тип конечной точки
– номер TxFIFO

2. Как только конечная точка активирована, ядро начинает декодировать токены, адресованные этой конечной точке и отправлять правильное подтверждение (valid handshake) для каждого правильного токена этой конечной точки.

Деактивация конечной точки. Здесь описаны шаги, необходимые для деактивирования существующей конечной точки.

1. В деактивируемой конечной точке очистите бит USB active endpoint в регистре OTG_FS_DIEPCTLx (для конечных точек IN или двунаправленных конечных точек) или регистр OTG_FS_DOEPCTLx (для конечных точек OUT или двунаправленных конечных точек).

2. Как только конечная точка деактивирована, ядро игнорирует токены, адресуемые в эту конечную точку, что приводит к таймауту на USB.

Примечание: приложение должно удовлетворять следующим условиям для настройки ядра, чтобы обрабатывать трафик: должны быть очищены биты NPTXFEM и RXFLVLM в регистре OTG_FS_GINTMSK.

[Транзакции SETUP и data OUT]

В этой секции описан внутренний поток данных и операции на уровне приложения во время транзакций data OUT и транзакций SETUP.

• Чтение пакета

Здесь описывается, как читать пакеты (data OUT и SETUP) из RxFIFO.

1. При перехвате прерывания RXFLVL (в регистре OTG_FS_GINTSTS) приложение должно прочитать регистр выборки статуса приема (OTG_FS_GRXSTSP).

2. Приложение может маскировать прерывание RXFLVL (в регистре OTG_FS_GINTSTS) путем записи RXFLVL = 0 (в регистре OTG_FS_GINTMSK), пока оно не прочитает пакет из из RxFIFO.

3. Если количество байт принимаемого пакета не равно 0, то количество байт счетчика данных извлекается из принимаемого FIFO данных и сохраняется в памяти. Если количество байт принятого пакета равно 0, то данные не извлекаются из данных FIFO приема.

4. Считываемая информация статуса пакета RxFIFO показывает одно из следующего:

a) Глобальный шаблон OUT NAK: PKTSTS = Global OUT NAK, BCNT = 0x000, EPNUM = Don’t Care (0x0), DPID = Don’t Care (00b). Эти данные показывают, что вступил в силу бит global OUT NAK.

b) Шаблон пакета SETUP: PKTSTS = SETUP, BCNT = 0x008, EPNUM = Control EP Num, DPID = D0. Эти данные показывают, что в RxFIFO сейчас доступен для чтения пакет SETUP указанной конечной точки.

c) Шаблон завершения стадии настройки (setup stage done): PKTSTS = Setup Stage Done, BCNT = 0x0, EPNUM = Control EP Num, DPID = Don’t Care (00b).

Эти данные показывают, что завершена стадия Setup для указанной конечной точки, и началась стадия Data. После того, как этот элемент был выбран из RxFIFO, ядро выставит прерывание Setup на указанной конечной точке control OUT.

d) Шаблон пакета Data OUT: PKTSTS = DataOUT, BCNT = размер данных принятого пакета data OUT (0 ≤ BCNT ≤ 1024), EPNUM = номеру конечной точки, на которой пакет был принят, DPID = Actual Data PID.

e) Шаблон завершения транзакции данных: PKTSTS = Data OUT Transfer Done, BCNT = 0x0, EPNUM = номеру конечной точки OUT, на которой завершена транзакция данных, DPID = Don’t Care (00b).

Эти данные показывают, что была завершена транзакция OUT data для указанной конечной точки OUT. После того, как эта запись была извлечена из RxFIFO, ядро выставляет прерывание Transfer Completed на указанной конечной точке OUT.

5. После того, как полезная нагрузка данных была извлечена из RxFIFO, должно быть демаскировано прерывание RXFLVL (в регистре OTG_FS_GINTSTS).

6. Шаги 1–5 повторяются каждый раз, когда приложение детектирует установку линии прерывания из-за RXFLVL в OTG_FS_GINTSTS. Чтение пустого RxFIFO может привести к непредсказуемому поведению ядра.

Рис. 402 показывает алгоритм вышеописанной процедуры.

STM32F4 OTG FS Receive FIFO packet read fig402

Рис. 402. Чтение пакета из RxFIFO.

[Транзакции SETUP]

В этой секции описывается, как ядро обрабатывает пакеты SETUP и последовательность действий приложения для обработки транзакций SETUP.

• Требования приложения:

1. Чтобы принять пакет SETUP, должно быть запрограммировано в ненулевое значение поле STUPCNT (в регистре OTG_FS_DOEPTSIZx) контрольной точки control OUT. Когда приложение программирует поле STUPCNT в ненулевое значение, ядро принимает пакеты SETUP и записывает их в RxFIFO, независимо от статуса NAK и настройки бита EPENA в регистре OTG_FS_DOEPCTLx. Поле STUPCNT декрементируется всякий раз, когда управляющая конечная точка (control endpoint) получает пакет SETUP. Если поле STUPCNT не запрограммировано в правильное значение перед приемом пакета SETUP, ядро все еще принимает пакет SETUP и декрементирует поле STUPCNT, однако возможно, что приложение не сможет определить корректное количество принятых пакетов на стадии Setup транзакции управления.

STUPCNT = 3 в регистре OTG_FS_DOEPTSIZx

2. Приложение должно всегда выделять некоторое дополнительное пространство данных в RxFIFO, чтобы иметь возможность принять до 3 пакетов SETUP на конечной точке управления (control endpoint).

– Резервируемое пространство составляет 10 слов. 3 слова требуется для первого пакета SETUP, 1 слово требуется для завершения стадии Setup, и 6 слов для сохранения 2 дополнительных пакетов SETUP между всеми конечными точками управления.
– 3 слова на пакет SETUP требуются для сохранения 8 байт SETUP data и 4 байт статуса SETUP (шаблон пакета Setup). Ядро резервирует это пространство в RxFIFO данных чтобы записать только SETUP data, и никогда не использует это пространство для пакетов данных.

3. Приложение должно прочитать 2 слова пакета SETUP для RxFIFO.

4. Приложение должно прочитать из RxFIFO слово Setup stage done и отбросить его.

• Внутренний поток данных

1. Когда принят пакет SETUP, ядро записывает принятые данные в RxFIFO, без проверки доступного пространства в RxFIFO, и независимо от настроек бит NAK и STALL конечной точки. Ядро внутренне устанавливает биты IN NAK и OUT NAK для конечных точек control IN/OUT, на которых был принят пакет SETUP.

2. Для каждого пакета SETUP, принятого через USB, в RxFIFO записываются 3 слова данных, и поле STUPCNT декрементируется на 1.

– Первое слово содержит информацию управления, используемую внутри ядра.
– Второе слово содержит первые 4 байта команды SETUP.
– Третье слово содержит последние 4 байта команды SETUP.

3. Когда стадия Setup меняется на стадию Data IN/OUT, ядро записывает элемент (слово Setup stage done) в RxFIFO, показывая тем самым завершение стадии Setup.

4. На стороне AHB пакеты SETUP опустошаются (извлекаются) приложением.

5. Когда приложение извлекает слово Setup stage done из RxFIFO, срабатывает прерывание STUP (в регистре OTG_FS_DOEPINTx), показывая приложению, что оно может обработать принятый пакет SETUP. Ядро очищает бит разрешения конечной точки для конечных точек control OUT.

• Последовательность программирования приложения:

1. Программируется регистр OTG_FS_DOEPTSIZx: STUPCNT = 3.

2. Ожидание прерывания RXFLVL (в регистре OTG_FS_GINTSTS) и извлекаются пакеты данных из RxFIFO.

3. Срабатывание прерывания STUP (OTG_FS_DOEPINTx) помечает успешное завершение транзакции SETUP Data. На этом прерывании приложение должно прочитать регистр OTG_FS_DOEPTSIZx, чтобы определить количество принятых пакетов SETUP, и обработать последний принятый пакет SETUP.

STM32F4 OTG FS processing SETUP packet fig403

Рис. 403. Обработка пакета SETUP.

• Обработка более 3 пакетов back-to-back SETUP

В спецификации USB 2.0 определена нормальная ситуация, когда во время ошибки пакета SETUP, хост не посылает больше 3 пакетов back-to-back SETUP в одну и ту же конечную точку. Однако спецификация USB 2.0 не ограничивает количество пакетов back-to-back SETUP, которое хост может отправить в одну и ту же конечную точку. Когда имеет место это событие, контроллер OTG_FS генерирует прерывание (бит B2BSTUP в регистре OTG_FS_DOEPINTx).

• Установка глобального OUT NAK

Внутренний поток данных:

1. Когда приложение устанавливает Global OUT NAK (бит SGONAK в регистре OTG_FS_DCTL), ядро останавливает запись в RxFIFO данных, кроме пакетов SETUP. Независимо от от доступного пространства в RxFIFO, не изохронные токены OUT получают ответ отрицательного подтверждения NAK, и ядро игнорирует изохронные пакеты данных OUT.

2. Ядро записывает шаблон Global OUT NAK в RxFIFO. Приложение должно зарезервировать достаточно пространства в RxFIFO, чтобы записать этот шаблон данных.

3. Когда приложение извлекает шаблон Global OUT NAK из RxFIFO, ядро установит прерывание GONAKEFF (регистр OTG_FS_GINTSTS).

4. Как только приложение детектирует это прерывание, оно может предполагать, что ядро находится в режиме Global OUT NAK. Приложение может очистить это прерывание путем очистки бита в SGONAK в регистре OTG_FS_DCTL.

Последовательность программирования приложения:

1. Чтобы остановить прием любого вида данных в RxFIFO, приложение должно установить бит Global OUT NAK путем программирования поля: SGONAK = 1 в регистре OTG_FS_DCTL.

2. Ожидание прерывания GONAKEFF в регистре OTG_FS_GINTSTS. Когда это прерывание сработало, оно показывает, что ядро остановило прием любого типа данных, кроме пакетов SETUP.

3. Приложение может принимать правильные пакеты OUT после того, как оно установлено бит SGONAK в регистре OTG_FS_DCTL и перед тем, как ядро выставляет прерывание GONAKEFF (в регистре OTG_FS_GINTSTS).

4. Приложение может временно замаскировать это прерывание путем записи бита GINAKEFFM в регистре OTG_FS_GINTMSK: GINAKEFFM = 0.

5. Всякий раз, когда приложение готово выйти из режима Global OUT NAK, оно должно очистить бит SGONAK в регистре OTG_FS_DCTL. Это также очистит прерывание GONAKEFF (в регистре OTG_FS_GINTSTS): CGONAK = 1 в регистре OTG_FS_DCTL.

6. Если приложение ранее замаскировало это прерывание, то оно должно демаскировать его следующим образом: GINAKEFFM = 1 в регистре GINTMSK.

• Запрет конечной точки OUT

Приложение должно использовать следующую последовательность программирования приложения для запрета конечной точки OUT, которая была разрешена:

1. Перед запретом любой конечной точки OUT приложение должно разрешить в ядре режим Global OUT NAK: SGONAK = 1 в регистре OTG_FS_DCTL.

2. Ожидание прерывания GONAKEFF (регистр OTG_FS_GINTSTS).

3. Запрет требуемой конечной точки OUT путем программирования следующих полей в регистре OTG_FS_DOEPCTLx (x это номер конечной точки): EPDIS = 1, SNAK = 1.

4. Ожидание прерывания EPDISD (в регистре OTG_FS_DOEPINTx), которое показывает, что конечная точка OUT полностью запрещена. Когда выставлено прерывание EPDISD, ядро также очистит следующие биты в регистре OTG_FS_DOEPCTLx: EPDIS = 0, EPENA = 0.

5. Приложение должно очистить бит Global OUT NAK чтобы запустить прием данных и других не запрещенных конечных точек OUT: SGONAK = 0 в регистре OTG_FS_DCTL.

• Программирование остановки транзакции для конечных точек OUT

Приложение должно использовать следующую последовательность операций, чтобы остановить любые транзакции (из-за обрыва со стороны хоста, обычно из-за сброса):

1. Разрешение всех конечных точек OUT установкой EPENA = 1 во всех регистрах OTG_FS_DOEPCTLx.

2. Сброс (flush) RxFIFO следующим образом:

– Опрос OTG_FS_GRSTCTL.AHBIDL, пока он не установится в 1. Это покажет, что AHB master в состоянии ожидания (idle).
– Выполнение операции чтение-модификация-запись (read modify write) на OTG_FS_GRSTCTL.RXFFLSH = 1.
– Опрос OTG_FS_GRSTCTL.RXFFLSH, пока он не сбросится в 0, однако также используя таймаут менее 10 мс (соответствующий минимальной длительности сигнализации reset). Если 0 стал виден до таймаута, то RxFIFO был успешен. Если же произошел таймаут, когда все еще RXFFLSH == 1 (это может быть из-за того, что от хоста пришел пакет на EP0) то вернуться обратно (только однократно) на предыдущий шаг (выполнение операции чтение-модификация-запись).

3. Перед запретом любой конечной точки OUT, приложение должно разрешить в ядре режим Global OUT NAK, в соответствии с показанными выше инструкциями "Установка глобального OUT NAK". Это гарантирует, что данные в RxFIFO были успешно отправлены в приложение. Установка SGONAK = 1 в регистре OTG_FS_DCTL.

4. Ожидание прерывания GONAKEFF (в регистре OTG_FS_GINTSTS).

5. Запрет всех активных конечных точек OUT путем программирования следующих бит в регистре OTG_FS_DOEPCTLx: EPDIS = 1, SNAK = 1.

6. Ожидание прерывания EPDIS в регистре OTG_FS_DOEPINTx для каждой конечной точки OUT, запрограммированной на предыдущем шаге. Прерывание EPDIS показывает, что соответствующая конечная точка OUT полностью запрещена. Когда выставлено прерывание EPDIS, очищаются следующие биты в регистре OTG_FS_DOEPCTLx: EPENA = 0, EPDIS = 0, SNAK = 0.

• Традиционные (Generic) не изохронные транзакции данных OUT

В этой секции описаны обычные не изохронные транзакции OUT data (control, bulk или interrupt). Требования приложения:

1. Перед настройкой транзакции OUT приложение должно выделить буфер в памяти, чтобы туда поместились все данные, принятые как часть транзакции OUT.

2. Для пакетов OUT, поле размера транзакции в регистре размера транзакции конечной точки должно быть установлено кратным максимальному размеру пакета конечной точки, выровненным по границе слова (т. е. размер в байтах должен нацело делиться на 4):

transfer size[EPNUM] = n x (MPSIZ[EPNUM] + 4 – (MPSIZ[EPNUM] mod 4))
packet count[EPNUM] = n
n > 0

3. На любом прерывании конечной точки OUT приложение должно прочитать регистр размера транзакции конечной точки, чтобы вычислить размер полезной нагрузки в памяти. Принятый размер полезной нагрузки может быть меньше, чем запрограммированный размер транзакции.

– Размер полезной нагрузки в памяти = начальному размеру транзакции, запрограммированному приложением – обновленный ядром конечный размер транзакции.
– Количество пакетов USB, к которых была принята эта полезная нагрузка = начальному счетчику пакетов, запрограммированному приложением – обновленный ядром конечный счетчик пакетов.

Внутренний поток данных:

1. Приложение должно установить поля размера транзакции и счетчика пакетов в регистрах, специфических для конечной точки, очистить бит NAK, и разрешить конечную точку для приема данных.

2. Как только бит NAK очищен, ядро начинает принимать данные и записывать их в RxFIFO, пока есть место в RxFIFO. Для каждого пакета данных, принятого через USB, его данные и статус записываются в RxFIFO. Каждый пакет (пакет максимального размера или короткий пакет) записываемый в RxFIFO декрементирует на 1 поле счетчика пакетов для каждой конечной точки.

– Принятые пакеты данных OUT с неправильной CRC автоматически сбрасываются из RxFIFO.
– После отправки ACK для пакета через USB, ядро отбрасывает не изохронные пакеты данных OUT, к которым хост не смог определить ACK и отправил повторно. Приложение не детектирует несколько back-to-back пакетов данных OUT на одной и той же конечной точке с одним и тем же data PID. В этом случае счетчик пакетов не декрементируется.
– Если нет места в RxFIFO, изохронные и не изохронные пакеты данных игнорируются и не записываются в RxFIFO. Дополнительно не изохронные токены OUT получают ответ отрицательного подтверждения NAK.
– Во всех трех вышеприведенных случаях счетчик пакетов не декрементируется, потому что никакие данные не записаны в RxFIFO.

3. Когда счетчик пакетов становится равным 0, или когда на конечной точке принят короткий пакет, устанавливается бит NAK для этой конечной точки. Как только бит NAK установлен, изохронные и не изохронные пакеты данных игнорируются и не записываются в RxFIFO, и не изохронные токены OUT получают в ответ отрицательные подтверждения NAK.

4. После того, как данные были записаны в RxFIFO, приложение считывает данные из RxFIFO и записывает их во внешнюю память, по одному пакету на одну конечную точку.

5. По окончанию записи каждого пакета во внешнюю память через AHB, декрементируется размер транзакции для конечной точки на размер записанного пакета.

6. Шаблон завершения транзакции данных OUT для конечной точки записывается в RxFIFO при одном из следующих условий:

– Размер транзакции 0 и счетчик пакетов 0.
– Последний записанный пакет данных в RxFIFO это короткий пакет (0 ≤ размер пакета < максимальный размер пакета).

7. Когда приложение извлекает эту запись (транзакция данных OUT завершена), генерируется прерывание завершения транзакции для конечной точки, и очищается разрешение конечной точки.

Последовательность действий приложения:

1. Запрограммировать регистр OTG_FS_DOEPTSIZx размером транзакции и соответствующим счетчиком пакетов.

2. Запрограммировать регистр OTG_FS_DOEPCTLx характеристиками конечной точки, и установить в нем биты EPENA и CNAK: EPENA = 1, CNAK = 1.

3. Подождать прерывания RXFLVL (в регистре OTG_FS_GINTSTS) и извлечь пакеты из RxFIFO (опустошить стек приема). Этот шаг может быть повторен несколько раз, в зависимости от размера транзакции.

4. Выставление прерывания XFRC (в регистре OTG_FS_DOEPINTx) помечает успешное завершение не изохронной транзакции данных OUT.

5. Прочитать регистр OTG_FS_DOEPTSIZx, чтобы определить размер принятой полезной нагрузки данных.

• Традиционная (Generic) изохронная транзакция данных OUT

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

Требования приложения:

1. Все требования приложения для не изохронных транзакций данных OUT также применимы и к изохронным транзакциям данных OUT.

2. Для изохронных транзакций данных OUT поля размера транзакции и счетчика пакетов должны всегда быть установлены на максимальный размер пакета, которые могут быть приняты в одном фрейме и не более. Изохронные транзакции данных OUT не могут распространяться больше чем на 1 фрейм.

3. Приложение должно прочитать все изохронные пакеты данных OUT из RxFIFO (данные и статус) перед окончанием периодического фрейма (прерывание EOPF в регистре OTG_FS_GINTSTS).

4. Для приема данных в следующем фрейме должна быть разрешена изохронная конечная точка OUT после EOPF (OTG_FS_GINTSTS) и перед SOF (OTG_FS_GINTSTS).

Внутренний поток данных:

1. Внутренний поток данных для изохронных конечных точек OUT тот же самый, что и для не изохронных конечных точек OUT, но с некоторыми отличиями.

2. Когда изохронная конечная точка разрешена установкой бита Endpoint Enable и очисткой бита NAK, также соответственно должен быть установлен бит четного/нечетного фрейма (Even/Odd frame). Ядро принимает данные на изохронной конечной точке OUT только в отдельном фрейме, если удовлетворяется условие: EONUM (в регистре OTG_FS_DOEPCTLx) = SOFFN[0] (в регистре OTG_FS_DSTS).

3. Когда приложение полностью прочитало пакет данных isochronous OUT (данные и статус) из RxFIFO, ядро обновляет поле RXDPID в регистре OTG_FS_DOEPTSIZx значением data PID последнего изохронного пакета данных OUT, прочитанного из RxFIFO.

Последовательность действий приложения:

1. Запрограммировать регистр OTG_FS_DOEPTSIZx размером транзакции и соответствующим счетчиком пакетов.

2. Запрограммировать регистр OTG_FS_DOEPCTLx характеристиками конечной точки и установить в нем биты Endpoint Enable, ClearNAK и Even/Odd frame (четный/нечетный фрейм): EPENA = 1, CNAK=1, EONUM = (0: четный/1: нечетный).

3. Подождать прерывание RXFLVL (в регистре OTG_FS_GINTSTS) и выбрать пакеты данных из RxFIFO (опустошить стек приема). Этот шаг может быть повторен несколько раз, в зависимости от размера транзакции.

4. Выставляется прерывание XFRC (в регистре OTG_FS_DOEPINTx), что помечает завершение изохронной транзакции данных OUT. Это прерывание не обязательно означает, что данные в памяти хорошие.

5. Это прерывание не всегда может быть детектировано для изохронных транзакций OUT. Вместо этого приложение может детектировать прерывание IISOOXFRM в регистре OTG_FS_GINTSTS.

6. Прочитать регистр OTG_FS_DOEPTSIZx, чтобы определить размер принятой транзакции, и определить целостность принятых во фрейме данных. Приложение должно обработать принятые данные в памяти как достоверные, только если удовлетворяется одно из следующих условий:

– RXDPID = D0 (в регистре OTG_FS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 1.
– RXDPID = D1 (в регистре OTG_FS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 2.
– RXDPID = D2 (в регистре OTG_FS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 3.

Количество пакетов USB, в которых была принята эта полезная нагрузка = начальному счетчику пакетов, запрограммированному приложением – обновленному ядром конечному счетчику пакетов.

Приложение может отбросить неправильные пакеты данных.

• Незавершенные изохронные транзакции данных OUT

Эта секция описывает последовательность действий приложения, когда изохронные пакеты данных OUT отбрасываются внутри ядра.

Внутренний поток данных:

1. Для изохронных конечных точек OUT не всегда может быть выставлено прерывание XFRC (в регистре OTG_FS_DOEPINTx). Если ядро отбросит изохронные пакеты данных OUT, приложение может не определить прерывание XFRC в следующих условиях:

– Когда RxFIFO не может принять полный пакет данных ISO OUT, ядро отбрасывает принятые данные ISO OUT.
– Когда принят изохронный пакет данных OUT с ошибками CRC.
– Когда поврежден принятый ядром изохронный токен OUT.
– Когда приложение очень медленно читает данные из RxFIFO.

2. Когда ядро детектирует окончание периодического фрейма перед завершением транзакции для всех изохронных конечных точек OUT, оно выставляет прерывание незавершенных изохронных данных OUT (бит IISOOXFRM в регистре OTG_FS_GINTSTS). Это показывает, что прерывание XFRC (в регистре OTG_FS_DOEPINTx) не выставлено на по крайней мере одной из изохронных конечных точках OUT. В этот момент конечная точка с незавершенной транзакцией остается разрешенной, но на USB активные транзакции на этой конечной точке не выполняются.

Последовательность действий приложения:

1. Выставление прерывания IISOOXFRM (в регистре OTG_FS_GINTSTS) показывает, что в текущем фрейме как минимум одна изохронная конечная точка OUT имеет незавершенную транзакцию.

2. Если это произошло из-за того, что изохронные данные OUT не были полностью извлечены из конечной точки, приложение должно гарантировать, что перед продолжением извлекло из RxFIFO все относящееся к изохронным конечным точкам OUT (их данные и статус). Когда все данные извлечены из RxFIFO, приложение может детектировать прерывание XFRC (в регистре OTG_FS_DOEPINTx). В этом случае приложение должно заново разрешить конечную точку для приема изохронных данных OUT в следующем фрейме.

3. Когда получено прерывание IISOOXFRM (в регистре OTG_FS_GINTSTS), прерывание должно прочитать регистры управления всех изохронных конечных точек OUT (в регистре OTG_FS_GINTSTS), чтобы определить, у какой конечной точки есть незавершенная транзакция в текущем микрофрейме. Транзакция конечной точки незавершенная, если удовлетворены оба следующих условия:

– бит EONUM (в регистре OTG_FS_DOEPCTLx) = SOFFN[0] (в регистре OTG_FS_DSTS).
– бит EPENA = 1 (в регистре OTG_FS_DOEPCTLx).

4. Предыдущий шаг может быть повторен перед детектированием прерывания SOF (в регистре OTG_FS_GINTSTS), чтобы гарантировать, что текущий номер фрейма не поменялся.

5. Для изохронных конечных точек OUT с незавершенными транзакциями приложение должно отбросить данные в памяти и запретить конечную точку установкой бита EPDIS в регистре OTG_FS_DOEPCTLx.

6. Подождать прерывания EPDIS (в регистре OTG_FS_DOEPINTx) и разрешить конечную точку для приема новых данных в следующем фрейме. Из-за того, что приложению нужно некоторое время для запрета конечной точки, приложение может не получить данные в следующем фрейме после приема неправильных изохронных данных.

• Приостановка (stalling) не изохронных конечных точек OUT

Эта секция описывает, как приложение может приостановить (stall) не изохронную конечную точку.

1. Поместить ядро в режим глобального отрицательного подтверждения (Global OUT NAK mode).

2. Запретить нужную конечную точку. Когда конечная точка запрещается, вместо установки бита SNAK в регистре OTG_FS_DOEPCTL нужно установить STALL = 1 (в регистре OTG_FS_DOEPCTL). Бит STALL всегда имеет приоритет перед битом NAK.

3. Когда приложение готово завершить подтверждение приостановки (STALL handshake) для конечной точки, бит STALL (в регистре OTG_FS_DOEPCTLx) должен быть очищен.

4. Если приложение устанавливает или очищает STALL для конечной точки из-за команды SetFeature.Endpoint Halt или ClearFeature.Endpoint Halt, бит STALL должен быть установлен или очищен перед тем, как приложение настроит транзакцию стадии Status на конечной точке управления (control endpoint).

[Примеры]

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

• Транзакция Bulk OUT

На рис. 404 показан прием одиночного пакета Bulk OUT Data через USB и передача его на AHB, и описываются события, возникающие при этом процессе.

STM32F4 OTG FS Bulk OUT transaction fig404

Рис. 404. Транзакция Bulk OUT.

После команды SetConfiguration/SetInterface, приложение инициализирует все конечные точки OUT установкой CNAK = 1 и EPENA = 1 (в регистре OTG_FS_DOEPCTLx), и устанавливает подходящие значения XFRSIZ и PKTCNT в регистре OTG_FS_DOEPTSIZx.

1. Хост пытается отправить данные (токен OUT) в конечную точку.

2. Когда ядро принимает токен OUT через USB, оно сохраняет пакет в RxFIFO, потому что там есть свободное место.

3. После записи полного пакета в RxFIFO, ядро выставляет прерывание RXFLVL (в регистре OTG_FS_GINTSTS).

4. При приеме PKTCNT количества USB-пакетов ядро внутри себя установит бит NAK для этой конечной точки, чтобы предотвратить прием любых дополнительных пакетов.

5. Приложение обрабатывает прерывание и вычитывает данные из RxFIFO.

6. Когда приложение прочитало все данные (эквивалентно размеру транзакции XFRSIZ), ядро генерирует прерывание XFRC (в регистре OTG_FS_DOEPINTx).

7. Приложение обрабатывает прерывание и использует установку бита прерывания завершения транзакции XFRC (в регистре OTG_FS_DOEPINTx) чтобы определить, что предполагаемая транзакция завершена.

Транзакции данных IN

• Запись пакета

В этой секции описывается, как приложение записывает пакет данных в FIFO конечной точки, когда разрешены выделенные TxFIFO.

1. Приложение может выбрать либо режим опроса состояния (polling), либо режим прерываний.

- В режиме опроса приложение отслеживает статус данных TxFIFO конечной точки путем чтения регистра OTG_FS_DTXFSTSx, чтобы определить, есть ли доступное место для данных в TxFIFO.
– В режиме прерываний приложение ждет прерывания TXFE (в регистре OTG_FS_DIEPINTx), и затем читает регистр OTG_FS_DTXFSTSx, чтобы определить наличие достаточного места в TxFIFO.
– Чтобы записать один пакет данных ненулевой длины (non-zero length data packet), в TxFIFO данных должно быть место для записи пакета полностью.
– Чтобы записать пакет нулевой длины (zero length packet) приложение не должно смотреть на свободное место в FIFO.

2. Используя один из вышеупомянутых методов, когда приложение определяет, что есть достаточно места для записи передаваемого пакета, одно должно сначала записать регистр управления конечной точки перед записью данных в FIFO. Обычно приложение должно выполнить операцию чтение-модификация-запись на регистре OTG_FS_DIEPCTLx, чтобы избежать любой модификации содержимого этого регистра, кроме установки бита Endpoint Enable.

Приложение может записать в TxFIFO несколько пакетов для одной и той же конечной точки, если для этого есть место. Для периодических конечных точек IN, приложение должно записать пакеты только для одного микрофрейма. Оно может записать пакеты для следующей периодической транзакции только после получения информации о завершении предыдущей транзакции.

• Установка NAK конечной точки IN

Внутренний поток данных:

1. Когда приложение устанавливает IN NAK для определенной конечной точки, ядро останавливает передачу данных на этой конечной точке, независимо от доступности данных в TxFIFO конечной точки.

2. Не изохронные токены IN получают в ответ отрицательное подтверждение NAK. Изохронные токены IN получают в ответ пакеты нулевой длины (zero-data-length packet).

3. Ядро выставляет прерывание INEPNE (IN endpoint NAK effective) в регистре OTG_FS_DIEPINTx в ответ на бит SNAK в регистре OTG_FS_DIEPCTLx.

4. Как только приложение увидел это прерывание, приложение может предполагать, что эта конечная точка IN находится в режиме отрицательных подтверждений (IN NAK mode). Это прерывание может быть очищено приложением установкой бита CNAK в регистре OTG_FS_DIEPCTLx.

Последовательность действий приложения:

1. Для остановки передачи любых данных в определенную конечную точку IN, приложение должно установить бит IN NAK. Для установки этого бита в регистре OTG_FS_DIEPCTLx должен быть установлен бит SNAK = 1.

2. Ожидание выставления прерывания INEPNE в регистре OTG_FS_DIEPINTx. Это прерывание показывает, что ядро остановило передачу данных на этой конечной точке.

3. Ядро может передать правильные данные IN на конечной точке после установки приложением бита NAK, но перед выставлением прерывания NAK Effective.

4. Приложение может временно замаскировать (запретить) это прерывание записью бита INEPNEM в регистре DIEPMSK: INEPNEM = 0.

5. Чтобы выйти из режима Endpoint NAK, приложение дожно очистить бит статуса NAK (NAKSTS) в регистре OTG_FS_DIEPCTLx (CNAK = 1). Это также очистит прерывание INEPNE (в регистре OTG_FS_DIEPINTx).

6. Если приложение ранее замаскировало это прерывание, то оно должно демаскировать его следующим образом: INEPNEM = 1 в регистре DIEPMSK.

• Разрешение конечной точки IN.

Используйте следующий алгоритм для запрета определенной конечной точки IN, которая была ранее разрешена.

Последовательность действий приложения:

1. Приложение должно прекратить записывать данные на AHB для запрещаемой конечной точки IN.

2. Приложение дожно установить конечную точку в режим NAK: SNAK = 1 в регистре OTG_FS_DIEPCTLx.

3. Подождать прерывания INEPNE в регистре OTG_FS_DIEPINTx.

4. Установить следующие биты в регистре OTG_FS_DIEPCTLx конечной точки, которая должна быть запрещена: EPDIS = 1, SNAK = 1.

5. Выставление прерывания EPDISD в регистре OTG_FS_DIEPINTx покажет, что ядро полностью запретило указанную конечную точку. Вместе с выставлением этого прерывания также ядро очистит следующие биты в регистре OTG_FS_DIEPCTLx: EPENA = 0, EPDIS = 0.

6. Приложение должно прочитать регистр OTG_FS_DIEPTSIZx для периодической конечной точки IN, чтобы вычислить, сколько данных на конечной точке было передано через USB.

7. Приложение должно сбросить (flush) данные в TxFIFO конечной точки, путем установки следующих полей в регистре OTG_FS_GRSTCTL: TXFNUM = номеру TxFIFO конечной точки, TXFFLSH = 1.

Приложение должно опрашивать регистр OTG_FS_GRSTCTL, пока ядром не будет очищен бит TXFFLSH, что показывает окончание операции сброса данных (flush). Теперь для передачи новых данных на этой конечной точке приложение должно заново разрешить эту конечную точку.

• Программирование остановки транзакции для конечных точек IN

Приложение должно использовать следующую последовательность программирования для остановки любых транзакций (из-за обрыва со стороны хоста, обычно сброса).

Последовательность операций:

1. Запрет конечной точки IN установкой EPDIS = 1 во всех регистрах OTG_FS_DIEPCTLx.

2. Подождать прерывание EPDIS в регистре OTG_FS_DIEPINTx, которое показывает, что конечная точка IN полностью запрещена. Когда прерывание EPDIS выставлено, очищаются следующие биты в регистре OTG_FS_DIEPCTLx: EPDIS = 0, EPENA = 0.

3. Сбросить TxFIFO программированием следующих бит в регистре OTG_FS_GRSTCTL: TXFFLSH = 1, TXFNUM = номер FIFO, специфический для конечной точки.

4. Приложение может начать опрос регистра OTG_FS_GRSTCTL, пока в нем не сбросится бит TXFFLSH. Когда этот бит очистится, то это гарантирует, что в TxFIFO не осталось данных.

Обычные не периодические транзакции данных IN

Требования приложения:

1. Перед запуском транзакции IN, приложение должно гарантировать, что все данные для передачи как часть транзакции IN, были частью одного буфера.

2. Для транзакций IN, поле размера транзакции (Transfer Size) в регистре размера транзакции конечной точки обозначает полезную нагрузку, которая состоит из нескольких пакетов максимального размера и одного короткого пакета. Этот короткий пакет передается как сигнал окончания транзакции.

– Для передачи нескольких пакетов максимального размера и короткого пакета для окончания транзакции: Transfer size[EPNUM] = n x MPSIZ[EPNUM] + sp. Если (sp > 0), то Packet count[EPNUM] = n + 1. Иначе Packet count[EPNUM] = n.
– Для передачи одного пакета нулевой длины (zero-length data packet): Transfer size[EPNUM] = 0, Packet count[EPNUM] = 1.
– Для передачи нескольких пакетов максимальной длины и пакета нулевой длины в конце транзакции, приложение должно разделить транзакцию на 2 части. В первой части отправляются пакеты максимальной длины, и во второй части отправляется один пакет нулевой длины. Первая часть транзакции: transfer size[EPNUM] = n x MPSIZ[epnum]; packet count = n. Вторая часть транзакции: transfer size[EPNUM] = 0; packet count = 1;

3. Как только конечная точка разрешена для транзакций данных, ядро обновит регистр размера транзакции. По окончании транзакции IN приложение должно прочитать регистр размера транзакции, чтобы определить, сколько данных, которые были помещены в TxFIFO, были уже переданы через USB.

4. Данные, взятые в TxFIFO = (transfer size, изначально запрограммированный приложением – обновленный ядром конечный transfer size).

- Данные, переданные через USB = (packet count, изначально запрограммированный приложением – обновленный ядром конечный packet count) x MPSIZ[EPNUM].
– Данные, еще не переданные через USB = (transfer size, изначально запрограммированный приложением – данные, переданные через USB).

Внутренний поток данных:

1. Приложение должно установить поля размера транзакции и счетчика пакетов в регистрах, специфичных для конечной точки, и разрешить конечную точку для передачи данных.

2. Приложение должно также записать требуемые данные в TxFIFO этой конечной точки.

3. Каждый раз, когда пакет записан приложением в TxFIFO, размер транзакции для этой конечной точки декрементируется на размер пакета. Данные, извлекаются из памяти приложением до тех пор, пока размер транзакции для конечной точки не станет равным 0. После записи данных в FIFO, счетчик "количества пакетов в FIFO" инкрементируется (это 3-разрядный счетчик, внутренне поддерживаемый ядром для каждого TxFIFO конечной точки IN. Максимальное количество пакетов, всегда поддерживаемых ядром в FIFO конечной точки IN, равно 8). Для пакетов нулевой длины для каждого FIFO устанавливается отдельный флаг, без каких-либо данных в FIFO.

4. Как только данные были записаны в TxFIFO, ядро считывает их при получении от хоста токена IN. Для каждого не изохронного пакета данных IN, переданного с положительным подтверждением ACK, счетчик пакетов декрементируется на 1, пока счетчик пакетов не достигнет 0. Счетчик пакетов не декрементируется при таймауте.

5. Для пакетов нулевой длины (показанных внутренним флагом zero length), ядро отправляет пакет нулевой длины (zero-length packet) для токена IN, и декрементирует поле счетчика пакетов.

6. Если нет данных в FIFO для принятого токена IN и поле счетчика пакетов для этой конечной точки равно 0, ядро генерирует прерывание "получен токен IN, когда TxFIFO пуст" (ITTXFE) для этой конечной точки. Это прерывание предоставляется, когда бит NAK конечной точки не установлен. Ядро отвечает отрицательным подтверждением NAK для не изохронных конечных точек на USB.

7. Ядро внутри себя возвращает указатели FIFO в начальное состояние, и не генерирует прерывание таймаута.

8. Когда размер транзакции (transfer size) равен 0, и счетчик пакетов (packet count) также равен 0, для конечной точки генерируется прерывание завершения транзакции (transfer complete, XFRC), и очищается разрешение конечной точки.

Последовательность действий приложения:

1. Запрограммировать регистр OTG_FS_DIEPTSIZx размером транзакции (transfer size) и соответствующим счетчиком пакетов (packet count).

2. Запрограммировать регистр OTG_FS_DIEPCTLx характеристиками конечной точки и установить биты CNAK и EPENA (Endpoint Enable).

3. Когда передается пакет не нулевой длины, приложение должно опрашивать регистр OTG_FS_DTXFSTSx (здесь x это номер FIFO, связанный с этой конечной точкой), чтобы определить, есть ли достаточно места в FIFO данных. Приложение может опционально использовать TXFE (в регистре OTG_FS_DIEPINTx) перед записью данных.

Обычные периодические транзакции данных IN

Эта секция описывает типичные периодические транзакции данных IN.

Требования приложения:

1. Требования приложения 1, 2, 3 и 4 обычных не периодических транзакций IN (см. выше "Обычные не периодические транзакции данных IN") также применяются и для периодических транзакций данных IN, с незначительными модификациями требования 2.

– Приложение может передать только несколько пакетов максимального размера, или несколько пакетов максимального размера плюс короткий пакет в конце. Для передачи нескольких пакетов максимального размера плюс короткий пакет в конце транзакции, должны быть удовлетворены следующие условия: transfer size[EPNUM] = n x MPSIZ[EPNUM] + sp (здесь n это целое число => 0, и 0 ≤ sp < MPSIZ[EPNUM]). Если (sp > 0), packet count[EPNUM] = x + 1, иначе packet count[EPNUM] = n. Также должно выполняться MCNT[EPNUM] = packet count[EPNUM].
– Приложение не может передать пакет данных нулевой длины в конце транзакции. Оно может отправить один пакет нулевой длины отдельно. Для передачи одного пакета данных нулевой длины: transfer size[EPNUM] = 0, packet count[EPNUM] = 1, MCNT[EPNUM] = packet count[EPNUM].

2. Приложение может планировать передачу данных только по одному фрейму за раз.

– (MCNT – 1) x MPSIZ ≤ XFERSIZ ≤ MCNT x MPSIZ
– PKTCNT = MCNT (в регистре OTG_FS_DIEPTSIZx)
– Если XFERSIZ < MCNT x MPSIZ, то последний пакет данных транзакции это короткий пакет.

Имейте в виду, что поле MPSIZ находится в регистре OTG_FS_DIEPCTLx, а поля MCNT, PKTCNT и XFERSIZ в регистре OTG_FS_DIEPTSIZx.

3. Полностью передаваемые во фрейме данные должны быть записаны приложением в TxFIFO перед получением токена IN. Даже когда 1 слово данных для передачи пропущено в TxFIFO, когда получен токен IN, ядро ведет себя как если бы TxFIFO был пуст. Когда TxFIFO пуст:

– Для изохронных конечных точек IN через USB передается пакет нулевой длины.
– Для конечных точек interrupt IN передается отрицательное подтверждение NAK.

Внутренний поток данных:

1. Приложение должно установить поля размера транзакции и счетчика пакетов в регистрах, относящихся к конечным точкам, и разрешить конечную точку для для передачи данных.

2. Приложение должно также записать требуемые данные в TxFIFO, связанный с конечной точкой.

3. Каждый раз, когда приложение записывает пакет в TxFIFO, размер транзакции для этой конечной точки декрементируется на размер пакета. Данные извлекаются из памяти приложения до тех пор, пока размер транзакции для конечной точки не станет равным 0.

4. Когда токен IN принимается для периодической конечной точки, ядро передает данные в TxFIFO, если они доступны. Если полная полезная нагрузка данных (пакет целиком, в режиме выделенного FIFO) для фрейма не присутствует в TxFIFO, то ядро генерирует для конечной точки прерывание получения токена IN, когда TxFIFO пуст.

– Для изохронных конечных точек IN через USB передается пакет нулевой длины.
– Для конечных точек interrupt IN через USB передается отрицательное подтверждение NAK.

5. Счетчик пакетов для конечной точки декрементируется на 1 в следующих условиях:

– Для изохронных конечных точек, когда передается пакет данных нулевой или не нулевой длины.
– Для конечных точек interrupt IN, когда передается положительное подтверждение ACK.
– Когда и размер транзакции (transfer size), и счетчик пакетов (packet count) оба равны 0, для конечной точки генерируется прерывание завершения транзакции, и разрешение конечной точки очищается.

6. На интервале периодического фрейма (Periodic frame Interval, управляемого PFIVL в регистре OTG_FS_DCFG), когда ядро обнаруживает любой не пустой FIFO конечной точки isochronous IN, запланированной для текущего фрейма, ядро генерирует прерывание IISOIXFR в регистре OTG_FS_GINTSTS.

Последовательность действий приложения:

1. Запрограммировать OTG_FS_DIEPCTLx регистр характеристиками конечной точки, и установить биты CNAK и EPENA.

2. Записать в TxFIFO данные для передачи в следующем фрейме.

3. Выставление прерывания ITTXFE (в регистре OTG_FS_DIEPINTx) показывает, что приложение пока не записало в TxFIFO все данные для передачи.

4. Если конечная точка interrupt IN уже разрешена, когда прерывание детектировано, то это прерывание должно быть проигнорировано. Если оно не разрешена, то разрешить конечную точку, чтобы данные могли быть переданы на следующей попытке получения токена IN.

5. Выставление прерывания XFRC (в регистре OTG_FS_DIEPINTx) без прерывания ITTXFE в регистре OTG_FS_DIEPINTx показывает успешное завершение изохронной транзакции IN. Чтение регистра OTG_FS_DIEPTSIZx должно дать transfer size = 0 и packet count = 0, что покажет передачу всех данных через USB.

6. Выставление прерывания XFRC (в регистре OTG_FS_DIEPINTx), с прерыванием ITTXFE или без него (бит ITTXFE в регистре OTG_FS_DIEPINTx) показывает успешное завершение транзакции interrupt IN. Чтение регистра OTG_FS_DIEPTSIZx должно дать transfer size = 0 и packet count = 0, что показывает передачу всех данных через USB.

7. Выставление прерывания незавершенной транзакции isochronous IN (IISOIXFR) в регистре OTG_FS_GINTSTS ни с одним из вышеупомянутых прерываний показывает, что ядро не приняло как минимум 1 периодический токен IN в текущем фрейме.

• Незавершенные изохронные транзакции данных IN

В этой секции описывается, что должно делать приложение на незавершенной транзакции данных isochronous IN.

Внутренний поток данных:

1. Изохронная транзакция IN считается незавершенной, если присутствует одно из следующих условий:

a) Ядро приняло поврежденный токен isochronous IN на как минимум одной конечной точке isochronous IN. В этом случае приложение детектирует прерывание незавершенной изохронной транзакции IN (IISOIXFR в регистре OTG_FS_GINTSTS).
b) Приложение слишком медленно записывает данные полезной нагрузки в TxFIFO, и токен IN был принят до того, как вся полезная нагрузка была записана в TxFIFO. В этом случае приложение детектирует прерывание получения токена IN при пустом TxFIFO в регистре OTG_FS_DIEPINTx. Приложение может игнорировать это прерывание, поскольку это в конечном счете приводит к прерыванию незавершенной транзакции isochronous IN (бит IISOIXFR в регистре OTG_FS_GINTSTS) по окончанию периодического фрейма.

Ядро передает через USB пакет нулевой длины в ответ на принятый токен IN.

2. Приложение должно прекратить запись данных полезной нагрузки в TxFIFO, как только это становится возможным.

3. Приложение должно установить бит NAK и бит запрета для конечной точки.

4. Ядро запрещает конечную точку, очищает бит запрета, и выставляет прерывание Endpoint Disable для этой конечной точки.

Последовательность действий приложения:

1. Приложение может игнорировать принятый токен IN, когда на любой изохронной конечной точке IN есть прерывание пустого TxFIFO в регистре OTG_FS_DIEPINTx, поскольку в конечном итоге это приведет к прерыванию неполной isochronous IN транзакции (в регистре OTG_FS_GINTSTS).

2. Выставление прерывания неполной изохронной транзакции IN (в регистре OTG_FS_GINTSTS) показывает незавершенную транзакцию isochronous IN на как минимум одной изохронной конечной точке IN.

3. Приложение должно прочитать регистр управления конечной точкой для всех изохронных конечных точек IN, чтобы определить конечные точки с незавершенными транзакциями данных IN.

4. Приложение должно прекратить записывать данные в периодические TxFIFO, связанные с этими конечными точками на AHB.

5. Для запрета конечной точки запрограммировать следующие поля в регистре OTG_FS_DIEPCTLx: SNAK = 1, EPDIS = 1.

6. Выставление прерывания Endpoint Disabled в регистре OTG_FS_DIEPINTx показывает, что ядро запретило конечную точку. В этот момент приложение должно сбросить (flush) данные в связанном TxFIFO, или перезаписать существующие данные в FIFO путем разрешения конечной точки для новой транзакции в следующем микрофрейме. Чтобы сбросить (flush) данные, приложение должно использовать регистр OTG_FS_GRSTCTL.

• Приостановка (stalling) не изохронных конечных точек IN

Эта секция описывает, как приложение должно приостановить (stall) не изохронную конечную точку.

Последовательность действий приложения:

1. Запретить конечную точку IN, которая должна быть приостановлена. Также установить бит STALL.

2. EPDIS = 1 в регистре OTG_FS_DIEPCTLx, когда конечная точка уже разрешена. STALL = 1 в регистре OTG_FS_DIEPCTLx. Бит STALL всегда имеет приоритет над битом NAK.

3. Выставление прерывания Endpoint Disabled (в регистре OTG_FS_DIEPINTx) покажет приложению, что ядро запретило указанную конечную точку.

4. Приложение должно сбросить не периодический или периодический TxFIFO, в зависимости от типа конечной точки. В случае не периодической конечной точки для передачи данных приложение должно заново разрешить другие не периодические конечные точки, которые не нужно останавливать.

5. Всякий раз, когда приложение готово прекратить отправлять подтверждения STALL на конечной точке, оно должно очистить бит STALL в регистре OTG_FS_DIEPCTLx.

6. Если приложение установит или очистит бит STALL для конечной точки из-за команды SetFeature.Endpoint Halt или ClearFeature.Endpoint Halt, бит STALL должен быть установлен или очищен перед тем, как приложение настроит стадию Status транзакции на конечной точке управления (control endpoint).

Специальный случай: приостановка (stall) конечной точки control OUT

Ядро должно приостановить (stall) токены IN/OUT, если во время стадии данных транзакции управления (control transfer) хост отправил больше токенов IN/OUT, чем указано в пакете SETUP. В этом случае приложение должно разрешить прерывание ITTXFE в регистре OTG_FS_DIEPINTx и прерывание OTEPDIS в регистре OTG_FS_DOEPINTx во время стадии данных транзакции управления, после того, как ядро передало объем данных, указанный в пакете SETUP. Затем, когда приложение получит это прерывание, оно должно установить бит STALL в соответствующем регистре управления конечной точки, и очистить это прерывание.

[Наихудшее время отклика устройства USB]

Когда контроллер OTG_FS работает как устройство USB, существует наихудшее время отклика для любых токенов, которые следуют за isochronous OUT. Наихудшее время отклика зависит от тактовой частоты AHB.

Регистры ядра находятся в домене тактов AHB, и ядро не принимает никакие другие токены до того, как обновятся значения в этом регистре. Самый худший случай будет для любого токена, следующего за isochronous OUT, потом что для изохронной транзакции нет подтверждения (no handshake), и следующий токен может прийти раньше. Это самое худшее значение составляет 7 тактов PHY, когда тактовая частота AHB такая же, как и тактовая частота PHY. Когда тактовая частота AHB выше, это значение будет меньше.

Если такое условие наихудшего значения произойдет, то ядро отвечает на токены bulk/interrupt отрицательным подтверждением NAK и отбрасывает изохронные токены и токены SETUP. Хост интерпретирует это как событие таймаута для SETUP и пытается повторно передать пакет SETUP. Для изохронных передач прерывание незавершенной изохронной транзакции IN (IISOIXFR) и прерывание незавеншенной изохронной транзакции OUT (IISOOXFR) оповещают приложение, что пакеты isochronous IN/OUT были отброшены.

Выбор значения TRDT в регистре OTG_FS_GUSBCFG. Значение TRDT это время, необходимое для MAC, в единицах тактов PHY после получения токена IN, чтобы получить статус FIFO, и таким образом первые данные из блока PFC. Это время включает в себя задержку между тактами PHY и AHB. Наихудшая задержка для этого - когда тактовая частота AHB такая же, как и тактовая частота PHY. Тогда задержка составит 5 тактов.

Как только MAC принял токен IN, эта информация (что токен принят) синхронизирована с тактовой частотой AHB через PFC (PFC работает на тактовой частоте AHB). Затем PFC считывает данные из SPRAM, и записывает их в двухпортовый буфер (тактируемый от двух тактовых частот). Затем MAC считывает данные из буфера-источника (глубиной 4 ячейки).

Если AHB работает на частоте выше, чем у PHY, то приложение может использовать меньшее значение для TRDT (в регистре OTG_FS_GUSBCFG).

На рис. 405 есть следующие сигналы:

• tkn_rcvd: информация для PFC от MAC о приеме токена.
• dynced_tkn_rcvd: удвоенная синхронизация tkn_rcvd, от домена PCLK к домену HCLK.
• spr_read: чтение в SPRAM.
• spr_addr: адрес для SPRAM.
• spr_rdata: чтение данных из SPRAM.
• srcbuf_push: проталкивание данных в буфер-источник.
• srcbuf_rdata: чтение данных из буфера-источника. Данные увидит MAC.

См. выше таблицу 203: значения TRDT в зависимости от тактовой частоты AHB во врезке "OTG_FS USB configuration register (OTG_FS_GUSBCFG)".

STM32F4 OTG FS TRDT max timing case fig405

Рис. 405. Случай максимального тайминга TRDT.

[Модель программирования OTG]

Контроллер OTG_FS это устройство OTG, поддерживающее протоколы HNP и SRP. Когда ядро подключено к коннектору типа "A", то оно называется как A-устройство (хост USB). Когда ядро подключено к коннектору типа "B", то оно работает как B-устройство (устройство USB). В режиме хоста контроллер OTG_FS выключает VBUS для экономии энергии питания. SRP это метод, с помощью которого B-устройство сигнализирует A-устройству включить питание VBUS. A-устройство должно сформировать импульс как на линии данных, так и на линии VBUS, однако хост может детектировать для SRP либо импульс линии данных, либо импульс VBUS. HNP это метод, с помощью которого B-устройство договаривается с хостом о смене ролей - чтобы оно стало хостом USB, а хост стал устройством USB. В согласованном режиме (Negotiated mode) после HNP B-устройство приостанавливает шину, и возвращается обратно к роли устройства USB.

Протокол запроса сессии A-устройства. Приложение должно установить бит управления функцией SRP в регистре конфигурации ядра USB. Это разрешит контроллеру OTG_FS детектировать SRP в качестве A-устройства.

STM32F4 OTG FS A device SRP fig406

Рис. 406. A-device SRP.

DRV_VBUS = сигнал управления VBUS для PHY
VBUS_VALID = сигнал допустимости уровня VBUS от PHY
A_VALID = сигнал A-периферии допустимости уровня VBUS для PHY
D+ = сигнал данных DP интерфейса USB
D- = сигнал данных DM интерфейса USB

1. Для экономии питания приложение приостанавливает и выключает порт, когда шина находится в состоянии ожидания, путем записи бит port suspend и port power в регистре управления и статуса порта.

2. PHY показывает выключение питания порта снятием сигнала VBUS_VALID.

3. Устройство должно детектировать SE0 в течение по крайней мере 2 мс, чтобы запустить SRP, когда питание VBUS выключено.

4. Для инициации SRP, устройство USB включает свой верхний подтягивающий резистор на линии данных (pull-up) на время от 5 до 10 мс. Контроллер OTG_FS детектирует импульс на линии данных.

5. Устройство USB переводит VBUS на уровень выше A-device session valid (2.0V минимум), чтобы сгенерировать импульс VBUS. Контроллер OTG_FS генерирует прерывание для приложения при детектировании SRP. Установится бит определения запроса сессии (Session request detected) в регистре глобального статуса прерываний (установится бит SRQINT в регистре OTG_FS_GINTSTS).

6. Приложение должно обработать прерывание запроса сессии и включить питание порта путем записи бита питания порта (power bit) в регистре управления и статуса порта. PHY показывает включение питания порта выставлением сигнала VBUS_VALID.

7. Когда на USB подано питание, устройство подключается, завершая тем самым процесс SRP.

Протокол запроса сессии B-устройства. Приложение должно установить бит управления функцией SRP в регистре конфигурации ядра USB. Это разрешит контроллеру OTG_FS инициировать SRP в качестве B-устройства. SRP является средством, через которое контроллер OTG_FS может запросить новую сессию у хоста USB.

STM32F4 OTG FS B device SRP fig407

Рис. 407. B-device SRP.

VBUS_VALID = сигнал допустимости уровня VBUS от PHY
B_VALID = сигнал B-периферии допустимой сессии для PHY
DISCHRG_VBUS = сигнал разряда для PHY
SESS_END = сигнал завершения сессии для PHY
CHRG_VBUS = сигнал заряда VBUS для PHY
DP = сигнал данных D+ интерфейса USB
DM = сигнал данных D- интерфейса USB

1. Чтобы экономить питание, хост приостанавливает и выключает питание порта, когда шина находится в состоянии ожидания. Контроллер OTG_FS установит бит ранней приостановки (early suspend bit) в регистре управления ядра после 3 мс нахождения шины в состоянии ожидания. После этого контроллер OTG_FS установит бит приостановки USB в регистре прерываний ядра. Контроллер OTG_FS информирует PHY разрядить VBUS.

2. PHY покажет для устройства завершение сессии. Это начальное условие для SRP. Контроллер OTG_FS требует 2 мс SE0 перед инициированием SRP. Для последовательного трансивера USB 1.1 full-speed, приложение должно подождать, пока VBUS разрядится до 0.2V после снятия BSVLD (в регистре OTG_FS_GOTGCTL). Это время разряда может быть получено от производителя трансивера, и оно может меняться в зависимости от производителя.

3. Ядро USB OTG информирует PHY, чтобы ускорить разряд VBUS.

4. Приложение инициирует SRP записью бита запроса сессии в регистре управления и статус OTG. Контроллер OTG_FS формирует импульс линии данных, затем импульс VBUS.

5. Хост детектирует SRP по импульсу либо от линии данных, либо от VBUS, и включает VBUS. PHY показывает для устройства включение VBUS.

6. Контроллер OTG_FS выполняет пульсацию VBUS. Хост запускает новую сессию включением VBUS, показывая успех SRP. Контроллер OTG_FS выставляет прерывание в приложение установкой бита успешного изменения состояния статуса запроса сессии в регистре статуса прерываний OTG. Приложение считывает бит успеха запроса сессии в регистре управления и статуса OTG.

7. Когда на USB подано питание, подключается контроллер OTG_FS, завершая процесс SRP.

Протокол хоста согласования A-устройства. HNP переключает роль хоста USB от A-устройства к B-устройству. Приложение должно установить бит разрешения функции HNP в регистре конфигурации ядра USB, чтобы разрешить контроллеру OTG_FS выполнять протокол HNP в качестве A-устройства.

STM32F4 OTG FS A device HNP fig408

Рис. 408. A-device HNP.

DPPULLDOWN = сигнал от ядра к PHY, чтобы разрешить/запретить подтягивающий вниз резистор (pull-down) на линии DP внутри PHY.
DMPULLDOWN = сигнал от ядра к PHY, чтобы разрешить/запретить подтягивающий вниз резистор (pull-down) на линии DM внутри PHY.

1. Контроллер OTG_FS отправляет дескриптор B-device SetFeature b_hnp_enable, чтобы разрешить поддержку HNP. Ответ ACK B-устройства показывает, что B-устройство поддерживает HNP. Приложение должно установить бит разрешения HNP хоста в регистре управления и статуса OTG, чтобы показать контроллеру OTG_FS, что B-устройство поддерживает HNP.

2. По завершении использования шины USB приложение приостанавливается путем записи бита приостановки порта в регистр управления и состояния порта хоста.

3. Когда B-устройство увидело приостановку USB, оно отключается, с указанием начального состояния HNP. B-устройство инициирует HNP только когда оно должно переключиться на роль хоста USB; иначе шина продолжает свою приостановку. Контроллер OTG_FS установит прерывание детектирования согласования хоста (host negotiation detected) в регистре статуса прерываний OTG, показывая старт HNP. Контроллер OTG_FS снимает DM pull-down и DM pull-down в PHY, чтобы показать роль устройства. PHY разрешает резистор OTG_FS_DP, чтобы показать подключение к B-устройству. Приложение должно прочитать бит текущего режима в регистре управления и статуса OTG, для определения режима работы устройства.

4. B-устройство детектирует подключение, выдает сброс USB, и выполняет энумерацию контроллера OTG_FS для трафика данных.

5. B-устройство продолжает свою роль хоста, инициирует трафик, и приостанавливает работу шины. Контроллер OTG_FS устанавливает бит ранней приостановки (early suspend) в регистре прерываний ядра после 3 мс ожидания шины. После этого контроллер OTG_FS устанавливает бит приостановки USB (USB Suspend) в регистре прерываний ядра.

6. В согласованном режиме (Negotiated mode) контроллер OTG_FS детектирует приостановку, отключается и переключается обратно на роль хоста. Контроллер OTG_FS выставляет DM pull-down и DM pull-down в PHY, чтобы показать, что он принимает на себя роль хоста USB.

7. Контроллер OTG_FS установит прерывание изменения статуса линии идентификации на коннекторе (Connector ID status change) в регистре статуса прерываний OTG. Приложение должно прочитать статус connector ID в регистре управления и статуса OTG, чтобы определить работу контроллера OTG_FS как A-устройства. Это покажет для приложения завершение HNP. Приложение должно прочитать бит текущего режима в регистре управления и статуса OTG, чтобы определить режим работы хоста.

8. B-устройство подключается, завершая процесс HNP.

Протокол согласования хоста B-устройства. HNP переключает роль хоста от B-устройства к A-устройству. Приложение должно установить бит разрешения функции HNP в регистре конфигурации ядра, чтобы разрешить контроллер OTG_FS выполнить протокол HNP в качестве B-устройства.

STM32F4 OTG FS B device HNP fig409

Рис. 409. B-device HNP.

DPPULLDOWN = сигнал от ядра к PHY чтобы разрешить/запретить pull-down на линии DP внутри PHY.
DMPULLDOWN = сигнал от ядра к PHY чтобы разрешить/запретить pull-down на линии DM внутри PHY.

1. A-устройство отправляет дескриптор SetFeature b_hnp_enable для разрешения поддержки HNP. Контроллер OTG_FS выдает положительное подтверждение ACK, показывающее, что он поддерживает HNP. Приложение должно установить бит разрешения устройства HNP в регистре управления и статуса OTG, чтобы показать поддержку HNP. Приложение установит бит запроса HNP в регистре управления и статуса OTG, чтобы показать контроллеру OTG_FS инициировать HNP.

2. По завершении использования шины A-устройство приостанавливается путем записи бита приостановки бита приостановки порта в регистре управления и статуса порта. Контроллер OTG_FS установит бит ранней приостановки (Early suspend) в регистре прерываний ядра при 3 мс состояния ожидания шины. После этого контроллер OTG_FS установит бит приостановки USB (USB suspend) в регистре прерываний ядра. Контроллер OTG_FS отключается и A-устройство детектирует SE0 на шине, показывающее HNP. Контроллер OTG_FS выставит DP pull-down и DM pull-down в PHY, чтобы показать, что он принимает на себя роль хоста USB. A-устройство ответит активацией своего OTG_FS_DP pull-up резистора в течение 3 мс после обнаружения SE0. Контроллер OTG_FS детектирует это как подключение. Контроллер OTG_FS установит прерывание изменения статуса успешного согласования хоста в регистре статуса прерываний OTG, показывая статус HNP. Приложение должно прочитать бит успеха согласования хоста в регистре управления и статуса OTG, чтобы определить успех согласования хоста. Приложение должно прочитать бит текущего режима в регистре прерываний ядра (OTG_FS_GINTSTS), чтобы определить режим работы хоста.

3. Приложение устанавливает бит сброса (PRST в регистре OTG_FS_HPRT), и контроллер OTG_FS выдает на шину USB reset, и выполняет энумерацию A-устройства для трафика данных.

4. Контроллер OTG_FS продолжает свою роль хоста при инициировании трафика, и по завершении приостанавливает шину записью бита приостановки порта в регистре управления и статуса порта.

5. В согласованном режиме (Negotiated mode), когда A-устройство определит приостановку, оно отключается и переключается обратно на роль хоста. Контроллер OTG_FS снимает DP pull-down и DM pull-down в PHY, чтобы показать назначение своей роли устройства USB.

6. Приложение должно прочитать бит текущего режима в регистре прерываний ядра (OTG_FS_GINTSTS), чтобы определить режим работы хоста.

7. Контроллер OTG_FS подключается, завершая процесс HNP.

[Ссылки]

1. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com.
2. STM32: словарик.
3. On-The-Go Supplement to the USB 2.0 Specification site:softelectro.ru.
4. Universal Serial Bus Revision 2.0 Specification.
5200121USBdoc.zip - pdf-файлы документации [3, 4].
6. STM32: контроллер USB OTG high-speed.
7ULPI: стандарт для высокоскоростных USB PHY.

 

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


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

Top of Page