22. Работа USB-контроллера в режиме Device
22.1. Введение
Device-контроллер поддерживает передачу данных на скорости FS и LS. В дополнение к конечной точке типа CONTROL, которая доступна по умолчанию, доступны еще 6 конечных точек с конфигурируемыми режимами CONTROL, BULK, INTERRUPT и ISOCHRONOUS:
- Конечная точка 0: буфер FIF
- с программируемым размером до 64 байт; конечная точка по умолчанию; тип CONTROL
- Конечная точка 1: буфер FIF
- с программируемым размером до 256 байт в режиме ping-pong;
- Конечные точки 2…6: буфер FIF
- с программируемым размером до 64 байт в режиме ping-pong.
Контроллер начинает свою работу с режима IDLE. В этом режиме потребление оконечным каскадом сведено до минимума.
22.2. Подача питания и сброс
Следующий рисунок демонстрирует основные состояния Device-контроллера после подачи питания.
Рисунок 22.1. Состояния Device после сброса
Под состоянием сброса Device-контроллера понимается состояние, в котором:
- отключена его синхронизации для минимизации потребляемого тока (FRZCLK=1);
- все внутренние регистры Device-контроллера приняли свое исходное значение (обратите внимание, что DETACH=1);
- банки конечных точек являются сброшенными
- подтяжка к плюсу питания на D+ и D- отключена (режим DETACH).
Подтяжка к плюсу на D+ или D- активизируется сразу после обнуления бита DETACH и появления напряжения VBUS.
USB-контроллер после сброса переводится в состояние IDLE для минимизации потребляемого тока. Для перехода в это состояние нет необходимости в активизации блока PLL.
Device-контроллер можно в любое время сбросить путем обнуления бита USBE (отключение интерфейса USB).
22.3. Сброс конечной точки
Конечная точка может быть сброшена в любой момент путем установки в регистре UERST бита соответствующей конечной точки (EPRSTx). Это приведет к:
- сбросу внутреннего автомата состояний выбранной конечной точки;
- сбросу банков приема и передачи, а также восстановлению их внутренних указателей;
- записи своих исходных значений в UEINTX, UESTA0X и UESTA1X.
Поле переключателя данных (DATA TOGGLE) остается неизменным.
Прочие регистры остаются неизменными.
Настройка конечной точки остается действительной, а сама конечная точка сохраняется разрешенной.
Сброс конечной точки можно связать с командой сброса переключателя данных (бит RSTDT), как ответ на USB-команду CLEAR_FEATURE.
22.4. USB-сброс
При обнаружении USB-сброса на линии USB контроллером выполняются следующие действия:
- отключаются все конечные точки;
- конечная точка по умолчанию (тип CONTROL) сохраняется сконфигурированной (подробности см. в 22.3).
22.5. Выбор конечной точки
Перед выполнением каких-либо действий со стороны ЦПУ необходимо выполнить выбор конечной точки. Для этого предусмотрены биты EPNUM2:0 (регистр UENUM), в которые необходимо записать номер конечной точки, с которой желает работать ЦПУ.
После этого, ЦПУ может осуществлять доступ к различным регистрам и данным конечной точки.
22.6. Активизация конечной точки
Конечная точка удерживается в состоянии сброса до тех пор, пока не установлен бит EPEN.
Для активизации конечной точки необходимо выполнить последовательность, приведенную на рисунке 22.2.
Рисунок 22.2. Последовательность активизации конечной точки
Если настройка конечной точки выполнена некорректно (CFGOK=0), контроллер не будет подтверждать пакеты, отправленные с Host-стороны.
Бит CFGOK не устанавливается, если задан размер конечной точки, который больше размера DPRAM.
Обнуление бита EPEN действует как сброс конечной точки (подробности см. в 22.3). При этом также выполняются следующие действия:
- сохраняется настройки конечной точки (EPSIZE, EPBK, ALLOC)
- сбрасывается поле переключателя данных.
- память DPRAM, назначенная для конечной точки, остается зарезервированной.
Подробности о назначении/реорганизации памяти см. в 21.7.
22.7. Настройка адреса
Адрес Device-контроллера устанавливается в соответствии с протоколом USB:
- После подачи питания Device-сторона доступна по адресу 0.
- Host отправляет команду SETUP (SET_ADDRESS(addr)).
- Программа записывает адрес в UADD, но при этом сохраняет ADDEN равным нулю.
- Device отправляет команду IN с нулем байт (пакет IN нулевой длины).
- После этого программа может разрешить адрес Device-контроллера путем установки бита ADDEN. В этом случае контроллер будет использовать адрес, сохраненный в UADD.
ADDEN и UADD нельзя записывать одновременно.
После подачи питания или USB-сброса в UADD содержится адрес по умолчанию (00h)
ADDEN сбрасывается аппаратно:
- после сброса при подаче питания;
- когда принят USB-сброс;
- или когда отключен весь USB-контроллер (обнулен бит USBE).
Когда этот бит равен нулю, используется адрес по умолчанию (00h).
22.8. Режим SUSPEND и выход из него
По истечении 3 мс, в течение которых линия USB была неактивной, контроллер переключается в полноскоростной режим и инициирует прерывание SUSPI (если оно было разрешено). После этого, в программе можно установить бит FRZCLK.
ЦПУ, в зависимости от архитектуры программы, также может ввести режим IDLE для снижения потребляемого тока.
Доступно два способа для выхода из режима SUSPEND:
- Первый заключается в обнулении бита FRZCLK. Это возможно, если ЦПУ не находится в режиме IDLE.
- В случае же, если ЦПУ находится в режиме IDLE, подходит другой способ, который состоит в разрешении прерывания WAKEUPI (WAKEUPE=1). В таком случае, если контроллером обнаруживается сигнал отличный от IDLE, инициируется прерывание WAKEUPI.
В дальнейшем, для перезапуска передачи, программа должна сбросить бит FRZCLK.
Не существует никакой связи между прерываниями SUSPI и WAKEUPI: прерывание WAKEUPI запускается сразу при обнаружении отличных от IDLE сигналов на линиях данных. Таким образом, прерывание WAKEUPI может возникнуть, даже если контроллер не в режиме SUSPEND.
Если бит прерывания SUSPI был установлен, то после запуска прерывания WAKEUPI он сбрасывается автоматически. Аналогичным образом, если во время запуска прерывания SUSPI бит прерывания WAKEUPI был уже установлен, то он сбросится автоматически.
22.9. Отсоединение (Detach)
После сброса бит DETACH равен 1.
Имеется возможность повторно выполнить процедуру перечисления (enumeration). Для этого достаточно установить и сбросить бит DETACH.
- Установка бита DETACH приводит к отключению подтяжки к плюсу питания на выводе D+ или D- (в зависимости от выбранного скоростного режима, FS или LS). Затем, после обнуления DETACH, подтяжка к плюсу питания на D+ или D- будет вновь активизирована.
Рисунок 22.3. Отсоединение стороны Device в полноскоростном режиме
22.10. Удаленное возобновление
Запрос на удаленное возобновление (REMOTE WAKE-UP или UPSTREAM RESUME) является единственной операцией, которую Device-сторона может выполнить по своей собственной инициативе. Однако, чтобы сделать это, Device-сторона должна сначала принять со стороны Host запрос DEVICE_REMOTE_WAKEUP.
- Вначале USB-контроллер должен обнаружить на линии состояние SUSPEND: запрос на удаленное возобновление можно отправить, только когда установлен флаг SUSPI.
- После этого программа имеет возможность установить RMWKUP для отправки потока UPSTREAM RESUME. Данная операция автоматически выполняется контроллером по истечении 5 мс неактивности линии USB.
- Когда контроллер начинает передавать поток UPSTREAM RESUME, запускается прерывание UPRSMI (если оно было разрешено). Флаг SUSPI сбрасывается аппаратно.
- RMWKUP сбрасывается аппаратно в конце потока UPSTREAM RESUME.
- Если контроллер обнаруживает правильный сигнал END OF RESUME (передается Host-стороной), запускается прерывание EORSMI (если оно было разрешено).
|