35.5. Функциональное описание
35.5.1 Общие сведения о стандарте полноскоростной USB-связи версии 2.0
Полноскоростная USB-связь версии 2.0 позволяет установить соединение между хостом и присоединенным USB-устройством. Каждое устройство предлагает совокупность коммуникационных потоков (конвейеров), связанных с каждой конечной точкой. Программное обеспечение хоста связывается с USB-устройством через набор коммуникационных потоков.
Рисунок 35.3. Пример управления полноскоросостной USB-связью версии 2.0
35.5.1.1 Тип полноскоростной USB-связи версии 2.0
Коммуникационный поток переносится с помощью одного из четырех типов передач, определяемых USB-устройством.
Таблица 35.2. Коммуникационный поток USB
35.5.1.2 Транзакции шины USB
Передача |
Направление |
Пропускная способность |
Размер конечной точки |
Детекция ошибок |
Повторение |
Управление |
Двунаправленное |
Не гарантирована |
8, 16, 32, 64 |
Есть |
Автоматич. |
Изохронная |
Однонаправленное |
Гарантирована |
1-1023 |
Есть |
Нет |
Прерывание |
Однонаправленное |
Не гарантирована |
меньше или равно 64 |
Есть |
Есть |
Поток |
Однонаправленное |
Не гарантирована |
8, 16, 32, 64 |
Есть |
Есть |
Результатом каждой передачи является одна или более транзакций на шине USB. Существует 5 разновидностей транзакций, передаваемых по шине в пакетах:
- Транзакция "Установка".
- Транзакция "Ввод данных".
- Транзакция "Вывод данных".
- Транзакция "Ввод статуса".
- Транзакция "Вывод данных".
35.5.1.3 Определения событий USB-передачи
Как будет показано ниже, передачи - последовательность событий, происходящие на шине USB.
Таблица 35.3. События USB-передачи
Передачи "Управление" (прим. 1, 3) Транзакция "Установка" > транзакция "Ввод данных" > транзакция "Вывод статуса". |
Транзакция "Установка" > транзакция "Вывод данных" > транзакция "Ввод статуса".
Транзакция "Установка" > транзакция "Ввод статуса". |
Передача "Ввод прерывания" (в направлении устройство-хост) |
Транзакция "Ввод данных" > транзакция "Ввод данных" |
Передача "Вывод прерывания" (в направлении хост-устройство) |
Транзакция "Вывод данных" > транзакция "Вывод данных" |
Передача "Изохронный ввод" (прим. 2) (в направление устройство-хост) |
Транзакция "Ввод данных" > транзакция "Ввод данных" |
Передача "Изохронный вывод" (прим. 2) (в направлении хост-устройство) |
Транзакция "Вывод данных" > транзакция "Вывод данных" |
Передача "Ввод потока" (в направлении устройство-хост) |
Транзакция "Ввод данных" > транзакция "Ввод данных" |
Передача "Вывод потока" (в направлении хост-устройство) |
Транзакция "Вывод данных" > транзакция "Вывод данных" |
Прим.:
- Передача "Управления" должна использовать конечные точки без переключающихся банков памяти.
- Изохронные передачи должны использовать конечные точки с переключающимися банками памяти.
- Передачи "Управление" могут быть отменены с помощью процедуры квитирования останова.
35.5.2 Управление транзакциями периферийного модуля USB-устройства версии 2.0
35.5.2.1 Транзакция "Установка"
Установка - специальный тип транзакции в направлении хост-устройство, используемый в ходе передач "Управление". Передачи "Управление" должны выполняться с помощью конечных точек, которые не используют переключающихся банков памяти. Обработка транзакции "Установка" выполняется программно, как можно быстрее. Она используется для передачи запросов от хосту к устройству. После передачи, запросы обрабатываются USB-устройством и могут потребовать большего числа аргументов. Аргументы передаются в устройство с помощью транзакции "Вывод данных", которая следует за транзакцией "Установка". Данные запросы могут также возвращать данные. Данные передаются хосту транзакцией "Ввод данных", которая следует за транзакцией "Установка". Транзакция "Статус" завершает передачу управления.
После приема конечной точкой передачи "Установка":
- USB-устройство автоматически подтверждает пакет "Установка"
- устанавливается бит RXSETUP в регистре UDP_ CSRx
- генерируется прерывание конечной точки до тех пор, пока не сбросится бит RXSETUP. Если для данной конечной точки активировано прерывание, то оно поступает в микроконтроллер.
Таким образом, программа должна следить за состоянием бита RXSETUP путем опроса регистра UDP_ CSRx или ожидать прерывание, а затем считать пакет "Установка" из буфера FIFO и сбросить бит RXSETUP. RXSETUP не возможно сбросить до тех пор, пока пакет "Установка" не будет считан из буфера FIFO. В противном случае, USB-устройство должно принять следующую передачу "Вывод данных" и перезаписать его в буфер FIFO поверх пакета "Установка".
Рисунок 35.4. Транзакция "Установка", следующая за транзакцией "Вывод данных"
35.5.2.2 Транзакция "Ввод данных"
Транзакции "Ввод данных" используются в передачах "Управление", "Изохронная", "Поток" и "Прерывание" и выполняют передачу данных в направлении от устройства к хосту. В изохронных передачах транзакции "Ввод данных" должны выполняться с помощью конечных точек, которые поддерживают переключающиеся банки памяти.
35.5.2.3 Использование конечных точек без переключающихся банков памяти
Для выполнения транзакции "Ввод данных" с использованием конечной точки без переключающихся банков памяти необходимо выполнить следующую последовательность:
- Микроконтроллер проверяет возможность записи в FIFO путем опроса TXPKTRDY в регистре конечной точки UDP_ CSRx (TXPKTRDY должен быть равен нулю).
- Микроконтроллер записывает передаваемые данные в FIFO конечной точки (регистр UDP_ FDRx).
- Микроконтроллер уведомляет периферийный модуль USB о завершении записи данных путем установки TXPK-TRDY в регистре конечной точки UDP_ CSRx.
- USB-устройство уведомляет микроконтроллер об освобождении FIFO конечной точки после установки TXCOMP в регистре UDP_ CSRx конечной точки. После этого генерируется прерывание соответствующей конечной точки до тех пор, пока будет установлен бит TXCOMP.
TXCOMP устанавливается USB-устройством после приема сигнала подтверждения пакета ввода данных "ACK PID". Прерывание будет генерироваться до тех пор, пока будет установлен бит TXCOMP.
Прим: более детальную информацию по протокольному слою "Ввод данных" см. в разделе 8 "Universal Serial Bus Specification, Rev 2.0".
Рисунок 35.5. Передача "Ввод данных" для конечной точки без переключающихся банков памяти
35.5.2.4 Использование конечных точек с переключающимися банками памяти
Использование конечной точки с переключающимися банками памяти необходимо в ходе изохронной передачи. Для гарантирования постоянства пропускной способности шины микроконтроллер должен подготовить следующие данные во время передачи текущих данных USB-устройством. Таким образом, необходимо использовать два банка памяти. Когда один из банков памяти назначен микроконтроллеру, другой используется USB-устройством.
Рисунок 35.6. Переключение банков памяти в ходе передачи "Ввод данных"
При выполнении транзакций "Ввод данных" при использовании конечной точки с переключающимися банками памяти необходимо придерживаться следующей последовательности действий:
- Микроконтроллер оценивает возможность записи в FIFO путем опроса бита TXPKTRDY регистра UDP_ CSRx, который должен быть равен нулю.
- Микроконтроллер записывает первые передаваемые данные в FIFO (банк 0), помещая их в регистр конечной точки FDRx.
- Микроконтроллер уведомляет модуль USB о завершении записи данных в банк 0 FIFO путем установки бита TXPKTRDY в регистре конечной точки UDP_ CSRx.
- Микроконтроллер записывает вторую часть передаваемых данных FIFO (банк 1), не ожидая сброса TXPKTRDY, помещая их в регистр конечной точки UDP_ FDRx.
- Микроконтроллер уведомляется со стороны USB-устройства об освобождении первого банка после установки TXCOMP в регистре конечной точки UDP_ CSRx. До тех пор, пока установлен бит TXCOMP, будет генерироваться прерывание.
- Сразу после получения этого уведомления микроконтроллер сообщает USB-устройству, что подготовлена вторая часть данных для передачи, для чего устанавливает бит TXPKTRDY в регистре конечной точки UDP_ CSRx.
- На данном этапе банк 0 свободен и микроконтроллер может подготавливать третью часть данных для оправки.
Рисунок 35.7. Передача "Ввод данных" для конечной точки с переключающимися банками памяти
Предупреждение: существует одна программная критическая ситуация, вызывная тем фактом, что сразу после заполнения второго банка памяти драйвер должен ожидать TX_COMP для установки TX_PKTRDY. Если задержка между установлением TX_COMP и установлением TX_PKTRDY будет достаточно долгой, то некоторые пакеты "Ввод данных" могут оказаться без подтверждения, что снизит пропускную способность шины.
35.5.2.5 Транзакция "Вывод данных"
Транзакции "Вывод данных" используются в передачах "Управление", "Изохронная", "Поток" и "Прерывание" и выполняют передачу данных в направлении хост-устройство. Транзакции "Вывод данных" в изохронных передачах должны выполняться с помощью конечных точек, поддерживающих переключение банков памяти.
35.5.2.6 Транзакция "Вывод данных" без переключающихся банков памяти
Для выполнения транзакции "Вывод данных", использующей конечную точку без переключающихся банков, необходимо придерживаться следующей последовательности:
- Хост генерирует пакет "Вывод данных".
- Данный пакет принимается конечной точкой USB-устройства. До тех пор, пока микроконтроллер используется FIFO, связанный с данной конечной точкой, хосту возвращается идентификатор пакета "Нет подтв.". Как только FIFO станет доступным, данные в него будут записаны USB-устройством и подтверждение "Подтв." будет автоматически передано хосту.
- USB-устройство уведомляет микроконтроллер о завершении приема данных через бит RX_DATA_BK0 в регистре UDP_ CSRx. До тех пор, пока установлен бит RX_DATA_BK0, будет генерироваться прерывание.
- Количество записанных байт в FIFO можно определить по значению поля RXBYTECNT в регистре конечной точки UDP_ CSRx.
- Микроконтроллер копирует данные из памяти конечной точки в собственную память. Считывание данных из FIFO выполняется путем чтения регистра конечной точки UDP_ FDRx.
- Микроконтроллер уведомляет USB-устройство о завершении копирования путем сброса бита RX_DATA_BK0 в регистре конечной точки UDP_ CSRx.
- Новый пакет "Вывод данных" может приниматься USB-устройством.
Рисунок 35.8. Передача "Вывод данных" для конечных точек без переключающихся банков памяти
Прерывание генерируется до тех пор, пока установлен бит RX_DATA_BK0. После сброса RX_DATA_BK0 нельзя выполнять обмен содержимым памяти между USB-устройством, FIFO и памятью микроконтроллера. В противном случае, USB-устройство вынуждено будет принимать очередную передачу "Вывод данных" и перезаписывать текущий пакет "Вывод данных" в FIFO.
35.5.2.7 Использование конечных точек с переключающимися банками памяти
В ходе изохронной передачи использование конечной точки с переключающимися банками памяти является обязательным. Для гарантирования постоянства пропускной способности шины необходимо, чтобы во время приема USB-устройством текущих данных микроконтроллер мог считывать ранее переданные хостом данные. Для этого необходимо использование двух банков памяти. Когда один банк назначен микроконтроллеру, другой может использоваться USB-устройством.
Рисунок 35.9. Передача "Вывод данных" с использованием конечных точек с переключающимися банками памяти
Для выполнения транзакции "Вывод данных" при использовании конечной точки с переключающимися банками памяти необходимо придерживаться следующей процедуры:
- Хост генерирует пакет "Вывод данных".
- Данный пакет принимается конечной точкой USB-устройства. Он помещается в банк 0 FIFO конечной точки.
- USB-устройство отправляет хосту идентификатор пакета "Подтв.". Хост может незамедлительно отправить второй пакет "Вывод данных" Он принимается устройством и копируется в банк 1 FIFO.
- USB-устройство уведомляет микроконтроллер о завершении приема данных через бит RX_DATA_BK0 в регистре конечной точки UDP_ CSRx. Прерывание генерируется до тех пор, пока установлен бит RX_DATA_BK0.
- Количество принятых байт в буфер FIFO можно определить путем чтения RXBYTECNT в регистре конечной точки UDP_CSRx.
- Микроконтроллер копирует принятые конечной точкой данные в собственную память. Принятые данные становятся доступными путем чтения регистра конечной точки UDP_ FDRx.
- Микроконтроллер уведомляет USB-устройство о завершении копирования путем сброса бита RX_DATA_BK0 в регистре конечной точки UDP_ CSRx.
- Третий пакет "Вывод данных" может быть принят USB-устройством и скопирован в банк 0 FIFO.
- После приема второго пакета "Вывод данных" устанавливается флаг RX_DATA_BK1 в регистре конечной точки UDP_ CSRx для уведомления микроконтроллера о завершении приема. До тех пор пока установлен флаг RX_DATA_BK1, будет генерироваться прерывание.
- Микроконтроллер копирует принятые данные из памяти конечной точки в собственную память. Считывание принятых данных выполняется путем чтения регистра конечной точки UDP_FDRx.
- Микроконтроллер уведомляет USB-устройство о завершении копирования путем сброса RX_DATA_BK1 в регистре конечной точки UDP_ CSRx.
- Четвертый пакет "Вывод данных" может быть принят USB-устройством и скопирован в банк 0 FIFO.
Рисунок 35.10. Передача "Вывод данных" для конечной точки с переключающимися банками памяти
Прим.: прерывание генерируется до тех пор, пока установлен флаг RX_DATA_BK0 или RX_DATA_BK1.
Предупреждение: в случае, если окажутся установленными оба бита RX_DATA_BK0 и RX_DATA_BK1, то определить, какой из них был установлен первым, будет невозможно. Такая ситуация может возникнуть в случае, если во время выполнения микроконтроллером других задач USB-хост заполнил оба банка памяти USB-устройства. После возврата программы микроконтроллера к драйверу USB-связи оба флага будут установлены.
35.5.2.8 Транзакция "Статус"
Транзакция "Статус" - специальный тип транзакции между хостом и устройством, используемый только в передаче "Управление". Передача "Управление" должна выполняться только с помощью конечных точек с переключающимися банками памяти. В соответствии с последовательностью "Управление" (чтение или запись) USB-устройство отправляет или принимает транзакцию "Статус".
Рисунок 35.11. Последовательности "Чтение данных управления" и "Запись данных управления"
Прим.:
- На этапе "Ввод статуса" хост ожидает от устройства получение пакета нулевой длины (транзакция "Ввод данных" без данных), используя идентификатор пакета "Ввод данных". Более детальная информация по протокольному слою приведена в разделе 8 "Universal Serial Bus Specification, Rev. 2.0".
- На этапе "Вывод статуса" хост передает устройству пакет нулевой длины (транзакция "Вывод данных" без данных).
35.5.2.9 Передача "Ввод статуса"
Сразу после обработки запроса "Управление" устройство возвращает статус хосту с помощью транзакции "Ввод данных" нулевой длины.
- Микроконтроллер ожидает сброс TXPKTRDY в регистре конечной точки UDP_ CSRx. (по окончании данного шага бит должен быть сброшен TXPKTRDY, т.к. предыдущей транзакцией была "Установка" или "Вывод данных").
- Микроконтроллер устанавливает TXPKTRDY, не выполняя записи каких-либо данных в регистр конечной точки UDP_ FDRx. USB-устройство генерирует пакет "Ввод данных", используя идентификатор пакета "Ввод данных".
- Данный пакет подтверждается хостом, после чего устанавливается бит TXPKTRDY в регистре конечной точки UDP_ CSRx.
Рисунок 35.12. Передача "Ввод статуса", следующая за передачей "Вывод данных"
35.5.2.10 Передача "Вывод статуса"
Сразу после обработки запроса "Управление" и возврата запрашиваемых данных хост передает подтверждение путем передачи пакета нулевой длины, который представляет собой транзакцию "Вывод данных" нулевой длины.
- USB-устройство принимает пакет нулевой длины и устанавливает флаг RX_DATA_BK0 в регистре UDP_CSRx, а затем подтверждает получение пакета нулевой длины.
- USB-устройство уведомляет микроконтроллер о получении пакета нулевой длины через бит RX_DATA_BK0 в регистре UDP_ CSRx. До тех пор, пока установлен бит RX_DATA_BK0, будет генерироваться прерывание. Количество принятых байт в регистре конечной точки UDP_ BCR в этом случае будет равно нулю.
- Микроконтроллер должен сбросить RX_DATA_BK0.
Рисунок 35.13. Передача "Вывод статуса", следующая за передачей "Ввод данных"
35.5.2.11 Квитирование останова
Квитирование останова может использоваться в одной из двух различных ситуаций (более детальная информация по квитированию останова см. в разделе 8 "Universal Serial Bus Specification, Rev 2.0").
- Функциональный останов используется, когда активна функция остановки конечной точки (более детальная информация по функции остановки приведена в разделе 9 "Universal Serial Bus Specification, Rev 2.0").
- Для прекращения текущего запроса используется протокольный останов, но только с передачей "Управление". Для генерации пакета останова необходимо придерживаться следующей последовательности:
- Микроконтроллер устанавливает флаг FORCESTALL в регистре конечной точки UDP_ CSRx.
- Хост принимает пакет останова.
- USB-устройство уведомляет микроконтроллер об отправке останова путем установки бита STALLSENT. Прерывание конечной точки генерируется до тех пор, пока установлен бит STALLSENT. Для отмены прерывания микроконтроллер должен сбросить STALLSENT.
Если после квитирования останова принимается транзакция "Установка", то во избежание генерации прерываний по причине установленности флага STALLSENT его необходимо сбросить.
Рисунок 35.14. Квитирование останова (передача "Ввод данных")
Рисунок 35.15. Квитирование останова (передача "Вывод данных")
35.5.3 Управление состояниями устройства
USB-устройство поддерживает несколько состояний. См. раздел 9 "Universal Serial Bus Speci-fication, Rev 2.0".
Рисунок 35.16. Диаграмма состояний USB-устройства
Переход от одного состояния к другому зависит от состояния шины USB или стандартных запросов, отправленных посредством транзакций управления через конечную точку по умолчанию (конечная точка 0).
По окончании периода неактивности шины USB-устройство вводит режим приостановки. Получение запросов приостановки/возобновления от USB-хоста является обязательным. В режиме приостановки предъявляется жесткое требование для приложений с питанием от шины: потребление не более 500 мкА.
Находясь в режиме приостановки, хост может активизировать работу устройства путем отправки ему сигнала возобновления (активность шины). Возможно и обратное направление возобновления работы, когда USB-устройство отправляет запрос на возобновление хосту. Это, например, необходимо для возобновления работы ПК при перемещении USB-мыши.
Функция активизации должна поддерживаться хостом и не является обязательной для всех устройств.
35.5.3.1 Переход из запитанного состояния в исходное состояние
После подключения к USB-хосту USB-устройство ожидает сброс шины. USB-хост прекращает состояние сброса сразу после определения подтягивающего резистора на линии DP. После этого устанавливается немаскируемый флаг ENDBURSES в регистре UDP_ISR и запускается прерывание. Программа, управляющая UDP, разрешает конечную точку по умолчанию, устанавливая флаг EPEDS в регистре UDP_CSR[0] и, при необходимости, разрешает прерывание для конечной точки 0 путем записи 1 в регистр UDP_IER. После этого перечисление начнется с передачи "Управление".
35.5.3.2 Переход из состояния по умолчанию в адресное состояние
После поступления стандартного запроса установки адреса устройства USB-хост вводит адресное состояние. Перед этим он достигает транзакции "Ввод статуса" передачи "Управление", т.о. UDP-устройство устанавливает новый адрес сразу после приема и сброса флага TXCOMP в регистре UDP_CSR[0]. Для перехода в адресное состояние программа USB-драйвера устанавливает флаг FADDEN в регистре UDP_GLB_STATE, устанавливает новый адрес и устанавливает бит FEN в регистре UDP_FADDR.
35.5.3.3 Переход из адресного состояния в сконфигурированное состояние
Сразу после приема и подтверждения стандартного запроса установки конфигурации устройство разрешает конечные точки, соответствующие текущей конфигурации. Это выполняется путем установки полей EPEDS и EPTYPE в регистрах UDP_CSRx и, при необходимости, разрешаются соответствующие прерывания в регистре UDP_IER.
35.5.3.4 Разрешение приостановки
После выявления приостановки (отсутствие активности на шине USB) устанавливается сигнал RXSUSP в регистре UDP_ISR. Это приведет к генерации прерывания при условии, что установлен соответствующий бит в регистре UDP_IMR. Данный флаг сбрасывается путем записи в регистр UDP_ICR. После этого устройство вводит режим приостановки. В этом режиме микроконтроллер может, например, переключиться на низкочастотную синхронизацию, отключить ФАПЧ и основной генератор, а затем перейти в режим "Idle". Он также может выключить другие устройства на плате. Синхронизация USB-устройства также может быть отключена, а вот трансивер и периферийный модуль USB отключать нельзя, т.к. в противном случае невозможно будет выявить возобновление.
35.5.3.5 Прием возобновления от хоста
В режиме приостановки, USB-трансивер и модуль USB должны быть запитаны для детекции возобновления (RESUME). Однако модуль USB-устройства не может синхронизироваться, т.к. сигнал WAKEUP является асинхронным. Сразу после выявления на шине возобновления устанавливается сигнал WAKEUP в UDP_ISR. Он может генерировать прерывание, если установлен соответствующий бит в регистре UDP_IMR. Данное прерывание может использоваться для возобновления работы ядра, разрешения работы ФАПЧ и основного генератора, а также для конфигурации синхронизации. Бит WAKEUP должен быть сброшен при первой возможности путем установки WAKEUP в регистре UDP_ICR.
35.5.3.6 Отправка внешнего возобновления
Внешнее возобновление используется совместно с хостом и разрешается путем установки бита ESR в регистре UDP_ GLB_STATE. Асинхронное событие на входе ext_resume_pin периферийного устройства генерирует прерывание WAKEUP. В более ранних реализациях модуля UDP в этом случае незамедлительно генерируется К-состояние на линии USB. Это означает, что USB-устройство должно быть способным очень быстро ответить хосту. В последних версиях, сразу после готовности связи с хостом необходимо программно установить бит RMWUPE в регистре UDP_GLB_STATE, а затем уже генерируется К-состояние.
Бит WAKEUP должен быть сброшен при первой возможности путем установки WAKEUP в регистре UDP_ICR.
|