Микроконтроллер AT90USB162
Напомню, что подсистему AT90USB162, отвечающую за коммуникации USB в дальнейшем будем называть SIE.
Микроконтроллер имеет развитые средства конфигурирования режимов с низким энергопотреблением, для упрощения изучения, подробно их рассматривать не будем.
Прерывания связанные с SIE делятся на 2 большие категории:
- прерывание вызванное функционированием всего SIE (вектор 12)
- прерывание вызванное функционированием конечных точек (вектор 13).
Используется всего 2 вектора прерывания для поддержки функционирования USB. Будем их называть, прерывание устройства и прерывание конечных точек. Для прерывания устройства, источник прерывания определяется опросом флагов в подпрограмме обработчика прерывания по 12-му вектору. Для конечных точек, источник прерывания определяется так же опросом в подпрограмме, но по 13-му вектору. Для уточнения, с какой конечной точкой произошло событие, нужно опросить регистр UEINT . В регистре UEINT, каждой конечной точке соответствует бит, который показывает, в какой конечной точке произошло прерывание. Вообще для манипулирования с регистрами конечной точки, эту точку необходимо предварительно выбрать. Выбор заключается в загрузке нужного значения в регистр UENUM биты 2:0 EPNUM.
Действия программы микроконтроллера на внешние события. Когда обнаружится напряжение на VBUS, необходимо:
- разрешить работу ФАПЧ,
- проверка срабатывания захвата ФАПЧ ,
- перевести SIE в состояние включено ,
- сконфигурировать конечную точку управления EP0 ,
- подключить резистор к линии D+ для режима FS.
Подключается резистор встроенный в микроконтроллер, сбросом бита 0 DETACH регистра UDCON. По умолчанию бит установлен в 1.
Отключать и включать ФАПЧ не обязательно, если контроллер питается от собственного источника и не требуется переводить микроконтроллер в режим с низким потреблением.
На захват частоты требуется значительное время во временном масштабе контроллера, поэтому проверка готовности ФАПЧ обязательна.
SIE может быть в 2-х состояниях, включено (enable) и выключено (disable) . Управляет состоянием бит 7 USBE регистра USBCON. В состоянии выключено, сигнальные передатчики работающие на шину отключены и не потребляют тока, тактирование SIE отключено и не потребляет тока. В состоянии выключено, SIE физически отключен от шины и не тактируется, поэтому не способен реагировать ни на какие события на шине. После отключения SIE состояние его регистров и флагов сбрасывается в состояние по умолчанию. Возникновение напряжения на VBUS является первым событием, в цепочке событий энумерации.
Когда напряжение на VBUS пропад.т, необходимо:
- отключить резистор от линии D+ ,
- перевести SIE в состояние отключено ,
- запретить работу ФАПЧ, для снижения потребления энергии.
Когда шина перейдет в состояние «приостановлено» (Bus Idle), SIE микроконтроллера аппаратно распознает это состояние. Напомним, что в течение 3 миллисекунд перестают появляться пакеты SOF, когда это происходит, SIE аппаратно установит бит 0 SUSPI , регистра UDINT. Если разрешено прерывание, то может быть запущен обработчик. В случае обнаружения состояния «приостановлено», в документации на AT90USB162 рекомендовано выполнить ряд действий по снижению энергопотребления, но это не обязательно для функционирования устройства.
Когда хост пошлет команду «пробуждение» (resume) , SIE аппаратно обнаружит эту команду от хоста на шине и установит бит 5 EORSMI , регистра UDINT . Если разрешено прерывание , то может быть запущен обработчик. Эта команда от хоста должна выводить контроллер из состояния «приостановлено».
Когда центральный процессор микроконтроллера находится в энергосберегающем режиме, то вывести его из этого режима может команда «пробуждение» от хоста, конечно если разрешено прерывание по этой команде, специально для процессора в спящем режиме. Управляет разрешением прерывания бит 4 WAKEUPE, регистра UDIEN, а устанавливается флаг WAKEUPI. Иначе говоря, этот источник прерывания относится к энергосберегающим режимам, которые рассматривать не будем. Здесь эти сведения приводятся, чтобы избежать путаницы. Если энергосберегающие режимы микроконтроллера не используются, то разрешать эти источники прерывания не надо и флаги не анализировать.
Устройство USB может послать по своей инициативе, по шине команду удаленного пробуждения, об этих командах уже говорилось. Предварительно SIE должно обнаружить, что шина находится в состоянии «приостановлено» и установлен бит SUSPI. Для посылки команды, нужно установить бит RMWKUP регистра UDCON, команда будет сгенерирована аппаратно и послана хосту. Как только начнется выполнение этой команды, будет установлен бит 6 UPRSMI регистра UDINT, сигнализирующий о выполнении команды. Дополнительно, может быть сгенерировано прерывание, если установлен бит UPRSME регистра UDIEN. Одновременно, с началом выполнения команды, будет сброшен бит SUSPI . А по окончании выполнения команды, аппаратно будет сброшен бит RMWKUP.
При получении этой команды на пробуждение от USB устройства, хост в свою очередь пошлет «нормальную» команду «пробуждение» (resume) , реакция на которую уже описывалась. В программе для микроконтроллера, способность USB устройства выдавать сигнал «удаленное пробуждение» не реализована. Информацию нужно принять к сведению и только.
Когда на шине устанавливается команда «сброс шины» (Bus Reset), то по окончании этой команды устанавливается бит 3 EORSTI регистра UDINT , а разрешается прерывание по этому событию, битом 3 EORSTE регистра UDIEN. Эта команда вызывает переход всех конечных точек, кроме точки управления в состояние «запрещено». У AT90USB162 имеется особенность, команда сброс шины может вызвать сброс ЦПУ микроконтроллера. Эта функция включается установкой бита 2 RSTCPU, регистра UDCON. Команда «сброс шины», играет ключевую роль в процессе энумерации.
Перейдем к рассмотрению запросов управления. На данном этапе повествования, запросы управления рассматриваются как события, вызывающие переход USB устройства из одного состояния в другое. Образно, эти запросы можно назвать макро событиями. Нужно вспомнить, что для передачи запроса управления хостом, используются управляющие передачи, которые уже описывались. Управляющие передачи обрабатываются аппаратно SIE и попутно могут генерировать прерывания и устанавливать флаги на различных стадиях выполнения. На некотором уровне абстракции, можно рассматривать запрос управления как событие, а если спуститься ниже, то нужно рассматривать как процесс. Чтобы двигаться, дальше, необходимо изучить обработку управляющих запросов и обработку транзакций записи и чтения к конечным точкам.
Транзакция записи. Исходное состояние, флаги RXOUTI и FIFOCON сброшены, в буфере конечной точки нет данных от хоста. От хоста поступает маркерный пакет OUT и пакет данных DATAx , транзакция успешно завершена, хосту послан пакет ACK. После успешного выполнения транзакции, устанавливаются флаги RXOUTI и FIFOCON. Далее, в первую очередь, нужно сбросить флаг RXOUTI для подтверждения прерывания. Затем скопировать данные из буфера конечной точки и сбросить флаг FIFOCON. С флагом RXOUTI, может быть связано прерывание, и чтение данных из буфера может быть организовано в обработчике прерывания. Только когда сброшены флаги, SIE будет способно обрабатывать дальнейшие транзакции к конечной точке.
Рисунок 23 |
Если FIFOCON не сброшен, на все попытки хоста записать данные, SIE будет отправляться пакет квитирования NAK. На рисунке 23 показана транзакция записи.
Транзакция чтения. Исходное состояние, флаги TXINI и FIFOCON установлены, в буфере конечной точки нет данных для отправки хосту. Загружаем данные в буфер, затем сбрасываем флаги TXINI и FIFOCON, TXINI сбрасывается первым. Устройство в состоянии ожидания пакета IN от хоста. После успешного выполнения транзакции чтения, флаги TXINI и FIFOCON аппаратно устанавливаются. С флагом TXINI, может быть связано прерывание, и загрузку данных можно выполнять в обработчике прерывания. Если FIFOCON не сброшен, то на все попытки чтения данных, хосту будут отправляться пакеты квитирования NAK. На рисунке 24 изображена транзакция чтения.
Рисунок 24 |
Счетчик байт в буфере конечной точки, пара регистров, UEBCHX и UEBCLX. В регистре UEBCLX хранится младшая значащая часть, а в регистре UEBCHX значимы только младшие 3 бита. При каждом чтении или записи из буфера FIFO конечной точки, значение этого счетчика соответственно меняется.
После выбора конечной точки, с помощью регистра UENUM, запись в буфер FIFO выполняется через регистр UEDATX.
Флаг RWAL отражает состояние буфера текущей конечной точки. Для конечной точки записи, этот флаг установлен, когда данные могут читаться микроконтроллером, и сбрасывается аппаратно, когда все данные прочитаны. Для конечной точки чтения, флаг RWAL установлен, когда микроконтроллер может записывать в буфер данные, подлежащие отправке хосту.
У конечной точки управления в процессе работы, возникают события. Когда управляющая конечная точка примет в свой буфер маркерный пакет SETUP и пакет данных DATA0 управляющей передачи стадии установки, то аппаратно установится бит 3 RXSTPI регистра UEINTX. Установка этого флага сигнализирует о необходимости обработки конфигурационного пакета запроса управления. В пакете DATA0 содержится важная информация об управляющем запросе, уже говорилось, что этот пакет называется конфигурационным. Программное обеспечение микроконтроллера, должно проанализировать конфигурационный пакет, выполнить необходимые действия, и сбросить флаг RXSTPI. С флагом может быть связано прерывание. Сброс флага нужен для подтверждения прерывания и сброс очищает буфер EP0. Конечно, буфер нужно очищать, после того как из этого буфера будут прочитаны данные. Прерывание разрешается установкой бита 3 RXSTPE регистра UEIENX. Если в запросе только 2 стадии, то после стадии установки, SIE должно принять маркерный пакет IN стадии статуса и отправить ZLP(Zero Length Packet). Для отправки ZLP, нужно сбросить флаг TXINI. При сбросе флага TXINI, содержимое текущей конечной точки готово для отправки хосту. При поступлении пакета IN от хоста, ZLP будет отправлен, стадия статуса завершена, а флаг TXINI будет аппаратно установлен.
Если, проанализировав конфигурационный пакет, требуется ответить пакетом STALL, то для этого устанавливают флаг STALLRQ, регистра UECONX. На маркерный пакет IN от хоста, будет отправлен STALL. А в начале нового запроса управления от хоста, при получении пакета SETUP, флаг STALLRQ будет аппаратно сброшен и все флаги обработки запроса управления, будут действовать в штатном режиме. Конечная точка управления не может находиться в блокированном состоянии и постоянно отвечать пакетами STALL на пакеты от хоста. Рисунок 25 поясняет сказаное.
Рисунок 25 |
Для управляющего запроса имеющего стадию записи данных, стадия установки аналогична описанной выше. Но после стадии установки следует стадия записи данных в SIE. В стадии данных от хоста поступают пакеты OUT и DATAx. Факт присутствия данных в буфере EP0 , отмечается установкой флага RXOUTI регистра UEINTX. Сброс этого флага, очищает буфер EP0 и делает возможным при.м следующего маркерного пакета и пакета данных. Если транзакций стадии данных должно быть несколько, что определяется из анализа конфигурационного пакета, то приход маркерного пакета IN, стадии статуса, определяется по флагу NAKINI. Установка флага NAKINI указывает, что в ответ на пакет IN от хоста, был послан NAK и приш.л чер.д стадии статуса. Ответ хосту аналогичен ответу для 2-х стадийных запросов управления, программно сбрасывается флаг TXINI.
Рисунок 26 |
Другой вариант, определения момента наступления стадии статуса – это просуммировать количество пакетов DATAx полученных от хоста в стадии данных и сравнивать с тем, что следует из информации извлеч.нной из конфигурационного пакета. Для надежности, можно комбинировать оба метода.
Если требуется ответить пакетом STALL, в ответ на пакеты OUT DATAx, в стадии данных, то устанавливается флаг STALLRQ.
Для управляющего запроса имеющего стадию чтения данных, стадия установки (Setup Stage) аналогична описанной выше стадии запроса для запросов управления записи. На стадии данных (Data Stage), SIE в ответ на входящие маркерные пакеты IN от хоста, должен посылать заранее подготовленные пакеты данных. Зная работу транзакций чтения, легко разобраться. Подготовив данные в буфере EP0,программно сбрасывается флаг TXINI и ожидается когда подготовленные данные будут отправлены хосту. Когда все содержимое конечной точки управления будет передано, аппаратно устанавливается флаг TXINI. Когда флаг TXINI установился, можно посылать следующую порцию данных или ожидать начало стадии статуса, в зависимости от запроса управления.
Рисунок 27 |
После стадии данных, стадия статуса. На стадии статуса, поступает пакет OUT и пакет ZLP от хоста, это вызывает установку флага RXOUTI. Установка флага сигнализирует о завершении транзакции статуса, далее программно сбрасывается этот флаг.
.
|