В микроконтроллерах ARM7 компании Atmel (AT91SAM7128, AT91SAM7X256, AT91SAM7512 и других) имеется аппаратный интерфейс USB, позволяющий делать устройства USB. Здесь приведен перевод раздела даташита Atmel, дающий описание аппаратуры этого интерфейса USB (UDP, USB Device Port). Порт UDP своим названием (Device) подчеркивает, что аппаратный интерфейс USB в микроконтроллере ARM7 предназначен только для создания устройств USB, и не поддерживает режим хоста USB.
[34.1 Общий обзор интерфейса USB]
USB Device Port (UDP) в микроконтроллерах ARM7 компании Atmel совместим со спецификацией устройств шины Universal Serial Bus (USB) V2.0 full-speed (high-speed не поддерживается). Режим DMA (прямой доступ к памяти без участия ядра ARM) не поддерживается. Каждая конечная точка (endpoint) может быть сконфигурирована в один из нескольких типов передач USB. Конечная точка может быть связана с одним или двумя банками двухпортовой RAM (DPR, Dual Port RAM), для хранения текущих передаваемых туда и обратно данных (текущая полезная нагрузка, current data payload). Если используются два банка, то один банк DPR читается или записывается ядром ARM (программой firmware), в то время как другой банк читается или записывается аппаратурой устройства USB. Такая особенность обязательна для изохронных конечных точек (isochronous endpoints). Таким способом устройство может обеспечить максимальную полосу (1 мегабайт/сек), путем работы с конечными точками, использующими два банка DPR.
Таблица 34-1. Описание конечных точек USB
Номер конечной точки |
Мнемоника |
Два банка |
Максимальный размер конечной точки |
Поддерживаемые типы конечной точки |
0 |
EP0 |
нет |
8 |
Control/Bulk/Interrupt |
1 |
EP1 |
ДА |
64 |
Bulk/Iso/Interrupt |
2 |
EP2 |
ДА |
64 |
Bulk/Iso/Interrupt |
3 |
EP3 |
нет |
64 |
Control/Bulk/Interrupt |
4 |
EP4 |
ДА |
256 |
Bulk/Iso/Interrupt |
5 |
EP5 |
ДА |
256 |
Bulk/Iso/Interrupt |
Состояния приостановки (suspend) и возобновления (resume) работы автоматически детектируются устройством USB, и о них оповещается процессор (ядро ARM микроконтроллера) путем генерации прерывания. В зависимости от разрабатываемого проекта, может использоваться внешний сигнал для пробуждения контроллера хоста USB (компьютера, к которому подключено устройство USB на ARM7).
[34.2 Блоковая диаграмма аппаратуры интерфейса USB]
Рис. 34-1. Блок-схема порта UDP
Пояснения к блок схеме:
Atmel Bridge - внутренний мост, через который идет обмен данными с периферийными устройствами внутри микроконтроллера Atmel. Мост подключен к шине APB микроконтроллера. На наличие моста программист не должен обращать никакого внимания. APB to MCU bus - шина APB (Advanced Peripheral Bus), подключенная к шине MCU (мина микроконтроллера). Внутренние особенности кристалла, не нужно обращать на это внимания. MCK, UDPCK - тактовые сигналы для UDP (подробнее см. далее). udp_int - сигнал прерывания для микроконтроллера, который генерирует UDP. external_resume - сигнал внешнего пробуждения, вывод из спячки UDP. USB Device - аппаратура микроконтроллера, с помощью которой поддерживается его работа в качестве устройства USB. User Interface - интерфейс пользователя (программиста) - набор регистров, который приведен в таблице 34-4 (см. далее). Wrapper - окружение двухпортовой памяти. Dual Port RAM FIFO - двухпортовая память, подробнее см. далее. Master Clock Domain - часть схемы UDP, который работает на основной тактовой частоте ядра. Recovered 12 MHz Domain - часть схемы UDP, работающий на "восстановленной" частоте 12 МГц. Suspend/Resume Logic - логика UDP, отвечающая за приостановку и возобновление работы устройства USB. Serial Interface Engine (SIE) - некий блок последовательной логики. На его наличие программисту не нужно обращать внимания. txoen, eopn, txd, rxdm, rxd, rxdp - внутренние аппаратные сигналы последовательного интерфейса для обмена данными с трансивером USB. Программист не имеет к этим сигналам доступа, и не должен обращать на них никакого внимания. Embedded USB Transceiver - встроенный в микроконтроллер приемопередатчик шины USB. DP, DM - двунаправленные сигналы шины USB, предназначенные для обмена данными с хостом USB. Они выходят из микроконтроллера через ножки DDP и DDM соответственно.
Доступ к UDP осуществляется через интерфейс шины APB. Чтение и запись FIFO данных осуществляется путем чтения и записи 8-битных значений в регистры APB.
Периферия порта UDP требует две тактовые частоты: одну частоту для тактирования периферии, используемую доменом Master Clock (MCK) и другую тактовую частоту 48 МГц (UDPCK), используемую в домене 12 МГц. Полноскоростные USB 2.0 full-speed выводы встроены и контролируются системой Serial Interface Engine (SIE).
Сигнал external_resume (внешние управление возобновлением работы, пробуждением) является необязательным. Он позволяет периферии UDP осуществлять пробуждение системы. Хост USB при этом оповещается о том, что устройство запрашивает возобновление работы (resume). Эта дополнительная функция должна быть также согласована с хостом во время энумерации (enumeration).
[34.3 Зависимости чипа микроконтроллера (Product Dependencies)]
Дополнительные подробности по поводу реализации аппаратуры устройства USB см. в специальном документе Product Properties (свойства продукта, под продуктом подразумевается микроконтроллер ARM компании Atmel). Физический приемопередатчик (transceiver) интегрирован в микроконтроллер. Двунаправленные дифференциальные сигналы DP и DM также выведены наружу через выводы микроконтроллера DDP и DDM.
Две линии ввода/вывода (I/O lines) могут использоваться программой микроконтроллера следующим образом:
- одна ножка (вход) нужна для проверки наличия напряжения на проводе VBUS шины USB (порт, работающий на вход, либо вход АЦП). Устройства USB, имеющие собственное питание, могут использовать этот сигнал для определения, что хост выключен или отсоединен. В этом случае внешний нагрузочный резистор на сигнале DP должен быть отключен, чтобы предотвратить вытекание тока в хост USB (паразитное питание).
- одна ножка (выход) нужна для управления внешним нагрузочным pull-up резистором на сигнале DP. Через подключение этого резистора устройство USB оповещает хост, что оно готово к работе.
Для формирования состояния K (используется для пробуждения хоста, см. далее) может использоваться дополнительная третья ножка микроконтроллера.
34.3.1 Сигналы ввода/вывода (I/O Lines)
Сигналы DP и DM шины USB никак не управляются напрямую через какие-либо контроллеры PIO. Они управляются только встроенным физическим USB-трансивером, управляемым от периферии USB устройства (UDP). Чтобы зарезервировать линию I/O для проверки VBUS, программист должен сначала запрограммировать контроллер PIO, чтобы назначить эту линию (ножку) I/O как вход. Чтобы зарезервировать линию I/O для управления внешним pull-up, программист должен сначала запрограммировать контроллер PIO, чтобы назначить эту линию (ножку) I/O как выход.
34.3.2 Управление питанием (Power Management)
UDP требует тактовой частоты 48 МГц. Эта тактовая частота должна быть сгенерирована с использованием PLL, с точностью +-0.25%. Таким образом, устройство USB получает две тактовые частоты от контроллера управления питанием Power Management Controller (PMC): главная частота master clock, MCK, которая используется для тактирования пользовательского интерфейса периферийного устройства, и частота UDPCK, которая используется для интерфейса с сигналами шины USB (восстановленный домен 12 МГц).
ВНИМАНИЕ: тактовая частота периферии UDP в Power Management Controller (PMC) должна быть разрешена перед операциями чтения-записи регистров UDP, включая регистр UDP_TXCV (регистр управления трансивером).
34.3.3 Прерывание (Interrupt)
Интерфейс устройства USB имеет линию прерывания, подключенную к контроллеру прерываний Advanced Interrupt Controller (AIC). Обработка прерывания устройства USB требует программирования AIC перед конфигурированием UDP.
[34.4 Пример типичной реализации проводов интерфейса USB (Typical Connection)]
Рис. 34-2. Схема платы для физической организации интерфейса с UDP
Пояснения к схеме:
PIO - подключение к портам (ножкам) микроконтроллера.
DDM, DDP - аппаратные сигналы интерфейса USB, которые заведены на ножки микроконтроллера.
5V Bus Monitoring - контроль наличия напряжения +5V на проводе VBUS интерфейса USB.
Pullup Control - управление подключением нагрузочного резистора pull-up 1.5 кОм. Лог. 0 (0: Enable) подключает резистор, а лог. 1 (1: Disable) отключает.
REXT - дополнительные резисторы, которые нужны для согласования сопротивления линии USB (уменьшения отражений сигнала).
Type B Connector - внешний коннектор USB-устройства USB, через который оно подключается к хосту см. [2].
Интересно также рассмотреть другие примеры реализации схемы физического интерфейса USB для микроконтроллеров AT91SAM7X. На следующем рисунке приведена схема интерфейса USB макетной платы sam7-ex256 компании OLIMEX.
Схема OLIMEX полностью соответствует требованиям даташита Atmel. Кроме того, она лучше тем, что позволяет работать по USB загрузчику SAM-BA. Это происходит потому, что транзистор Q1 будет открыт напряжением 3.3V, поступающим от ножки PIO PA25, так так как по умолчанию, когда flash-память микроконтроллера стерта, и все PIO настроены после сброса как входы с подключенными внутренними pull-up резисторами. Открытый транзистор подключит pull-up резистор 1.5 кОм к линии данных USB D+, чем обеспечит видимость устройства USB макетной платы для хоста. При нажатии на кнопку сброса pull-up резистор будет отключаться, что будет для хоста означать, что устройство USB отключено (низкий потенциал через диод D1 попадет на базу транзистора, и он закроется). Единственное, что не умеет эта схема - формировать состояние K (см. далее).
На следующей схеме приведена реализация интерфейса USB на макетной плате AT91SAM7X [3].
Функционально вариант схемы макетной платы AT91SAM7X отличается от макетной платы Olimex отсутствием разводки сигнала сброса RST на отключение нагрузочного резистора 1.5 кОм. В остальном схема полностью обладает тем же функционалом, что и у Olimex.
На следующем рисунке показана схема USB интерфейса самой дорогой отладочной платы для семейства микроконтроллеров ARM7, AT91SAM7X-EK от компании Atmel.
Этот вариант схемы совсем простой. Нагрузочный резистор 1.5 кОм подключен постоянно, отсутствует возможность его программного включения и выключения (нет сигнала USB_PUP). Подразумевается, что firmware должно сразу при включении питания обеспечивать поддержку интерфейса USB. Поэтому также отсутствует сигнал о наличии напряжения на проводе VBUS (нет сигнала USB_PR). Работа загрузчика SAM-BA по USB поддерживается благодаря тому, что резистор pull-up 1.5 кОм постоянно подключен к сигналу D+ (резистор встроен в микросхему защиты MN1 USBUF02W6).
34.4.1 Приемопередатчик, трансивер устройства USB (USB Device Transceiver)
Приемопередатчик устройства USB встроен в микроконтроллер. Также нужны несколько отдельных внешних деталей для следующих целей:
- приложение (программа firmware микроконтроллера) детектирует все состояния устройства, как описано в Части 9 спецификации USB (Universal Serial Bus Specification, Rev. 2.0). - разрешение/запрет внешнего нагрузочного pull-up резистора. - опрос наличия напряжения на шине VBUS. - уменьшение энергопотребления при отключении хоста USB. - правильная нагрузка линий шины USB (line termination).
На приведенной схеме примера Рис. 34-2 управление резистором pull-up 1.5 кОм осуществляется с помощью транзистора MOSFET (p-канал), который управляется программным обеспечением firmware через линию PIO Pullup Control. Резистор pull-up будет подключен (и устройство USB активируется для хоста USB), когда микроконтроллер переведет ножку порта Pullup Control в состояние лог. 0. Состояние по умолчанию для PIO будет соответствовать лог. 1 для транзистора MOSFET, что приведет к запрету pull-up резистора. (Примечание переводчика: по этой причине приведенная схема не позволит воспользоваться бутлоадером SAM-BA для загрузки через USB программного обеспечения firmware, так как по умолчанию после сброса все порты ввода вывода микроконтроллера ARM7 настроены как входы с подключенным внутренним pull-up резистором. Таким образом, на выходе порта Pullup Control будет лог. 1, MOSFET транзистор будет закрыт, что приведет к деактивации USB-устройства SAM-BA для хоста USB). Как только резистор pull-up будет разрешен, то хост через 100 мс выдаст на шину USB сигнал сброса устройства (device reset). Устройства, запитываемые от шины USB, должны за 100 мс успеть подключить резистор pull-up. (Примечание переводчика: этот пример схемы также не поддерживает формирование "состояния K" для генерации сигнала пробуждения хоста USB, см. раздел 34.5.3.8 Sending a Device Remote Wakeup.)
34.4.2 Опрос состояния VBUS (VBUS Monitoring)
Мониторинг сигнала VBUS нужен для детектирования подключения и отключения хоста. Это может быть осуществлено через стандартный порт PIO с выключенным внутренним pull-up. Когда хост выключается, то нужно отследить эту ситуацию, и внешний pull-up резистор надо отключить (чтобы не подавать в хост паразитное питание через pull-up резистор 1.5 кОм).
Когда хост USB отключен и трансивер остался разрешенным, то выводы микроконтроллера DDP и DDM (подключенные к проводам D+ и D- шины USB), оказываются в подвешенном состоянии. Это может привести к перегрузке трансивера. Чтобы устранить проблему, рекомендуется использовать два нижних нагрузочных резистора (pull-down) 330 кОм, подключенных к GND и сигналам DP и DM (см. Рис. 34-2). Эти резисторы не повлияют на работу аппаратуры выводов DDP и DDM.
Также должны быть подключены два терминирующих резистора REXT последовательно в цепи сигналов DP и DM. Значение номинала резистора указано в электрической спецификации на микроконтроллер (параметр REXT).
[34.5 Функциональное описание UDP]
34.5.1 Введение в спецификацию USB V2.0 Full-speed
USB V2.0 Full-speed предоставляет сервисы обмена данными с хостом и подключенными устройствами USB. Каждое устройство USB оснащено набором коммуникационных каналов, связанных с каждой конечной точкой (конечные точки). Программное обеспечение хоста (ПО хоста) обменивается данными с устройством USB через этот набор коммуникационных потоков.
Рис. 34-3. Пример управления коммуникациями USB V2.0 Full-speed
Примечания к примеру управления обменом:
USB Host V2.0 - хост USB, поддерживающий стандарт USB 2.0 (обычно это компьютер).
Software Client - ПО хоста, работающее с устройством USB.
Data Flow - поток данных, проходящий через конечную точку.
Control Transfer, Isochronous In Transfer, Isochronous Out Transfer, Bulk In Transfer, Bulk Out Transfer - различные типы передач.
EP0, EP1, .., EP5 - конечные точки устройства USB (EP - аббревиатура от End Point).
Конечная точка управления передачей (Control Transfer endpoint) EP0 всегда используется, когда устройство впервые после подключения проходит конфигурирование (согласно спецификации USB V2.0 Full-speed).
34.5.1.1 Типы передач (Transfer Types) USB V2.0 Full-speed
Поток обмена данными осуществляется одним из 4 способов (управление, изохронная передача, прерывание, bulk), которые могут быть заданы устройством USB (см. таблицу 34-2).
Таблица 34-2. USB Communication Flow
Тип передачи |
Направления передачи |
Полоса |
Поддерживаемые размеры конечных точек |
Детектирование ошибок |
Повторы передач при ошибке |
Control |
в обе стороны |
не гарантированная |
8, 16, 32, 64 |
ДА |
автоматические |
Isochronous |
одно направление |
гарантированная |
256 |
ДА |
нет |
Interrupt |
одно направление |
не гарантированная |
не более 64 |
ДА |
ДА |
Bulk |
одно направление |
не гарантированная |
8, 16, 32, 64 |
ДА |
ДА |
34.5.1.2 Транзакции шины USB
Каждый трансфер (передача данных в какую-нибудь сторону) является результатом одной или нескольких транзакций шины USB. Есть три вида транзакций, которые передаются по шине в пакетах (см. также [1]):
1. Setup Transaction 2. Data IN Transaction 3. Data OUT Transaction
34.5.1.3 Определения события трансфера USB (USB Transfer Event Definitions)
Как показано ниже, трансферы являются последовательными событиями, которые передаются по шине USB.
Таблица 34-3. USB Transfer Events
Управляющие передачи (Control Transfers (1) (3)) |
- транзакция Setup > транзакции Data IN > транзакция Status OUT - транзакция Setup > транзакции Data OUT > транзакция Status IN - транзакция Setup > транзакция Status IN |
Передача с прерываниями IN (Interrupt IN Transfer, данные передаются от устройства USB к хосту USB) |
- транзакция Data IN > транзакция Data IN |
Передача с прерываниями OUT (Interrupt OUT Transfer, данные передаются от хоста USB к устройству USB) |
- транзакция Data OUT > транзакция Data OUT |
Изохронная передача IN (Isochronous IN Transfer(2), данные передаются от устройства USB к хосту USB) |
- транзакция Data IN > транзакция Data IN |
Изохронная передача OUT (Isochronous OUT Transfer(2), данные передаются от хоста USB к устройству USB) |
- транзакция Data OUT > транзакция Data OUT |
Блочная передача IN (Bulk IN Transfer, данные передаются от устройства USB к хосту USB) |
- транзакция Data IN > транзакция Data IN |
Блочная передача OUT (Bulk OUT Transfer, данные передаются данные передаются от хоста USB к устройству USB) |
- транзакция Data OUT > транзакция Data OUT |
Примечания к таблице 34-3: 1. Управляющая передача должна использовать конечные точки без атрибутов ping-pong. 2. Изохронные передачи должны использовать конечные точки с атрибутами ping-pong. 3. Управляющие передачи могут быть оборваны с использованием подтверждения останова (stall handshake).
Транзакция передачи состояния (status transaction) является транзакцией от хоста к устройству (host-to-device) специального типа, используемой только в управляющей передаче. Управляющая передача должна быть выполнена с использованием конечных точек без атрибутов ping-pong. В соответствии с управляющей последовательностью (чтение или запись) устройство USB передает или принимает транзакцию состояния.
Рис. 34-4. Последовательности Control Read и Control Write
Примечания к рис. 34-4: 1. Во время стадии Status IN хост ожидает пакета нулевой длины (zero length packet, транзакция Data IN без данных) от устройства с использованием DATA1 PID. Обратитесь к Части 8 спецификации USB (Universal Serial Bus Specification, Rev. 2.0) для получения подробной информации по слою протокола. 2. Во время стадии Status OUT хост передает устройству zero length packet (транзакция Data OUT без данных).
34.5.2 Поддержка транзакций с периферией устройства USB V2.0
34.5.2.1 Setup Transaction
Setup является транзакцией от хоста к устройству специального типа, используемой для управляющих передач. Управляющие передачи должны быть выполнены с использованием контрольных точек без установленных атрибутов ping-pong. Транзакция Setup должна быть обработана в firmware устройства USB максимально быстро, как это только возможно. Транзакция Setup используется для передачи запросов от хоста к устройству. Эти запросы обрабатываются устройством USB, и им могут потребоваться некоторое количество аргументов. Аргументы передаются устройству транзакциями Data OUT, которые идут за транзакцией Setup. Эти запросы могут также возвращать данные обратно. Данные переносятся к хосту последующей транзакцией Data IN, которая следует за транзакцией Setup. Управляющую передачу (control transfer) завершает транзакция состояния (status transaction).
Когда конечная точка USB получила передачу Setup: - устройство USB автоматически подтверждает пакет Setup. - в регистре UDP_ CSRx устанавливается флаг RXSETUP. - генерируется прерывание конечной точки, в то время как RXSETUP не очищается. Информация о прерывании передается в микроконтроллер (микроконтроллер обрабатывает прерывание), если для этой конечной точки разрешены прерывания.
Таким образом, firmware должно детектировать RXSETUP путем опроса UDP_ CSRx или путем обработки прерывания, прочитать пакет setup из FIFO, и затем очистить флаг RXSETUP. Флаг RXSETUP не может быть очищен до чтения пакета setup из FIFO. Иначе устройство USB примет следующую передачу Data OUT и перезапишет пакет setup в FIFO.
Рис. 34-5. Транзакция Setup, за которой следует транзакция Data OUT
34.5.2.2 Data IN Transaction
Транзакции Data IN используются в передачах типа control, isochronous, bulk и interrupt, и переносят данные от устройства к хосту. Транзакции Data IN в изохронных передачах должны происходить через конечные точки с атрибутами ping-pong.
34.5.2.3 Использование конечных точек без атрибутов ping-pong
Для выполнения транзакции Data IN на конечной точке без ping-pong:
1. Приложение (firmware микроконтроллера) проверяет, можно ли записать в FIFO путем опроса флага TXPKTRDY в регистре конечной точки UDP_CSRx (флаг TXPKTRDY должен быть очищен). 2. Приложение записывает первый пакет данных для отправки в FIFO конечной точки, записывая 0 или большее количество байт в регистр UDP_FDRx конечной точки. 3. Приложение оповещает периферийное устройство USB, что процесс завершен путем установки TXPKTRDY в регистре UDP_CSRx конечной точки. 4. Приложение оповещается о том, что FIFO конечной точки освобожден устройством USB, когда устанавливается флаг TXCOMP в регистре UDP_CSRx конечной точки. При этом срабатывает прерывание для соответствующей точки, когда устанавливается TXCOMP. 5. Приложение записывает второй пакет данных для отправки в FIFO конечной точки, записывая 0 или большее количество байт в регистр UDP_FDRx конечной точки. 6. Приложение оповещает периферийное устройство USB, что процесс завершен путем установки TXPKTRDY в регистре UDP_CSRx конечной точки. 7. Приложение очищает TXCOMP в регистре UDP_ CSRx конечной точки.
После отправки последнего пакета приложение должно очистить TXCOMP сразу после того, как он установлен. TXCOMP устанавливается устройством USB, когда оно принимает сигнал ACK PID для пакета Data IN. Когда TXCOMP установлен, то срабатывает прерывание.
ВНИМАНИЕ: TXCOMP должен быть очищен после установки TXPKTRDY. Примечание: обратитесь к Части 8 спецификации USB (Universal Serial Bus Specification, Rev 2.0) для получения дополнительной информации по слою протокола Data IN.
Рис. 34-6. Data IN Transfer для конечной точки без ping-pong
34.5.2.4 Использование конечных точек с атрибутом ping-pong
Использовать конечную точку с атрибутом ping-pong нужно для изохронной передачи. Это также позволяет достичь максимальной полосы пропускания шины, заданной в спецификации USB, во время передачи bulk. Чтобы иметь возможность гарантировать постоянную или максимальную полосу пропускания, микроконтроллер должен подготовить следующие данные (data payload) для отправки, когда аппаратурой USB отправляются текущие данные. Таким образом, используются два банка памяти. Когда один банк доступен для микроконтроллера, то второй заблокирован аппаратурой USB.
Рис. 34-7. Механизм переключения банков в передачах Data IN для конечных точек с ping-pong
Когда используется конечная точка ping-pong, то нужно выполнить следующую последовательность для транзакций Data IN:
1. Микроконтроллер проверяет, возможно записать в FIFO, путем опроса TXPKTRDY (очищен ли он) в регистре UDP_CSRx конечной точки. 2. Микроконтроллер записывает в FIFO (банк 0) первый пакет данных полезной нагрузки для отправки, записывая 0 или большее количество байт в регистр UDP_FDRx конечной точки. 3. Микроконтроллер оповещает аппаратуру USB, что он завершил запись в банк 0 FIFO, путем установки TXPKTRDY в регистре UDP_CSRx конечной точки. 4. Без ожидания, когда очистится флаг TXPKTRDY, микроконтроллер записывает вторую порцию отправляемых данных полезной нагрузки в FIFO (банк 1), записывая 0 или большее количество байт в регистр UDP_FDRx конечной точки. 5. Микроконтроллер оповещается о том, что аппаратура USB освободила первый банк, когда установится TXCOMP в регистре UDP_CSRx конечной точки. При этом срабатывает прерывание. 6. Как только микроконтроллер обнаружит установку TXCOMP для первого банка, он оповещается аппаратурой USB, что она готова отправлять второй банк, путем установки TXPKTRDY в регистре UDP_CSRx конечной точки. 7. На этом шаге банк 0 доступен для микроконтроллера, и микроконтроллер может подготовить третий передаваемый блок данных полезной нагрузки.
Рис. 34-8. Data IN Transfer для конечной точки с ping-pong
ВНИМАНИЕ: для программного обеспечения это критический путь, поскольку фактически ка только второй банк заполнен, драйвер ждет TXCOMP для установки TXPKTRDY. Если задержка между детектированием установки TXCOMP и установкой TXPKTRDY слишком большая, то некоторые пакеты Data IN могут получить в ответ NACK, что снизит полосу передачи.
ВНИМАНИЕ: TXCOMP должен быть очищен после установки TXPKTRDY.
34.5.2.5 Data OUT Transaction
Транзакции Data OUT используются для передач control, isochronous, bulk и interrupt, и переносят данные от хоста к устройству. Транзакции Data OUT в изохронных передачах должны осуществляться на конечных точках с атрибутами ping-pong.
34.5.2.6 Транзакции Data OUT без атрибутов ping-pong
Чтобы выполнить транзакцию Data OUT на конечной точке без ping-pong:
1. Хост генерирует пакет Data OUT. 2. Этот пакет попадает в конечную точку аппаратуры устройства USB. Когда FIFO, связанный с этой конечной точкой, используется микроконтроллером, то хосту будет возвращен NACK PID. Как только FIFO освободится, данные будут записаны в FIFO аппаратурой USB и хосту автоматически будет отправлено подтверждение ACK. 3. Микроконтроллер будет оповещен, что аппаратура USB получила данные (data payload), если он опрашивает на установку RX_DATA_BK0 в регистре UDP_CSRx конечной точки. При установке RX_DATA_BK0 генерируется прерывание для этой конечной точки. 4. Количество доступных байт в FIFO можно получить путем чтения RXBYTECNT в регистре UDP_CSRx конечной точки. 5. Микроконтроллер вычитывает данные из конечной точки путем чтения регистра UDP_FDRx конечной точки. 6. Микроконтроллер оповещает аппаратуру USB, что он закончил чтение FIFO путем очистки RX_DATA_BK0 в регистре UDP_CSRx конечной точки. 7. Новый пакет Data OUT может быть принят аппаратурой устройства USB.
Рис. 34-9. Data OUT Transfer для конечных точек без ping-pong
Когда устанавливается флаг RX_DATA_BK0, то срабатывает прерывание. Передача содержимого памяти между аппаратурой USB, FIFO и памятью микроконтроллера невозможна после очистки RX_DATA_BK0. В противном случае аппаратура USB может принять следующий пакет Data OUT и перезаписать в FIFO текущий пакет Data OUT.
34.5.2.7 Использование конечных точек с атрибутами ping-pong
Для изохронных передач нужно обязательно использовать конечную точку с атрибутами ping-pong. Чтобы можно было гарантировать постоянную полосу пропускания, микроконтроллер должен прочитать предыдущую полезную нагрузку, отправленную хостом, в то время как текущая полезная нагрузка поступает в аппаратуру устройства USB. Таким образом, используются два банка. Пока один из них доступен для микроконтроллера, второй заблокирован аппаратурой USB.
Рис. 34-10. Механизм переключения банков в передачах Data OUT на конечных точках с ping-pong
Когда используется конечная точка с ping-pong, то нужно выполнять следующие процедуры для обеспечения транзакций Data OUT (передача от хоста к устройству):
1. Хост генерирует пакет Data OUT. 2. Этот пакет попадает в конечную точку аппаратуры устройства USB. Он записывается в банк 0 FIFO конечной точки. 3. Аппаратура отправляет хосту пакет ACK PID. Хост может немедленно отправить второй пакет Data OUT. Этот второй пакет будет принят аппаратурой и помещен в банк 1 FIFO. 4. Микроконтроллер будет оповещен о том, что аппаратура USB приняла данные (data payload), путем опроса RX_DATA_BK0 в регистре UDP_CSRx конечной точки. При установке этого бита также будет сгенерировано прерывание. 5. Количество доступных байт в FIFO можно определить чтением поля RXBYTECNT в регистре UDP_CSRx конечной точки. 6. Микроконтроллер переносит принятые данные из памяти конечной точки в свою память путем чтения регистра UDP_FDRx конечной точки. 7. Микроконтроллер оповещает аппаратуру USB, что он закончил чтение FIFO путем очистки RX_DATA_BK0 в регистре UDP_CSRx конечной точки. 8. После этого третий пакет Data OUT может быть принят аппаратурой USB и скопирован в банк 0 FIFO. 9. Если принят второй пакет Data OUT, микроконтроллер оповещается об этом установкой флага RX_DATA_BK1 в регистре UDP_CSRx конечной точки. При установке этого бита также будет сгенерировано прерывание. 10. Микроконтроллер переносит принятые данные из памяти конечной точки в свою память путем чтения регистра UDP_FDRx конечной точки. 11. Микроконтроллер оповещает аппаратуру USB, что он закончил чтение FIFO путем очистки RX_DATA_BK1 в регистре UDP_CSRx конечной точки. 12. После этого четвертый пакет Data OUT может быть принят аппаратурой USB и скопирован в банк 0 FIFO.
Рис. 34-11. Data OUT Transfer для конечной точки с ping-pong
Примечание: если флаги RX_DATA_BK0 или RX_DATA_BK1 установлены, то прерывание ожидает своей обработки.
ВНИМАНИЕ: когда оба бита RX_DATA_BK0 и RX_DATA_BK1 установлены, то нет способа определить, какой из них нужно очистить сначала, а какой потом. Таким образом, firmware микроконтроллера должно хранить внутренний счетчик, чтобы знать, какой из битов нужно очистить. Эта ситуация может произойти тогда, когда firmware пропустило из-за своей занятости момент первой установки одного из битов, и сразу 2 банка, один за другим, были заполнены хостом USB. Как только firmware вернется к обработке драйвера USB, то оно увидит, что установлены сразу 2 флага, RX_DATA_BK0 и RX_DATA_BK1.
34.5.2.8 Оповещение о приостановке (Stall Handshake)
Для дополнительной информации по stall handshake обратитесь в часть 8 спецификации USB (Universal Serial Bus Specification, Rev 2.0). Stall handshake может быть использовано в двух различных случаях:
- используется функциональная приостановка (functional stall), чтобы остановить использование какой-либо функции, связанной с конечной точкой. Подробнее о фиче halt см. Часть 9 спецификации USB (Universal Serial Bus Specification, Rev 2.0). - чтобы отменить, прервать текущий запрос, используется protocol stall, однако эта ситуация уникальна для управляющей передачи.
Следующая процедура генерирует пакет приостановки (stall packet):
1. Микроконтроллер устанавливает флаг FORCESTALL в регистре UDP_CSRx конечной точки. 2. Хост USB принимает stall packet. 3. Микроконтроллер будет оповещен о том, что аппаратура USB отправила stall путем опроса установлен или нет флаг STALLSENT. При этом, если STALLSENT был установлен, генерируется прерывание конечной точки. Чтобы очистить это прерывание, микроконтроллер должен сбросить STALLSENT.
Когда принята транзакция setup после stall handshake, то флаг STALLSENT должен быть сброшен для предотвращения прерываний, которые возникнут из-за того, что STALLSENT установлен.
Рис. 34-12. Stall Handshake (Data IN Transfer)
Рис. 34-13. Stall Handshake (Data OUT Transfer)
34.5.3 Управление состояниями устройства (Controlling Device States)
Устройство USB может находиться в одном из нескольких возможных состояний. См. также Часть 9 спецификации USB (Universal Serial Bus Specification, Rev 2.0).
Рис. 34-14. Диаграмма состояний устройства USB
Переход из одного состояния в другое зависит от состояния шины USB или от стандартных запросов, которые переданы через транзакции управления на конечную точку по умолчанию (default endpoint или control endpoint, конечная точка с номером 0).
После периода неактивности шины, устройство USB входит в Режим Приостановки (Suspend Mode). При этом обязательно нужно продолжать принимать запросы Suspend/Resume от хоста USB. Для устройств, питаемых от шины USB, ограничения в Suspend Mode очень значительные, устройство USB не должно потреблять больше 500 мкА от шины USB (провод VBUS интерфейса USB).
Хост может вывести устройство USB из состояния Suspend Mode путем отправки сигнала возобновления resume (активность шины), или также устройство USB может отправить запрос на пробуждение хосту. Например, это используется для вывода Windows из режима сна, если подвигать USB-мышь.
Возможность пробуждения (wake up feature) не является обязательной в реализации для всех устройств, и эта фича должна быть согласована с хостом USB.
34.5.3.1 Состояние "не запитано" (Not Powered State)
Устройства USB, которые имеют собственных источник питания (они не питаются от VBUS), могут детектировать уровень на проводе VBUS с использованием ножки PIO, как было показано ранее в примере типичной физической реализации интерфейса USB (см. раздел 34.4). Когда устройство USB не подключено к хосту, то энергопотребление устройства может быть снижено путем запрета тактов MCK для периферии UDP, запрета тактов UDPCK и запрета трансивера. Ножки DDP и DDM должны быть притянуты к GND резисторами 330 кОм.
34.5.3.2 Вход в состояние "подключено" (Entering Attached State)
Когда устройство подключено, то DP и DM сигналы USB притянуты к GND резисторами pull-down 15 кОм, которые встроены в нисходящие (downstream) порты хаба. Когда устройство подключается к downstream порту хаба, то устройство USB подключает к DP свой pull-up резистор 1.5 кОм. Шина USB переходит в состояние IDLE, DP притягивается вверх устройством USB через этот резистор к 3.3V, и DM притягивается вниз резистором 15 кОм хоста.
ВНИМАНИЕ: для записи в регистр UDP_TXVC должно быть разрешено тактирование MCK для UDP. Это делается путем программирования контроллера управления питанием (Power Management Controller, PMC).
После подключения pull-up устройство USB переходит в состояние "запитано" (Powered State). В этом состоянии тактирование UDPCK и MCK должно быть разрешено в PMC. Трансивер пока может оставаться запрещенным.
34.5.3.3 Переход от Powered State в Default State (состояние по умолчанию)
После своего подключения к хосту, устройство USB ждет сигнала сброса по шине (end-of-bus reset). После прихода такого сигнала устанавливается немаскируемый флаг ENDBUSRES в регистре UDP_ISR, и сработает прерывание.
Как только сработает прерывание от ENDBUSRES, устройство переходит в Default State. В этом состоянии firmware для UDP должно делать следующее: - разрешить default endpoint, установив флаг EPEDS в регистре UDP_CSR[0] и, что необязательно, разрешить прерывание для конечной точки 0 путем записи 1 в регистр UDP_IER. Процесс энумерации начнется через управляющую передачу (control transfer). - сконфигурировать регистр маски прерываний, который был сброшен при обнаружении сброса по шине USB (USB reset detection). - разрешить трансивер путем очистки флага TXVDIS в регистре UDP_TXVC.
В этом состоянии тактовые частоты UDPCK и MCK должны быть разрешены.
ВНИМАНИЕ: каждый раз при срабатывании прерывания ENDBUSRES будет автоматически (аппаратно) сброшен регистр маски прерываний (Interrupt Mask Register) и все регистры UDP_CSR.
34.5.3.4 Переход от состояния по умолчанию (Default State) в состояние адресации (Address State)
После установки стандартного запроса адреса устройства (address standard device request), периферийное устройство USB хоста переходит в состояние "адресовано" (address state).
ВНИМАНИЕ: перед тем, как устройство войдет в address state, оно должно достичь транзакции Status IN в управляющей передаче, например устройство UDP устанавливает свой новый адрес в момент, когда принят и очищен флаг TXCOMP в регистре UDP_CSR[0].
Для перехода в address state программное обеспечение firmware драйвера устанавливает флаг FADDEN в регистре UDP_GLB_STAT, устанавливает новый адрес, и устанавливает бит FEN в регистре UDP_FADDR.
34.5.3.5 Переход из Address State в состояние "сконфигурировано" (Configured State)
Как только был принят и подтвержден допустимый стандартный запрос Set Configuration (установка конфигурации), устройство USB разрешает работу своих конечных точек, которые соответствуют текущей конфигурации. Это осуществляется путем установки полей EPEDS и EPTYPE в регистрах UDP_CSRx и, что необязательно, может быть разрешены соответствующие прерывания в регистре UDP_IER.
34.5.3.6 Вход в состояние "приостановлено" (Suspend State)
Когда определено состояние приостановки (нет активности на шине USB), устанавливается сигнал RXSUSP в регистре UDP_ISR. Это вызовет срабатывание прерывания, если установлен соответствующий бит в регистре UDP_IMR (регистр маски прерываний UDP). Флаг RXSUSP очищается путем записи в регистр UDP_ICR. После этого устройство входит в режим приостановки (Suspend Mode).
В режиме приостановки устройства, питающиеся от шины USB, должны потреблять не более 500 мкА от +5V VBUS. Например, микроконтроллер должен переключиться на низкую тактовую частоту, запретить PLL и главный генератор, и перейти в режим ожидания (Idle Mode). Также необходимо выключить все другие внешние устройства, которые могут потреблять лишний ток.
Тактирование аппаратуры USB в микроконтроллере может быть выключено. Событие возобновления (Resume event) будет детектироваться асинхронно. Такты MCK и UDPCK могут быть выключены в контроллере управления питанием (PMC), и также может быть запрещен трансивер USB путем установки поля TXVDIS в регистре UDP_TXVC.
ВНИМАНИЕ: операции чтения и записи регистров UDP возможны только в том случае, если разрешены такты MCK для периферии UDP. Отключение MCK для UDP должно быть последней операцией, и оно должно произойти после записи UDP_TXVC и подтверждения RXSUSP.
34.5.3.7 Прием сигнала возобновления от хоста (Host Resume)
В режиме приостановки события возобновления (resume event) по шине USB будет детектироваться асинхронно, при этом трансивер и тактовые частоты для UDP могут быть запрещены (однако резистор pull-up не должен быть отключен).
Как только на шине детектировано событие resume, в регистре UDP_ISR будет установлен сигнал WAKEUP. Это может вызвать генерацию прерывания, если установлен соответствующий бит в регистре UDP_IMR. Это прерывание может использоваться для того, чтобы разбудить ядро микроконтроллера, разрешения PLL, главных генераторов и конфигурирования тактовых частот.
ВНИМАНИЕ: операции чтения, записи регистров UDP разрешены только тогда, когда разрешена тактовая частота MCK для периферии UDP. Такты MCK для UDP должны быть разрешены перед очисткой бита WAKEUP в регистре UDP_ICR и перед очисткой TXVDIS в регистре UDP_TXVC.
34.5.3.8 Отправка хосту сигнала пробуждения (Device Remote Wakeup)
В состоянии Suspend также возможно разбудить хост путем отправки ему внешнего сигнала для возобновления работы (external resume). Это делается следующим образом:
- устройство должно подождать как минимум 5 мс после момента входа в состояние suspend, перед тем как можно будет отправить сигнал resume. - далее устройство на 10 мс должно подключить утечку тока (drain current), чем оно вызовет состояние K для пробуждения хоста. - устройство должно удерживать состояние K от 1 до 15 мс для пробуждения хоста.
Чтобы установить состояние K на шине, нужно подтянуть сигнал DM к 3.3V, а DP подтянуть к GND. Для этого можно использовать транзистор, чтобы подключить pull-up к DM. Состояние K будет получено путем запрета pull-up на DP и разрешения pull-up на DM. Это все должно делаться под управлением firmware микроконтроллера.
Рис. 34-15. Пример схемы для генерации состояния K
Пояснения к схеме:
PIO - ножка микроконтроллера, настроенная как выходной порт для управления транзистором.
DM - провод D-, который используется в интерфейсе USB для передачи данных (вместе с проводом D+).
[34.6 Интерфейс пользователя USB Device Port (UDP)]
В таблице 34-4 показаны регистры UDP, через которые к нему может получить доступ программа firmware микроконтроллера. Через эти регистры происходит управление параметрами UDP, получение состояния UDP, опрашивается статус прерываний, осуществляется обмен данными с FIFO.
ВНИМАНИЕ: перед любыми операциями чтения и записи регистров (включая регистр UDP_TXCV) должна быть разрешена тактовая частота MCK для периферии UDP. Это делается путем программирования PMC.
Таблица 34-4. Карта регистров UDP
Смещение(3) |
Назначение регистра |
Имя регистра (мнемоника)
|
Тип доступа к регистру |
Состояние после сброса |
0x000 |
Frame Number Register (регистр номера фрейма) |
UDP_FRM_NUM |
Только чтение |
0x00000000 |
0x004 |
Global State Register (регистр общего состояния) |
UDP_GLB_STAT |
Чтение и запись |
0x00000000 |
0x008 |
Function Address Register (функциональный регистр адреса) |
UDP_FADDR |
Чтение и запись |
0x00000100 |
0x00C |
зарезервировано |
- |
- |
- |
0x010 |
Interrupt Enable Register (регистр разрешения прерываний) |
UDP_IER |
Только запись |
|
0x014 |
Interrupt Disable Register (регистр запрета прерываний) |
UDP_IDR |
Только запись |
|
0x018 |
Interrupt Mask Register (регистр маскирования прерываний) |
UDP_IMR |
Только чтение |
0x00001200 |
0x01C |
Interrupt Status Register (регистр статуса прерываний) |
UDP_ISR |
Только чтение |
-(1) |
0x020 |
Interrupt Clear Register (регистр очистки прерываний) |
UDP_ICR |
Только запись |
|
0x024 |
зарезервировано |
- |
- |
- |
0x028 |
Reset Endpoint Register (регистр сброса конечной точки) |
UDP_RST_EP |
Чтение и запись |
|
0x02C |
зарезервировано |
- |
- |
- |
0x030 + 4*ept_num(4) |
Endpoint Control and Status Register (регистр для управления конечной точкой и получения её состояния) |
UDP_CSR |
Чтение и запись |
0x00000000 |
0x050 + 4*ept_num(4) |
Endpoint FIFO Data Register (регистр данных FIFO конечной точки) |
UDP_FDR |
Чтение и запись |
0x00000000 |
0x070 |
зарезервировано |
- |
- |
- |
0x074 |
Transceiver Control Register (регистр управления приемопередатчиком) |
UDP_TXVC(2) |
Чтение и запись |
0x00000000 |
0x078 .. 0x0FC |
зарезервировано |
- |
- |
- |
Примечания: 1. Для UDP_ISR не определено состояние после сброса. 2. См. предупреждение о необходимости установки тактовой частоты MCK. 3. Указано байтовое смещение относительно базового адреса UDP 0xFFFB0000. Таким образом, чтобы узнать абсолютный адрес регистра, нужно к значению 0xFFFB0000 прибавить смещение. Все адреса регистров байтовые, регистры адресуются по адресу своего младшего байта. Регистры 32-разрядные, т. е. под один регистр отводится 4 байта в адресном пространстве. 4. Параметр ept_num в формуле вычисления смещения адреса - номер конечной точки, начинающийся с нуля. Конечная точка с номером 0 - это default endpoint, конечная точка для управления (см. Словарик).
34.6.1 UDP Frame Number Register (регистр номера фрейма)
Имя регистра (мнемоника): UDP_FRM_NUM Возможные типы доступа к регистру: read-only (только чтение)
FRM_NUM[10:0] номер фрейма, как задано в формате поля пакета. Это 11-битная величина, которая увеличивается на 1 хостом при генерации каждого нового фрейма. Эта величина обновляется при каждом получении нового начала фрейма - сигнал Start of Frame, SOF (или Start of Frame End of Packet, SOF_EOP). Период повторения фрейма выдерживается очень точно, и он равен 1 мс.
FRM_ERR Frame Error, ошибка фрейма. Этот бит устанавливается в момент SOF_EOP, когда принятый пакет SOF содержит ошибку. Этот бит сбрасывается при приеме SOF_PID (идентификатор пакета).
FRM_OK фрейм в порядке. Этот бит устанавливается в момент SOF_EOP, когда безошибочно принят пакет SOF. Этот бит сбрасывается при приеме SOF_PID (идентификатор пакета). В регистре статуса прерывания UDP_ISR при приеме SOF_PID обновляется статус прерывания SOF. Этот бит устанавливается без ожидания EOP.
Примечание: в 8-битном регистровом интерфейсе бит FRM_OK имеет номер 4 в FRM_NUM_H, и бит FRM_ERR имеет номер 3 в FRM_NUM_L.
34.6.2 UDP Global State Register (регистр глобального состояния UDP)
Имя регистра (мнемоника): UDP_GLB_STAT Возможные типы доступа к регистру: read-write (чтение и запись)
Этот регистр используется для получения и установки состояния устройства USB, как описано в Части 9 спецификации USB (USB Serial Bus Specification, Rev.2.0).
FADDEN разрешение функции адресации.
Чтение: 0 = устройство не находится в состоянии адресации (address state). 1 = устройство в состоянии адресации.
Запись: 0 = не дает никакого эффекта, только сброс может вернуть устройство обратно в состояние по умолчанию (default state). 1 = переведет устройство в состояние адресации. Это происходит после успешного запроса Set Address. При этом заранее должен быть инициализирован регистр UDP_FADDR параметрами из Set Address. Set Address должен завершить стадию статуса Status Stage перед установкой FADDEN. За подробностями обратитесь к Части 9 спецификации USB (USB Serial Bus Specification, Rev.2.0).
CONFIG сконфигурировано.
Чтение: 0 = устройство не сконфигурировано (не в состоянии configured state). 1 = устройство сконфигурировано.
Запись: 0 = переводит устройство в состояние "не сконфигурировано". 1 = переводит устройство в состояние "сконфигурировано".
Устройство устанавливается в сконфигурированное состояние, когда оно в состоянии адресации и успешно приняло запрос Set Configuration. За подробностями обратитесь к Части 9 спецификации USB (USB Serial Bus Specification, Rev.2.0).
34.6.3 UDP Function Address Register (функциональный регистр адреса)
Имя регистра (мнемоника): UDP_FADDR Возможные типы доступа к регистру: read-write (чтение и запись)
FADD[6:0] значение адреса функции. В это поле firmware микроконтроллера должно записать адрес, как только устройство получило его в успешно принятом от хоста запросе установки адреса, и было достигнуто состояние статуса в управляющей последовательности (эта последовательность не относится к обмену данными). За подробностями обратитесь к Части 9 спецификации USB (USB Serial Bus Specification, Rev.2.0). После подачи питания или сброса значение адреса функции устанавливается в 0.
FEN разрешение функции.
Чтение: 0 = функция конечной точки запрещена. 1 = функция конечной точки разрешена.
Запись: 0 = запрещает функцию конечной точки. 1 = значение по умолчанию.
Бит разрешения функции (FEN) позволяет микроконтроллеру разрешить или запретить функцию конечных точек. Микроконтроллер устанавливает этот бит после приема сброса от хоста. Как только этот бит установлен, устройство USB может получить и передать пакеты данных от хоста и к хосту.
34.6.4 UDP Interrupt Enable Register (регистр разрешения прерываний)
Имя регистра (мнемоника): UDP_IER Возможные типы доступа к регистру: write-only (только запись)
EPOINT, EP1INT, EP2INT, EP3INT, EP4INT, EP5INT разрешение прерываний для конечных точек 0, 1, 2, 3, 4, 5 соответственно.
Запись нуля в эти биты не дает никакого эффекта, а запись 1 разрешает прерывание для соответствующей конечной точки.
RXSUSP разрешение прерывания по событию приостановки (Suspend). Запись нуля в этот бит не дает никакого эффекта, а запись 1 разрешает прерывание.
RXRSM разрешение прерывания по событию возобновления работы (Resume). Запись нуля в этот бит не дает никакого эффекта, а запись 1 разрешает прерывание.
SOFINT разрешение прерывания по событию SOF (начало фрейма). Запись нуля в этот бит не дает никакого эффекта, а запись 1 разрешает прерывание.
WAKEUP разрешение прерывания от события пробуждения на шине. Запись нуля в этот бит не дает никакого эффекта, а запись 1 разрешает прерывание.
34.6.5 UDP Interrupt Disable Register (регистр запрета прерываний)
Имя регистра (мнемоника): UDP_IDR Возможные типы доступа к регистру: write-only (только запись)
EPOINT, EP1INT, EP2INT, EP3INT, EP4INT, EP5INT запрет прерываний для конечных точек 0, 1, 2, 3, 4, 5 соответственно.
Запись нуля в эти биты не дает никакого эффекта, а запись 1 запрещает прерывание для соответствующей конечной точки.
RXSUSP запрет прерывания по событию приостановки (Suspend). Запись нуля в этот бит не дает никакого эффекта, а запись 1 запрещает прерывание.
RXRSM запрет прерывания по событию возобновления работы (Resume). Запись нуля в этот бит не дает никакого эффекта, а запись 1 запрещает прерывание.
SOFINT запрет прерывания по событию SOF (начало фрейма). Запись нуля в этот бит не дает никакого эффекта, а запись 1 запрещает прерывание.
WAKEUP запрет прерывания от события пробуждения на шине. Запись нуля в этот бит не дает никакого эффекта, а запись 1 запрещает прерывание.
34.6.6 UDP Interrupt Mask Register (регистр маски прерываний)
Имя регистра (мнемоника): UDP_IMR Возможные типы доступа к регистру: read-only (только чтение)
EPOINT, EP1INT, EP2INT, EP3INT, EP4INT, EP5INT по значению этих бит можно узнать, разрешено или запрещено прерывание по событиям для конечных точек 0, 1, 2, 3, 4, 5 соответственно. Если прочитан 0, то прерывание для соответствующей конечной точки запрещено, если прочитана 1, то разрешено.
RXSUSP состояние запрета прерывания по событию приостановки (Suspend). Если прочитан 0, то прерывание запрещено, если прочитана 1, то разрешено.
RXRSM состояние запрета прерывания по событию возобновления работы (Resume). Если прочитан 0, то прерывание запрещено, если прочитана 1, то разрешено.
SOFINT состояние запрета прерывания по событию SOF (начало фрейма). Если прочитан 0, то прерывание запрещено, если прочитана 1, то разрешено.
BIT12 просто бит номер 12. Для чего он нужен, непонятно. Этот бит не может быть замаскирован, и он всегда читается как 1.
WAKEUP состояние запрета прерывания от события пробуждения на шине. Если прочитан 0, то прерывание запрещено, если прочитана 1, то разрешено.
Примечание: когда работа USB блокирована в suspend mode, firmware микроконтроллера может выключить аппаратную логику USB. В этом случае любые запросы на возобновление работы от хоста будут приняты во внимание, и таким образом, значение сброса бита RXRSM будет разрешено.
34.6.7 UDP Interrupt Status Register (регистр статуса прерывания)
Имя регистра (мнемоника): UDP_ISR Возможные типы доступа к регистру: read-only (только чтение)
EPOINT, EP1INT, EP2INT, EP3INT, EP4INT, EP5INT по значению этих бит можно узнать, от какой конечной точки произошло прерывание - для конечных точек 0, 1, 2, 3, 4, 5 соответственно. Если прочитан 1, то было прерывание для соответствующей конечной точки. Причин генерации прерывания от конечной точки может быть несколько. Эту причину можно определить по значению регистра UDP_CSRx (x = 0..5), если установлены биты RXSETUP, RX_DATA_BK0, RX_DATA_BK1, TXCOMP, STALLSENT (см. далее описание регистра UDP_CSRx).
Бит EP0INT является "липким битом" (sticky bit). Прерывание останется активным, пока не будет очищен EP0INT записью соответствующего бита в регистр UDP_CSR0.
RXSUSP состояние прерывания по событию приостановки (Suspend). Если прочитана 1, то возникло прерывание по событию приостановки. Аппаратура устройства USB автоматически устанавливает этот бит, когда на шине нет активности уже 3 мс. При этом устройство USB переходит в режим приостановки.
RXRSM состояние прерывания по событию возобновления работы (Resume). Если прочитана 1, то произошло событие возобновления. Аппаратура устройства USB автоматически устанавливает этот бит, когда детектирован сигнал возобновления. После сброса состояние этого бита не определено, и firmware микроконтроллера должно сбросить этот флаг путем установки флага RXRSM в регистре UDP_ICR.
SOFINT состояние прерывания по событию SOF (начало фрейма). Если прочитана 1, то произошло событие SOF. Это прерывание возникает каждый раз, когда детектируется токен SOF. Это используется как сигнал синхронизации на изохронных конечных точках.
ENDBUSRES сигнал прерывания от события конца сброса по шине (End of BUS Reset). Если в бите прочитана 1, то это прерывание ожидает своей обработки. Прерывание от конца сброса по шине возникает всякий раз по окончании последовательности UDP reset. Аппаратура устройства USB должна быть подготовлена для приема запросов на конечной точке 0. Хост начинает энумерацию, и затем выполняет конфигурирование.
WAKEUP состояние прерывания от события пробуждения на шине, если прочитана 1. Возникает всякий раз, когда хост отправляет сигнал RESUME или RESET.
После сброса микроконтроллера состояние этого бита не определено, firmware микроконтроллера должно очистить этот бит путем установки флага WAKEUP в регистре UDP_ICR.
34.6.8 UDP Interrupt Clear Register (регистр очистки прерываний)
Имя регистра (мнемоника): UDP_ICR Возможные типы доступа к регистру: write-only (только запись)
RXSUSP очистка состояния прерывания по событию приостановки (Suspend). Запись 0 не дает никакого эффекта, а запись 1 сбрасывает состояние этого прерывания.
RXRSM очистка состояния прерывания по событию возобновления работы (Resume). Запись 0 не дает никакого эффекта, а запись 1 сбрасывает состояние этого прерывания.
SOFINT очистка состояния прерывания по событию SOF (начало фрейма). Запись 0 не дает никакого эффекта, а запись 1 сбрасывает состояние этого прерывания.
ENDBUSRES очистка состояния прерывания от события конца сброса по шине (End of BUS Reset). Запись 0 не дает никакого эффекта, а запись 1 сбрасывает состояние этого прерывания.
WAKEUP очистка состояния прерывания от события пробуждения на шине. Запись 0 не дает никакого эффекта, а запись 1 сбрасывает состояние этого прерывания.
34.6.9 UDP Reset Endpoint Register (регистр сброса конечной точки)
Имя регистра (мнемоника): UDP_RST_EP Возможные типы доступа к регистру: read-write (чтение и запись)
EP0, EP1, EP2, EP3, EP4, EP5 запись в эти биты вызывает сброс соответствующей конечной точки 0, 1, 2, 3, 4, 5. При этом сбрасываются в 0 указатели FIFO, поле RXBYTECNT в регистре UDP_CSRx будет читаться как 0.
Флаг EPx используется для сброса FIFO, связанного с конечной точкой, а также для сброса RXBYTECOUNT в регистре UDP_CSRx. Это также сбросит переключение данных в состояние DATA0. Сброс конечной точки полезен после удаления состояния HALT на конечной точке типа BULK. Обратитесь за подробной информацией к Части 5.8.5 спецификации USB (USB Serial Bus Specification, Rev.2.0).
ВНИМАНИЕ: этот флаг должен быть сброшен по окончании сброса. Он не очищает флаги регистра UDP_CSRx.
34.6.10 UDP Endpoint Control and Status Register (регистр управления конечной точкой и получения её состояния)
Имя регистра (мнемоника): UDP_CSRx (x = 0..5) Возможные типы доступа к регистру: read-write (чтение и запись)
ВНИМАНИЕ: из-за синхронизации между MCK и UDPCK код firmware микроконтроллера должен ожидать окончания операции записи перед выполнением другой записи путем опроса битов, которые должны быть установлены/очищены. Пример:
//! Очистка флагов регистра UDP_CSR и ожидание момента синхронизации
#define Udp_ep_clr_flag(pInterface, endpoint, flags) {
pInterface->UDP_CSR[endpoint] &= ~(flags);
while ( (pInterface->UDP_CSR[endpoint] & (flags)) == (flags) );
}
//! Установка флагов регистра UDP_CSR и ожидание момента синхронизации
#define Udp_ep_set_flag(pInterface, endpoint, flags) {
pInterface->UDP_CSR[endpoint] |= ~(flags);
while ( (pInterface->UDP_CSR[endpoint] & (flags)) != (flags) );
}
Примечание: в окружении вытесняющей многозадачности (preemptive environment) очистка и установка флага, и ожидание составит по времени 1 такт UDPCK и 1 такт периферии. Однако флаги RX_DATA_BK0, TXPKTRDY, RX_DATA_BK1 требуют ожидания 3 такта UDPCK и 3 тактов периферии перед получением доступа к DPR.
TXCOMP сгенерирован пакет IN с предварительно записанными в DPR данными. Этот флаг генерирует прерывание, когда он установлен в 1.
Запись (очищается firmware микроконтроллера): 0 = очистка флага, очистка состояния прерывания. 1 = не дает никакого эффекта.
Чтение (флаг устанавливается аппаратурой устройства USB): 0 = транзакция Data IN не подтверждена хостом. 1 = транзакция Data IN подтверждена хостом.
После выдачи транзакции Data IN путем установки TXPKTRDY код firmware микроконтроллера ждет флага TXCOMP, чтобы удостовериться в подтверждении транзакции хостом.
RX_DATA_BK0 прием данных банка 0. Этот флаг генерирует прерывание, когда установлен в 1.
Запись (очищается firmware микроконтроллера): 0 = оповещает аппаратуру устройства USB, что данные прочитаны из банка 0 FIFO. 1 = чтобы оставить значение чтения неизменным.
Чтение (флаг устанавливается аппаратурой устройства USB): 0 = в банк 0 FIFO не принят пакет данных. 1 = получен пакет данных и сохранен в банке 0 FIFO.
Когда firmware опрашивает этот бит, или когда произошло прерывание по этому биту, то firmware должно переместить данные из FIFO во внутреннюю память микроконтроллера. Количество принятых байт можно узнать в поле RXBYTECNT. Данные банка 0 FIFO вычитываются через чтение регистра UDP_FDRx. Как только перемещение данных завершено, firmware должно освободить банк 0 для аппаратуры USB путем очистки бита RX_DATA_BK0.
После установки или сброса этого бита нужно подождать 3 такта UDPCK и 3 такта периферии перед осуществлением доступа к DPR.
RXSETUP принят пакет Setup. Этот флаг генерирует прерывание, когда установлен в 1.
Чтение: 0 = не было пакета настройки. 1 = хостом отправлен пакет настройки, этот пакет находится в FIFO и доступен для чтения.
Запись: 0 = firmware микроконтроллера оповещает аппаратуру USB, что настроечные данные прочитаны из FIFO. 1 = не дает никакого эффекта.
Этот флаг используется для оповещения firmware устройства USB, что хостом отправлен пакет настройки, и этот пакет успешно принят аппаратурой USB. Код firmware может переместить данные Setup из FIFO в память микроконтроллера путем чтения регистра UDP_FDRx. Как только перемещение данных завершено, код firmware должен очистить бит RXSETUP.
Во время установленного бита RXSETUP транзакции Data OUT не принимаются.
STALLSENT отправлен пакет Stall (конечная точка управления, конечные точки Bulk Interrupt) / произошла ошибка ISOERROR (изохронные конечные точки). Этот флаг генерирует прерывание, когда установлен в 1.
Бит STALLSENT завершает STALL handshake.
Чтение: 0 = хост не подтвердил STALL. 1 = хост подтвердил останов по ошибке (stall).
Запись: 0 = сброс флага STALLSENT, очистка прерывания. 1 = не дает никакого эффекта.
Для firmware микроконтроллера обязательно нужно очистить этот флаг. Иначе останется активным прерывание.
Для подробностей по STALL handshake обратитесь к Частям 8.4.5 и 9.4.5 спецификации USB (USB Serial Bus Specification, Rev.2.0).
ISOERROR была детектирована ошибка CRC в изохронной передаче. Этот флаг генерирует прерывание, когда установлен в 1.
Чтение: 0 = в предыдущей изохронной передаче не было ошибки. 1 = была ошибка CRC, так что данные в FIFO содержат ошибку.
Запись: 0 = сброс флага ISOERROR, очистка прерывания. 1 = не дает никакого эффекта.
TXPKTRDY все готово для передачи пакета. Этот флаг очищается аппаратурой устройства USB, и устанавливается firmware микроконтроллера.
Чтение: 0 = можно установить в 1, чтобы отправить данные из FIFO. 1 = данные ожидают своей отправки по принятию токена IN.
Запись: 0 = может быть записан 0, если старое значение было 0. 1 = firmware микроконтроллера записало в буфер FIFO полезную нагрузку, и она готова к отправке.
Этот флаг используется для генерации транзакции Data IN (передача данных от устройства USB к хосту USB). Код firmware микроконтроллера проверяет этот флаг на предмет очистки, когда нужно отправить хосту данные. Если этот флаг в нуле, то данные для передачи записываются в FIFO конечной точки через регистр UDP_FDRx. Как только все данные были записаны в FIFO, код firmware оповещает об этом аппаратуру USB путем установки бита TXPKTRDY в 1. После этого могут начаться транзакции шины USB. После того, как данные будут получены хостом, будет установлен флаг TXCOMP.
После установки или сброса этого бита нужно подождать 3 такта UDPCK и 3 такта периферии перед осуществлением доступа к DPR.
FORCESTALL запуск процедуры останова (Force Stall). Используется конечными точками Control, Bulk и Isochronous.
Чтение: 0 = нормальное состояние. 1 = состояние Stall.
Запись: 0 = возврат в нормальное состояние. 1 = отправка хосту STALL.
Для подробностей по STALL handshake обратитесь к Частям 8.4.5 и 9.4.5 спецификации USB (USB Serial Bus Specification, Rev.2.0).
Конечная точка Control: во время стадии данных (data stage) и во время стадии статуса (status stage) этот бит показывает, что микроконтроллер не может выполнить запрос.
Конечные точки Bulk и Interrupt: этот бит оповещает хост, что конечная точка остановлена (halted).
Когда хост подтверждает STALL, то firmware оповещается об этом флагом STALLSENT.
RX_DATA_BK1 прием данных банка 1. Используется только конечными точками с атрибутами ping-pong. Этот флаг генерирует прерывание, когда установлен в 1.
Запись (очищается firmware микроконтроллера): 0 = оповещает аппаратуру устройства USB, что данные прочитаны из банка 1 FIFO. 1 = чтобы оставить значение чтения неизменным.
Чтение (флаг устанавливается аппаратурой устройства USB): 0 = в банк 1 FIFO не принят пакет данных. 1 = получен пакет данных и сохранен в банке 1 FIFO.
Когда firmware опрашивает этот бит, или когда произошло прерывание по этому биту, то firmware должно переместить данные из FIFO во внутреннюю память микроконтроллера. Количество принятых байт можно узнать в поле RXBYTECNT. Данные банка 1 FIFO вычитываются через чтение регистра UDP_FDRx. Как только перемещение данных завершено, firmware должно освободить банк 1 для аппаратуры USB путем очистки бита RX_DATA_BK1.
После установки или сброса этого бита нужно подождать 3 такта UDPCK и 3 такта периферии перед осуществлением доступа к DPR.
DIR направление передачи (только для контрольной точки управления Control).
Чтение и запись: 0 = разрешает транзакции Data OUT в стадии данных управления (control data stage). 1 = разрешает транзакции Data IN в стадии данных управления (control data stage).
Для подробностей по control data stage обратитесь к Частям 8.5.3 спецификации USB (USB Serial Bus Specification, Rev.2.0).
Этот бит должен быть установлен перед очисткой RXSETUP (регистр UDP_CSRx) по окончании стадии setup. В соответствии с отправленным запросом в пакете setup data, на стадии данных должна быть передача либо от устройства к хосту (DIR = 1), либо от хоста к устройству (DIR = 0). Необязательно проверять этот бит для обратного направления в стадии статуса.
EPTYPE[2:0] тип конечной точки.
Чтение и запись:
000 |
Control (управление) |
001 |
Isochronous OUT |
101 |
Isochronous IN |
010 |
Bulk OUT |
110 |
Bulk IN |
011 |
Interrupt OUT |
111 |
Interrupt IN |
DTGLE переключение данных (Data Toggle)
Только чтение: 0 = идентифицируют пакет DATA0. 1 = идентифицируют пакет DATA1.
Для подробностей по определениям пакетов DATA0, DATA1 обратитесь к Части 8 спецификации USB (USB Serial Bus Specification, Rev.2.0).
EPEDS запрет и разрешение конечной точки.
Чтение: 0 = конечная точка запрещена. 1 = конечная точка разрешена.
Запись: 0 = запрет конечной точки. 1 = разрешение конечной точки.
Конечная точка управления (конечная точка с номером 0) всегда разрешена, так что запись в это поле для конечной точки управления не дает никакого эффекта.
Примечание: после сброса все конечные точки сконфигурированы как конечные точки управления (0).
RXBYTECNT[10:0] количество доступных байт в FIFO. Это поле доступно только для чтения.
Когда хост отправляет пакет данных к устройству, аппаратура устройства USB сохраняет принятые данные в FIFO, и оповещает об этом микроконтроллер. Микроконтроллер может загрузить данные из FIFO в свою память путем чтения RXBYTECNT байт из регистра UDP_FDRx.
34.6.11 UDP FIFO Data Register (регистр данных FIFO конечной точки)
Имя регистра (мнемоника): UDP_FDRx (x = 0..5) Возможные типы доступа к регистру: read-write (чтение и запись)
FIFO_DATA[7:0] значение данных FIFO. Микроконтроллер может проталкивать в FIFO или вынимать оттуда байты через этот регистр.
Счетчик RXBYTECNT в соответствующем регистре UDP_CSRx содержит количество байт, которое можно прочитать из FIFO (количество байт, отправленных хостом).
Максимальное количество байт для записи фиксировано значением Max Packet Size (максимальный размер пакета) в Standard Endpoint Descriptor (стандартный дескриптор конечной точки). Это количество не может быть больше размера физической памяти, связанной с конечной точкой. Для получения подробной информации обратитесь к спецификации USB (USB Serial Bus Specification, Rev.2.0).
34.6.12 UDP Transceiver Control Register (регистр управления приемопередатчиком)
Имя регистра (мнемоника): UDP_TXVC Возможные типы доступа к регистру: read-write (чтение и запись)
ВНИМАНИЕ: должны быть обязательно разрешены такты периферии UDP через программирование PMC перед любыми операциями чтения или записи регистров UDP, включая регистр UDP_TXCV.
TXVDIS запрет приемопередатчика (Transceiver Disable)
Когда UDP запрещен, то энергопотребление может быть значительно снижено путем запрета встроенного аппаратного трансивера линии USB. Это можно сделать путем установки поля TXVDIS. Чтобы разрешить работу трансивера, то нужно очистить бит TXVDIS.
Примечание: если подтягивающий резистор USB pull-up не подключен к DP, то программист не должен записывать ни в какой другой регистр UDP, кроме регистра UDP_TXVC. Причина - если сигналы DP и DM плавают около 0, или притянуты к GND, устройством будет принят SE0 вследствие сброса USB.
[Словарик]
UDP USB Device Port, встроенная в микроконтроллер ARM7 периферия для работы с портом USB.
DPR Dual Port RAM, двухпортовое ОЗУ. Это специальное ОЗУ, в которой есть отдельно вход для записи, и отдельно вход для чтения. Двухпортовое ОЗУ обычно поддерживает одновременно и запись, и чтение своего содержимого.
APB Advanced Peripheral Bus, специальная шина для обмена данными с периферийными устройствами внутри микроконтроллеров ARM7 компании Atmel.
FIFO First Input First Output, специальный буфер для обмена данными, работающий по принципу "первым пришел, первым и ушел"
VBUS шина питания +5V, которая имеется среди проводов интерфейса USB (напомню, что там всего 4 провода: VBUS, D+, D- и GND). С неё может подаваться питание на подключенное устройство USB (максимальный ток потребления либо 100, либо 500 мА, в зависимости от заданного значения в дескрипторе устройства USB).
DP D+, один из двух дифференциальных двунаправленных сигналов шины USB, по которому передаются данные. Подключение внешнего pull-up резистора к этому сигналу оповещает хост, что на шине USB активировано устройство на скорости full-speed.
DM D-, один из двух дифференциальных двунаправленных сигналов шины USB, по которому передаются данные.
GND ground, общий провод.
PLL Phase Locked Loop, ФАПЧ, фазовая автоподстройка частоты.
PMC Power Management Controller, контроллер управления питанием. Разрешает/запрещает тактирование различных периферийных устройств USB, в том числе и UDP.
Ping-pong имеется в виду переключение половинок двойного буфера конечной точки в процессе передачи данных. Пинг - включен первый буфер, в него могут аппаратно поступить или быть отосланы данные USB, а второй буфер тем временем может быть обработан микроконтроллером. Понг - теперь на месте первого буфера второй буфер, и наоборот, на месте второго буфера первый. Буферы в процессе передачи (или приема, в зависимости от типа конечной точки IN или OUT) постоянно меняются местами.
default endpoint конечная точка по умолчанию, она же управляющая конечная точка, она же конечная точка управления, она же конечная точка с номером 0. Эта конечная точка всегда должна быть в любом устройстве USB, через неё устройство USB управляется и конфигурируется, через неё хост получает информацию об устройстве USB в процессе энумерации.
[Ссылки]
1. USB in the nutshell - здесь можно найти понятное описание многих терминов, касающихся стандарта USB (конечная точка, энумерация, хост USB, ACK, NACK, состояние K, SOF, EOF, и т. п.). 2. Цоколевка разъемов USB. 3. Макетная плата AT91SAM7X. |
Комментарии
microsin: именно потому, что в даташите не объясняется термин ping-pong - предполагается, что пользователь и так сам все знает - я привел расшифровку этого термина в Словарике. К control endpoint это не имеет никакого отношения, для обмена по алгоритму ping-pong используются специальные конечные точки, к которым можно привязать двойной буфер. К двухстороннему обмену ping-pong тоже не имеет никакого отношения, этот относится к алгоритму переключения буферов при передаче данных.
RSS лента комментариев этой записи