Этот даташит описывает контроллеры TUSB3410, TUSB3410I компании Texas Instruments (перевод оригинального даташита [1]). Все незнакомые термины и аббревиатуры смотрите в словарике, в конце статьи.
[1. Введение]
1.1. Общее описание контроллера TUSB3410
TUSB3410 предоставляет мостовое соединение между портом USB и расширенным последовательным портом UART. TUSB3410 содержит всю необходимую логику для обмена данными с хостом (компьютером) с использованием шины USB. Внутри - ядро микроконтроллера 8052 (MCU) с 16 кбайт RAM, причем эта RAM может быть загружена либо из хоста PC через USB, либо из внешней подключенной микросхемы памяти по шине I2C. В TUSB3410 также содержится 10 кбайт ROM, которая позволяет сконфигурировать порт USB при включении питания и загрузке (boot time). Код ROM содержит в себе встроенный бутлоадер I2C. Весь функционал устройства, такой как декодирование команд, настройка UART, сообщение об ошибках - заложен в программном обеспечении firmware MCU. Это firmware работает под управлением хоста PC.
Микросхема TUSB3410 может быть использована как интерфейс между с каким-нибудь устройством, имеющим традиционный последовательный порт, и компьютером PC с портами USB. После того, как TUSB3410 сконфигурирована, поток данных от хоста до TUSB3410 через команды USB OUT выходит затем через сигнальную линию SOUT чипа TUSB3410. В обратном направлении поток данных входит в TUSB3410 через линию SIN, и затем поступает в хост через команды USB IN.
Рис. 1-1. Как проходят потоки данных в чипе TUSB3410.
Пояснения к рис. 1-1:
Host хост, компьютер или устройство On-The-Go, которое может работать и как хост, и как устройство USB. In, Out направления передачи данных по шине USB. С этими направлениями связаны одноименные конечные точки и названия транзакций и пакетов. SOUT, SIN сигналы TTL последовательного порта, работающего по стандарту RS-232. Legacy Serial Peripheral стандартное периферийное устройство, имеющее аппаратный последовательный порт RS-232. Это может быть, к примеру, какой-нибудь внешний микроконтроллер.
Рис. 1-2. Блочная диаграмма TUSB3410.
Пояснения к рис. 1-2:
Clock Oscillator тактовый генератор, работающий от внешнего кварцевого резонатора 12 МГц. PLL and Dividers узел ФАПЧ и делителя, который вырабатывает внутреннюю тактовую частоту 24 МГц. DP, DM физические сигналы данных шины USB D+ и D-. USB TxR узел трансивера физических сигналов шины USB. USB Serial Interface Engine аппаратный преобразователь последовательных сигналов шины USB в параллельный код. 10K x 8 ROM память ROM (ПЗУ) 10 килобайт, в которой записан код загрузки (bootcode, бутлоадер). 16K x 8 RAM память RAM (ОЗУ) 16 килобайт, которая предназначена для загрузки в неё программы приложения firmware (код программы для MCU 8052). 2K x 8 SRAM память ОЗУ 2 килобайта, которая расположена в области XDATA архитектуры 8052 и предназначена для хранения данных firmware. CPU-I/F Suspend/Resume узел управления приостановкой и возобновлением работы CPU. UBM USB Buffer Manager менеджер буферов USB. TDM Control Logic логика управления потоками данных DMA. 2 x 16-Bit Timers два таймера, стандартных для архитектуры 8052. Port 3 порт ввода/вывода P3 (GPIO), также стандартный для архитектуры 8052. P3.0, P3.1, P3.3, P3.4 выводы порта P3. I2C Controller аппаратный контроллер шины I2C. DMA-1, DMA-3 каналы прямого доступа к памяти. UART-1 последовательный порт. SIN, SOUT сигналы данных последовательного порта. ~RTS, ~CTS, ~DTS, ~DSR стандартные сигналы интерфейса RS-232. Тильда в начале имени означает логическую инверсию. IR Encoder кодер для получения сигналов последовательного канала инфракрасной передачи. IR Decoder декодер для преобразования сигнала инфракрасного канала в последовательный код. SOUT/IR_SOUT выходной сигнал последовательного порта. SIN/IR_SIN входной сигнал последовательного порта.
[2. Основные особенности контроллера TUSB3410]
2.1. USB
• Полностью совместим со стандартом USB 2.0: TID #40340262. • Поддерживает скорость передачи данных USB до 12 мегабит/сек (full speed). • Поддерживает приостановку работы USB (USB suspend), возобновление работы (USB resume), и функцию удаленного пробуждения (remote wakeup). • Поддерживает два режима питания: - питание от шины USB (Bus-powered mode) - питание от собственного отдельного источника питания (Self-powered mode) • Может поддерживать до трех входных (IN endpoint) и до трех выходных (OUT endpoint) конечных точек (работающих в режимах interrupt, bulk).
2.2. Основные возможности
• Контроллер основан на встроенном ядре 8052, которое содержит: - 256 килобайт RAM для внутренних данных (IDATA архитектуры 8052). - 10 килобайт ROM (в котором записаны нестираемый бутлоадер USB и I2C). - 16K килобайт RAM для кода firmware, который может быть загружен с хоста или через порт I2C. - 2 килобайта общей RAM, которая используется как буферные данные и блоки дескрипторов конечной точки (endpoint descriptor blocks, EDB). - 4 ножки GPIO, подключенные к порту 3 (P3) микроконтроллера 8052. - главный контроллер I2C для доступа к микросхеме EEPROM. - MCU работает на частоте 24 МГц со скоростью 2 MIPS. - сторожевой таймер 128 мс (watchdog timer). • Два встроенных контроллера DMA для операций ввода/вывода I/O через порты USB/UART. • Работает от кварца 12 МГц. • Поддерживает засыпание и пробуждение USB (suspend и resume). • Поддерживает процедуру пробуждения хоста (remote wake-up). • Имеет 32-выводный корпус LQFP. • Использует напряжение питания 3.3V и имеет встроенный регулятор напряжения 1.8V, который можно использовать для питания ядра микроконтроллера.
2.3. Порт UART с расширенными возможностями
• Программно/аппаратное управление потоком данных (Software/hardware flow control): - программируемые символы Xon/Xoff. - программируемые автоматически работающие сигналы ~RTS/~DTR и ~CTS/~DSR. • Автоматическое управление приемопередатчиком шины RS-485, с включенным и выключенным эхо. • Выбираемый режим IrDA, работающий на скорости до 115.2 килобит/сек (kbps). • Программно задаваемая скорость передачи UART (baud rate) в диапазоне от 50 до 921.6 килобод. • Программируемые характеристики UART: - количество бит в символе может быть выбрано 5, 6, 7, или 8. - выбор генерации и детектирования бита четности Even (четно), odd (нечетно), или no parity (без бита четности). - выбор количества стоповых бит 1, 1.5, или 2 (stop bit). • Генерация и детектирования сигнала останова передачи (Line break). • Встроенный тест и замыкание со входа на выход (loop-back). • Функции для управления модемом (сигналы ~CTS, ~RTS, ~DSR, ~DTR, ~RI и ~DCD). • Внутренняя диагностика: - управление Loopback (соединение входа с выходом для проверки), для коммуникаций при потери связей. - симуляция событий и ошибок Break, parity, overrun, framing-error.
2.4. Цоколевка корпуса (расположение выводов, вид сверху)
|
|
Корпус VF, вид сверху |
Корпус RHB, вид снизу |
Таблица 2-1. Назначение и нумерация выводов TUSB3410
Имя |
№ выв. |
I/O |
Описание |
CLKOUT |
22 |
O |
Выход тактовой частоты (управляется битом 2 CLKOUTEN и битом 3 CLKSLCT регистра MODECNFG), см. секцию 5.5 и примечание 1. |
~CTS |
13 |
I |
UART: сигнал Clear to send, очищено для передачи (см. примечание 4). |
~DCD |
15 |
I |
UART: сигнал Data carrier detect, детектирование несущей (см. примечание 4). |
DM |
7 |
I/O |
Физический сигнал данных D+ шины USB. |
DP |
6 |
I/O |
Физический сигнал данных D- шины USB. |
~DSR |
14 |
I |
UART: сигнал Data set ready, набор данных готов (см. примечание 4). |
~DTR |
21 |
O |
UART: сигнал Data terminal ready (см. примечание 1). |
GND |
8, 18, 28 |
|
Цифровая земля и отрицательный провод питания. |
P3.0 |
32 |
I/O |
Бит 0 GPIO порта 3 (см. примечания 3, 5 и 8). |
P3.1 |
31 |
I/O |
Бит 1 GPIO порта 3 (см. примечания 3, 5 и 8). |
P3.3 |
30 |
I/O |
Бит 3 GPIO порта 3 (см. примечания 3, 5 и 8). |
P3.4 |
29 |
I/O |
Бит 4 GPIO порта 3 (см. примечания 3, 5 и 8). |
PUR |
5 |
O |
Подключение нагрузочного резистора (pull-up) для шины USB (см. примечание 2). |
~RESET |
9 |
I |
Главный вход сброса (см. примечание 4). |
~RI/CP |
16 |
I |
UART: сигнал Ring indicator, наличие вызова (см. примечание 4). |
~RTS |
20 |
O |
UART: сигнал Request to send, запрос на передачу (см. примечание 4). |
SCL |
11 |
O |
Сигнал тактов мастера шины I2C, сюда обычно подключается внешняя память EEPROM для загрузки (см. примечание 1). |
SDA |
10 |
I/O |
Сигнал данных мастера шины I2C, сюда обычно подключается внешняя память EEPROM для загрузки (см. примечание 1 и 5). |
SIN/IR_SIN |
17 |
I |
UART: последовательные входные данные / вход данных канала IR (см. примечание 6). |
SOUT/IR_SOUT |
19 |
O |
UART: последовательные выходные данные / выход данных канала IR (см. примечание 7). |
SUSPEND |
2 |
O |
Вывод индикации режима приостановки (см. примечание 3). Когда на этом выводе лог. 1, устройство находится в режиме приостановки (suspend mode). |
TEST0 |
23 |
I |
Тестовый вход, предназначенный только для заводского тестирования (см. примечание 5). Этот вывод должен быть подтянут к VCC через резистор 10 кОм. |
TEST1 |
24 |
I |
Тестовый вход, предназначенный только для заводского тестирования (см. примечание 5). Этот вывод должен быть подтянут к VCC через резистор 10 кОм. |
VCC |
3, 25 |
PWR |
3.3V, напряжение питания. |
VDD18 |
4 |
PWR |
Выход внутреннего регулятора для получения напряжения питания 1.8V. Напряжение генерируется, когда вывод ~VREGEN находится в состоянии лог. 0. Когда ~VREGEN в лог. 1, напряжение 1.8V (используется для питания ядра MCU) должно быть предоставлено от внешнего источника питания. |
~VREGEN |
1 |
I |
Вход, активный к низкому уровню, для разрешения работы внутреннего стабилизатора напряжения (из 3.3V получает 1.8V). |
~WAKEUP |
12 |
I |
Вывод для запроса пробуждения хоста (wake-up request). Когда лог. 0, выводит из спячки операционную систему подключенного компьютера (см. примечание 5). |
X1/CLKI |
27 |
I |
Вывод для подключения кристалла (вход) 12 МГц или вход внешних тактов. |
X2 |
26 |
O |
Вывод для подключения кристалла (выход) 12 МГц. |
Примечания к таблице 2-1 (тильда ~ в именах сигналов означает логическую инверсию):
1. Выход буфера CMOS с тремя состояниями выхода (нагрузочная способность +- 4 mA). 2. Выход буфера CMOS с тремя состояниями выхода (нагрузочная способность +- 8 mA). 3. Выход буфера CMOS с тремя состояниями выхода (нагрузочная способность +- 12 mA). 4. Вход совместимый с TTL, с гистерезисом. 5. Вход совместимый с TTL, с гистерезисом, с внутренним активным верхним (pullup) нагрузочным резистором на 100 mkA. 6. Вход совместимый с TTL, без гистерезиса, с внутренним активным верхним (pullup) нагрузочным резистором на 100 mkA. 7. Нормальный режим или IR-режим: выход буфера CMOS с тремя состояниями выхода (нагрузочная способность +- 4 mA). 8. MCU работает с выходами как с открытым стоком таким образом, что низкий уровень может удерживаться на выходе продолжительное время, а высокий уровень появляется на выходе только на 2 такта CPU, после чего выход переходит в состояние высокого сопротивления (третье состояние).
[3. Подробное описание TUSB3410]
3.1. Рабочие режимы
TUSB3410 управляет поведением интерфейса в ответ на команды USB, и это функционирование зависит от выбранного режима последовательного порта. С другой стороны, последовательный порт может конфигурироваться в трех различных режимах.
Как и в любом интерфейсном устройстве, передача данных является основной функцией TUSB3410, но обычно начальное конфигурирование и обработка ошибок требует некоторой поддержки в коде firmware. В последующих секциях будет описаны различные режимы, которые могут быть использованы для устройства, что представляет из себя конфигурирование в данных режимах.
3.2. Конфигурация интерфейса USB
TUSB3410 содержит встроенный микрокод, который позволяет MCU настроить USB, чтобы оно успешно прошло процедуру энумерации на хосте. Микрокод ROM может также загрузить код приложения пользователя (application code) во внутреннюю память RAM из внешней памяти через шину I2C (такую шину имеют многие популярные микросхемы EEPROM с последовательным интерфейсом) или от хоста, прямо через интерфейс USB.
3.2.1. Загрузка кода из подключенной внешней памяти
После сброса (или включения питания) TUSB3410 отключается от USB (сигналы приводятся в такое состояние, что хост видит устройство отключенным, даже если оно подключено к порту USB). Бит 7 (CONT) регистра USBCTL (см. секцию 5.4) очищается. TUSB3410 проверяет порт I2C на наличие подключенной внешней микросхемы памяти (например, это может быть микросхема 24C512), и наличие в ней допустимого прошитого кода; если валидный код найден, то этот код считывается из микросхемы памяти и загружается во внутреннюю RAM, которая включена в область память программ. Как только код загружен, TUSB3410 подключается к USB установкой бита CONT, и затем происходят стандартные процессы энумерации и конфигурирования. Такой вариант загрузки используется наиболее часто.
Примечание: для подготовки дампа кода (чтобы он стал допустимым для загрузки TUSB3410) и прошивки его в память EEPROM фирма Texas Instruments предоставляет специальную утилиту подготовки образа для EEPROM Header.exe, см. [2].
3.2.2. Загрузка кода из хоста PC
Если по шине I2C не удалось найти и считать допустимый код, то TUSB3410 сама подключается к USB (бутлоадер устанавливает бит 7 CONT регистре USBCTL, см. секцию 5.4), и затем проходит конфигурирование и стандартную энумерацию на хосте. После этого код может загрузить дополнительный код в RAM, этот код может содержать в себе приложение пользователя. После загрузки кода MCU автоматически делает переподключение к USB с помощью сброса и установки бита CONT, что приводит к повторной энумерации на хосте, но теперь уже под управлением кода, загруженного в RAM. Теперь конфигурация устройства USB может быть совсем другой, полностью зависящей от загруженного в RAM кода firmware.
Для того, чтобы загрузка через USB работала, необходима установка драйвера USB TI WDF USBUART Single Driver, см. [2].
3.3. Передача данных по USB
По стандарту USB микросхема TUSB3410 видится на хосте как периферийное устройство USB. Как и все такие устройства, оно использует endpoint 0 как конечную точку управления (control endpoint). Дополнительно могут сконфигурированы до 3 входных конечных точек (input endpoint) и выходных (output endpoint). Большинство приложений используют одну bulk input endpoint для ввода данных в хост (data in) и одну bulk output endpoint для вывода данных из хоста (data out), и одну interrupt endpoint для обновления статуса устройства. Конфигурация USB может оставаться одинаковой независимо от конфигурации последовательного порта.
Чаще всего данные передаются со стороны USB на сторону UART (и в обратном направлении) с использованием встроенного в чип контроллер DMA. В некоторых особых случаях (например, если нужно реализовать устройство класса USB HID) управление перемещением данных может осуществляться программно с помощью кода firmware MCU.
3.4. Настройка последовательного порта
Последовательный порт требует некоторой настройки управляющих регистров, которые должны быть записаны для конфигурирования порта. Эта конфигурация может быть одинаковой независимо от используемого способа передачи данных. Эти регистры включают в себя регистр управления линией (line control register), который управляет форматом передаваемого слова и регистры делителя, которые задают скорость передачи (baud rate).
Эти регистры обычно управляются приложением хоста.
3.5. Режимы данных последовательного порта
Последовательный порт может быть сконфигурирован в трех различных (однако похожих друг на друга в работе) режимах передачи данных (data mode): RS-232 data mode, RS-485 data mode и IrDA data mode. Как и режим USB режим последовательного порта обычно конфигурируется однократно (при сбросе/загрузке или включении питания) и дальше в процессе работы не меняется. Различие между режимами заключается в интервалах времени последовательного ввода и вывода или в использовании дополнительных управляющих сигналов. Однако базовый процесс преобразования последовательного кода USB в параллельный и затем из параллельного снова в последовательный (и обратно) одинаковый для всех режимов. Некоторые опции настройки доступны для всех режимов, а некоторые могут использоваться только для определенных режимов. Например, программное управление потоком (software flow control) с помощью символов Xoff/Xon может быть использовано во всех режимах, но может использоваться только в режимах RS-232 или IrDA, потому что режим RS-485 работает в полудуплексе. Точно так же аппаратное управление потоком (hardware flow control) и процедура установки связи (handshaking) с использованием сигналов ~RTS/~CTS (или ~DTR/~DSR) доступна в режимах RS-232 или IrDA. Однако в реальности эта возможность может использоваться только в режиме RS-232 mode, потому что режим IrDA имеет только сигналы SIN и SOUT, гальванически развязанные оптикой (обычно оптронами).
3.5.1. RS-232 Data Mode
Режим по умолчанию называется RS-232 mode, он обычно используется для полнодуплексного (full duplex) обмена данными через сигналы SOUT и SIN. В этом режиме выходы управления модемом (~RTS и ~DTR) соединены с модемом и обычно настроены как цифровые выходы. Входы управления модемом (~CTS, ~DSR, ~DCD и ~RI/CP) также обычно соединены с модемом и настроены как цифровые входы. Альтернативно ~RTS и ~CTS (или ~DTR и ~DSR) могут регулировать поток данных через SOUT и SIN для предотвращения переполнения приемного FIFO. И наконец, с той же целью может использоваться программное управление потоком (software flow control) через символы Xoff/Xon.
Режим RS-232 представлен во многих приложениях, и другие режимы являются подмножеством этого режима.
3.5.2. RS-485 Data Mode
Режим RS-485 очень похож на режим RS-232 тем, что назначение линий SOUT, SIN и формат сигнала на них остались такими же. Поскольку RS-485 имеет шинную архитектуру с неотъемлемым свойством системы обмена с одиночным дуплексом. В режиме RS-485 микросхема TUSB3410 управляет сигналами ~RTS и ~DTR, которые могут разрешить либо драйвер RS-485 (передатчик), либо приемник RS-485. В режиме RS-485 разрешающие сигналы для передачи автоматически выставляются всякий раз, когда DMA настроен на выдачу данных. Приемник может быть оставлен разрешенным при разрешенном драйвере (передатчике), чтобы позволить при необходимости принимать эхо, но когда ожидаются реальные данные из канала RS-485, то при приеме драйвер должен быть запрещен. Заметьте, что это устраняет аппаратное управление потоком (hardware flow control), поскольку работа по передаче данных идет в полудуплексе (то в одном направлении, то в другом, и никогда в обоих направлениях сразу), и аппаратное управление потоком не эффективно. Программное управление потоком (software flow control) также поддерживается, но оно может иметь ограниченное значение.
Режим RS-485 разрешается установкой бита 7 (485E) в регистре FCRL (см. секцию 7.1.4), и бита 1 (RCVE) в регистре MCR (см. секцию 7.1.6), что позволяет приемнику подслушивать в режиме RS-485.
3.5.3. IrDA Data Mode
В режиме IrDA сигнал SOUT кодируется и SIN декодируется по стандарту IrDA, и данные могут передаваться со скоростью до 115.2 килобит/сек (kbps). При этом требуется подключение к внешнему трансиверу IrDA. Обмен данными обычно идет в полном дуплексе (full duplex), т. е. сразу в двух направлениях. Обычно в системе IrDA только сигналы SOUT и SIN подключены к аппаратуре, так что аппаратное управление потоком (hardware flow control) не подразумевается. Также поддерживается программное управление потоком (software flow control).
Режим IrDA разрешается установкой бита 6 (IREN) в регистре USBCTL (см. секцию 5.4).
Схемы кодера и декодера IR работают совместно с UART, чтобы преобразовать поток бит в последовательность импульсов, и обратно. Для каждого нулевого бита во входном потоке данных кодер вырабатывает и отправляет импульс 0 -> 1 -> 0 с длительностью 3/16 от длительности фрейма бита, посередине времени бита. Для каждого единичного бита в потоке данных выход кодера остается в лог. 0 на все время длительности бита.
Процесс декодирования состоит из приема сигнала от приемника IrDA и преобразование его обратно в последовательность ноликов и единичек. В соответствии с преобразованием кодера, декодер преобразует импульс в бит нуля и отсутствие импульса в бит единицы.
Рис. 3-1. Выбор режима RS-232 и IR
Пояснения к рисунку 3-1:
From UART, SOUT сигнал данных с выхода UART. IREN бит в регистре USBCTL, который разрешает работу IR. UART BaudOut Clock тактовая частота для UART, от которой зависит скорость передачи. TXCNTL бит в регистре MODECNFG, управляющий режимом управления передачей (см. секцию 5.5). SOFTSW бит в регистре MODECNFG, позволяющий программно разрешать работу выхода передатчика(см. секцию 5.5). CLKSLKT бит в регистре MODECNFG, управляющий выбором тактовой частоты, появляющейся на выходе CLKOUT. To UART Receiver, SIN сигнал данных, поступающий на вход приемника UART. SOUT/IR_SOUT выходной порт (внешний вывод) передатчика UART/IR. SIN/IR_SIN входной порт (внешний вывод) приемника UART/IR. CLKOUT выходной порт (внешний вывод), на который выводится тактовая частота.
Рис. 3-2. Реализация интерфейса USB < -- > Serial (RS-232)
Рис. 3-3. Реализация интерфейса USB < -- > RS-485
[4. Карта памяти (Memory Map) MCU]
На рисунке 4-1 показана карта памяти (адресное пространство) микроконтроллера в двух режимах - загрузка под управлением бутлоадера (boot) и режим нормальной работы (normal operation, когда программа пользователя загружена в память RAM).
Примечание: на рис. 4-1 не показана внутренняя стандартная для архитектуры MCS-51 память RAM (DATA 256 байт, которые находятся в отдельном адресном пространстве ядра 8052 - адреса от 0000h до 00FFh). Затененные области представлены внутренним ROM/RAM.
• Когда бит 0 (SDW) регистра ROMS установлен в 0 (boot mode)
В этом случае 10 килобайт ROM отображены на начальные адреса CODE 0x0000 .. 0x27FF, и эта область задублирована также по адресам CODE 0x8000 .. 0xA7FF. Внутренняя память 16 килобайт RAM отображена на адреса XDATA 0x0000 .. 0x3FFF. Буферы, MMR и I/O отображены на диапазон XDATA 0xF800 .. 0xFFFF.
• Когда бит 0 (SDW) регистра ROMS установлен в 0 (normal mode)
10 килобайт ROM отображен на CODE 0x8000 .. 0xA7FF. Внутренние 16 килобайт RAM отображены на CODE 0x0000 .. 0x3FFF. Буферы, MMR и I/O отображены на диапазон XDATA 0xF800 .. 0xFFFF, на то же самое место.
Рис. 4-1. Карта памяти MCU
4.1. Различные регистры
4.1.1. ROMS: ROM Shadow Configuration Register (адрес FF90h) - регистр конфигурации затенения
Этот регистр используется MCU для переключения из режима загрузки (boot mode) в обычный режим (normal operation mode), причем boot mode устанавливается только по сбросу при включении. Дополнительно этот регистр предоставляет номер ревизии устройства и конфигурацию ROM/RAM.
№ бита |
Имя |
RESET |
Описание бит |
0 |
SDW |
0 |
Этот бит разрешает/запрещает boot ROM (управление затенением ROM). SDW=0: когда бит SDW очищен, то MCU выполняет код из 10 килобайтного boot ROM (туда записан код загрузки, бутлоадер, загрузчик). ROM появляется одновременно в 2 местах - по адресу 0000h и по адресу 8000h. 16 килобайт RAM отображены на адресное пространство XDATA, так что ядро MCU может читать и записывать в него данные. Бит SDW устанавливается после того, как код загрузки завершил загрузку в RAM программы firmware. Ядро MCU не может очистить этот бит, он очищается только при сбросе в момент подачи питания, подаче сигнала сброса или при сбросе от истечения таймаута сторожевого таймера. SDW=1: когда бит SDW установлен, то boot ROM отображено на адрес 8000h, и RAM отображено на адресное пространство CODE по адресу 0000h. При этом MCU начинает выполнение программы из RAM, при этом запись в RAM невозможна, так как она находится в области памяти программ. |
4-1 |
RSVD |
не влияет |
Эти биты зарезервированы, и всегда читаются как нули. |
6-5 |
S[1:0] |
не влияет |
Размер адресного пространства кода. По этим битам можно определить пространство кода ROM или RAM (бит 7 ROA определяет ROM или RAM). Эти биты постоянно находятся в значении 10b, что показывает кодовое пространство 16 кбайт, и на состояние этих бит сброс не оказывает никакого влияния.
00 = 4 килобайта под код 01 = 8 килобайт под код 10 = 16 килобайт под код 11 = 32 килобайта под код
|
7 |
ROA |
не влияет |
Показывает версию ROM или RAM, на чем основывается адресное пространство CODE (код программы). Этот бит всегда установлен в 1 (что показывает на кодовое пространство на основе RAM), и сброс на него не влияет.
ROA = 0: кодовое пространство ROM ROA = 1: кодовое пространство RAM
|
Таблица 4-1. Определение размера ROM/RAM
Регистр ROMS |
BOOT ROM |
RAM CODE |
ROM CODE |
ROA |
S1 |
S0 |
0 |
0 |
0 |
нет |
нет |
4K |
0 |
0 |
1 |
нет |
нет |
8K |
0 |
1 |
0 |
нет |
нет |
16K (зарезервировано) |
0 |
1 |
1 |
нет |
нет |
32K (зарезервировано) |
1 |
0 |
0 |
10K |
4K |
нет |
1 |
0 |
1 |
10K |
8K |
нет |
1* |
1* |
0* |
10K* |
16K* |
нет* |
1 |
1 |
1 |
10K |
32K (зарезервировано) |
нет |
* сейчас жестко используется только этот вариант.
4.1.2. Работа в состоянии Boot (загрузка MCU firmware в память CODE RAM)
Поскольку кодовое пространство firmware находится в CODE RAM (исключая boot ROM), то firmware для TUSB3410 должно быть загружено из какой-то внешней памяти. Как уже упоминалось, таких источников внешней памяти два: один это внешняя последовательная микросхема EEPROM с интерфейсом I2C, и другой это хост, подключенный через USB. Когда устройство сброшено, бит 0 (SDW) в регистре ROMS (см. секцию 4.1.1) и бит 7 (CONT) в регистре USBCTL (см. секцию 5.4) очищены. Это конфигурирует карту памяти в состояние boot mode (см. таблицу 4-3) и удерживает устройство в состоянии отключения от хоста. Первая инструкция кода выбирается по адресу CODE 0000h (сейчас в это место отображены 10 килобайт ROM). 16 килобайт RAM отображены в область XDATA (начиная с адреса 0000h). MCU под управлением бутлоадера ROM читает внешнюю память EEPROM и проверяет данные в ней на наличие кода (по специальной сигнатуре загрузки). Если в EEPROM содержит соответствующий допустимый код (правильную сигнатуру), то MCU читает код firmware из EEPROM и записывает его в 16 килобайт XDATA RAM. Если код (сигнатура) не найден, то MCU выполняет загрузку из USB.
Как только код загружен, MCU устанавливает бит SDW регистра ROMS в 1. Это переключает карту памяти в normal mode; как только это сделано, 16 килобайт RAM будут отображены на адресное пространство CODE (начиная с адреса 0000h), и MCU начнет оттуда выполнение программы. Код снова инициализирует USB и устройство проходит обычную процедуру энумерации на хосте.
4.1.3. WDCSR: Watchdog Timer, Control, and Status Register (адрес FF93h) - регистр сторожевого таймера, управления и статуса
В TUSB3410 имеется сторожевой таймер (WDT, WatchDog Timer) с дискретностью 1 мс. Если к этому регистру не было обращения в течение 128 мс, то счетчик WDT сбрасывает MCU (см. рис. 5-1). Сторожевой таймер по умолчанию разрешен, и его можно запретить, если записать сигнатуру 101010b в биты WDD[5:0] регистра. Тактовый сигнал с периодом 1 мс для WDT поступает от импульсов SOF. Таким образом, чтобы таймер WDT считал, должен быть установлен бит 7 (CONT) в регистре USBCTL (см. секцию 5.4).
№ бита |
Имя |
RESET |
Описание бит |
0 |
WDT |
0 |
MCU firmware должно записывать 1 в этот бит, чтобы предотвратить перезагрузку, которую может вызвать истечение таймаута сторожевого таймера (watchdog). Если MCU не записал в этот бит 1 в течение времени 128 мс, то watchdog перезагрузит микросхему. Запись 0 не оказывает никакого воздействия на watchdog. Таймер watchdog имеет 7 разрядов, и на него подается тактовая частота с периодом 1 мс (от импульсов SOF). Читается бит WDT всегда как 0.
|
5-1 |
WDD[5:1] |
00000 |
Эти биты позволяют запретить watchdog. Чтобы запретить сторожевой таймер, в эти биты надо записать 10101b и бит 7 WDD0 также должен быть сброшен в 0. Запись других значений не приведет к запрету watchdog. |
6 |
WDR |
0 |
Бит, который указывает на сброс по сторожевому таймеру или на сброс при включении питания.
WDR=0: произошел сброс при включении питания. WDR=1: произошел сброс от watchdog. Чтобы очистить этот бит, MCU должен записать сюда 1, запись 0 не дает никакого эффекта.
|
7 |
WDD0 |
1 |
Это один из 6 бит, который позволяет запретить watchdog. Для запрета watchdog этот бит должен быть очищен.
|
4.2. Буферы и карта памяти ввода вывода (I/O)
Адресное пространство XDATA в диапазоне от F800h до FFFFh (2 килобайта) зарезервировано для буферов данных, пакета настройки USB (setup packet), блоков дескрипторов конечной точки (endpoint descriptors block, EDB), и ввода/вывода (I/O). Здесь 128 ячеек зарезервированы для регистров MMR. В таблице 4-2 представлено пространство XDATA и ограничение доступа к нему через DMA, менеджер буфера USB (USB buffer manager, UBM) и MCU.
Таблица 4-2. Адресное пространство XDATA
Описание |
Диапазон адресов |
Доступ для UBM |
Доступ для DMA |
Доступ для MCU |
Внутренние MMR |
FFFFh .. FF80h |
нет (только EDB-0) |
нет (только регистр данных и EDB-0) |
ДА |
EDB |
FF7Fh .. FF08h |
Только для обновления EDB |
Только для обновления EDB |
ДА |
Setup Paket |
FF07h .. FF00h |
ДА |
нет |
ДА |
Буфер Input endpoint-0 |
FEFFh .. FEF8h |
ДА |
ДА |
ДА |
Буфер Output endpoint-0 |
FEF7h .. FEF0h |
ДА |
ДА |
ДА |
Буферы данных |
FEEFh .. F800h |
ДА |
ДА |
ДА |
Таблица 4-3. Адресное пространство XDATA для регистров MMR (адреса FF80h .. FFFFh)
Адрес |
Регистр |
Описание |
FFFFh |
FUNADR |
Function address register - регистр адреса функции. |
FFFEh |
USBSTA |
USB status register - регистр статуса USB. |
FFFDh |
USBMSK |
USB interrupt mask register - регистр маски прерываний USB. |
FFFCh |
USBCTL |
USB control register - регистр управления USB. |
FFFBh |
MODECNFG |
Регистр конфигурации режима. |
FFFAh .. FFF4h |
- |
Зарезервировано. |
FFF3h |
I2CADR |
Регистр адреса порта I2C. |
FFF2h |
I2CDATI |
Регистр входных данных порта I2C. |
FFF1h |
I2CDATO |
Регистр выходных данных порта I2C. |
FFF0h |
I2CSTA |
Регистр состояния порта I2C. |
FFEFh .. FFE8h |
SERNUM7 .. SERNUM0 |
Регистры серийного номера. |
FFE7h .. FFE6h |
- |
Зарезервировано. |
FFE5h |
DMACSR3 |
DMA-3: регистр управления и статуса. |
FFE4h |
DMACDR3 |
DMA-3: регистр указания канала. |
FFE3h .. FFE2h |
- |
Зарезервировано. |
FFE1h |
DMACRS1 |
DMA-1: регистр управления и статуса. |
FFE0h |
DMACDR1 |
DMA-1: регистр указания канала. |
FFDFh .. FFACh |
- |
Зарезервировано. |
FFABh |
MASK |
UART: регистр маски прерываний. |
FFAAh |
XOFF |
UART: регистр Xoff. |
FFA9h |
XON |
UART: регистр Xon. |
FFA8h |
DLH |
UART: старший байт делителя. |
FFA7h |
DLL |
UART: младший байт делителя. |
FFA6h |
MSR |
UART: Modem status register, регистр состояния модема. |
FFA5h |
LSR |
UART: Line status register, регистр состояния линии. |
FFA4h |
MCR |
UART: Modem control register, регистр управления модемом. |
FFA3h |
FCRL |
UART: Flow control register, регистр управления потоком. |
FFA2h |
LCR |
UART: Line control register, регистр управления линией. |
FFA1h |
TDR |
UART: регистр данных передатчика. |
FFA0h |
RDR |
UART: регистр данных приемника. |
FF9Eh |
PUR_3 |
GPIO: регистр управления внутренним нагрузочным резистором (pullup) для порта 3 (P3). |
FF9Dh .. FF94h |
- |
Зарезервировано. |
FF93h |
WDCSR |
Регистр управления и статуса сторожевого таймера (watchdog). |
FF92h |
VECINT |
Vector interrupt register, регистр вектора прерывания. |
FF91h |
- |
Зарезервировано. |
FF90h |
ROMS |
Регистр управления конфигурацией затенения ROM. |
FF8Fh .. FF84h |
- |
Зарезервировано. |
FF83h |
OEPBCNT_0 |
Output endpoint_0: регистр счетчика байт. |
FF82h |
OEPCNFG_0 |
Output endpoint_0: регистр конфигурации. |
FF81h |
IEPBCNT_0 |
Input endpoint_0: регистр счетчика байт. |
FF80h |
IEPCNFG_0 |
Input endpoint_0: регистр конфигурации. |
Таблица 4-4. Адресное пространство XDATA для ячеек EDB
Адрес |
Регистр |
Описание |
FF7Fh .. FF60h |
- |
Зарезервировано. |
FF5Fh |
IEPSIZXY_3 |
Input endpoint_3: размер буфера X-Y. |
FF5Eh |
IEPBCTY_3 |
Input endpoint_3: счетчик байт Y. |
FF5Dh |
IEPBBAY_3 |
Input endpoint_3: базовый адрес буфера Y. |
FF5Ch, FF5Bh |
- |
Зарезервировано. |
FF5Ah |
IEPBCTX_3 |
Input endpoint_3: счетчик байт X. |
FF59h |
IEPBBAX_3 |
Input endpoint_3: базовый адрес буфера Y. |
FF58h |
IEPCNF_3 |
Input endpoint_3: конфигурация. |
FF57h |
IEPSIZXY_2 |
Input endpoint_2: размер буфера X-Y. |
FF56h |
IEPBCTY_2 |
Input endpoint_2: счетчик байт Y. |
FF55h |
IEPBBAY_2 |
Input endpoint_2: базовый адрес буфера Y. |
FF54h, FF53h |
- |
Зарезервировано. |
FF52h |
IEPBCTX_2 |
Input endpoint_2: счетчик байт X. |
FF51h |
IEPBBAX_2 |
Input endpoint_2: базовый адрес буфера Y. |
FF50h |
IEPCNF_2 |
Input endpoint_2: конфигурация. |
FF4Fh |
IEPSIZXY_1 |
Input endpoint_1: размер буфера X-Y. |
FF4Eh |
IEPBCTY_1 |
Input endpoint_1: счетчик байт Y. |
FF4Dh |
IEPBBAY_1 |
Input endpoint_1: базовый адрес буфера Y. |
FF4Ch, FF4Bh |
- |
Зарезервировано. |
FF4Ah |
IEPBCTX_1 |
Input endpoint_1: счетчик байт X. |
FF49h |
IEPBBAX_1 |
Input endpoint_1: базовый адрес буфера Y. |
FF48h |
IEPCNF_1 |
Input endpoint_1: конфигурация. |
FF47h .. FF20h |
- |
Зарезервировано. |
FF1Fh |
OEPSIZXY_3 |
Output endpoint_3: размер буфера X-Y. |
FF1Eh |
OEPBCTY_3 |
Output endpoint_3: счетчик байт Y. |
FF1Dh |
OEPBBAY_3 |
Output endpoint_3: базовый адрес буфера Y. |
FF1Ch, FF1Bh |
- |
Зарезервировано. |
FF1Ah |
OEPBCTX_3 |
Output endpoint_3: счетчик байт X. |
FF19h |
OEPBBAX_3 |
Output endpoint_3: базовый адрес буфера X. |
FF18h |
OEPCNF_3 |
Output endpoint_3: конфигурация. |
FF17h |
OEPSIZXY_2 |
Output endpoint_2: размер буфера X-Y. |
FF16h |
OEPBCTY_2 |
Output endpoint_2: счетчик байт Y. |
FF15h |
OEPBBAY_2 |
Output endpoint_2: базовый адрес буфера Y. |
FF14h, FF13h |
- |
Зарезервировано. |
FF12h |
OEPBCTX_2 |
Output endpoint_2: счетчик байт X. |
FF11h |
OEPBBAX_2 |
Output endpoint_2: базовый адрес буфера X. |
FF10h |
OEPCNF_2 |
Output endpoint_2: конфигурация. |
FF0Fh |
OEPSIZXY_1 |
Output endpoint_1: размер буфера X-Y. |
FF0Eh |
OEPBCTY_1 |
Output endpoint_1: счетчик байт Y. |
FF0Dh |
OEPBBAY_1 |
Output endpoint_1: базовый адрес буфера Y. |
FF0Ch, FF0Bh |
- |
Зарезервировано. |
FF0Ah |
OEPBCTX_1 |
Output endpoint_1: счетчик байт X. |
FF09h |
OEPBBAX_1 |
Output endpoint_1: базовый адрес буфера X. |
FF08h |
OEPCNF_1 |
Output endpoint_1: конфигурация. |
FF07h .. FF00h |
8 байт |
Блок пакета настройки (Setup Packet). |
FEFFh .. FEF8h |
8 байт |
Буфер Input endpoint_0. |
FEF7h .. FEF0h |
8 байт |
Буфер Output endpoint_0. |
FEEFh .. F800h |
TOPBUFF .. STABUFF |
Пространство, выделенное под буферы данных. |
4.3. Endpoint Descriptor Block (от EDB-1 до EDB-3)
Передачи данных через между USB, MCU и внешними устройствами определены в endpoint descriptor block (EDB). Имеется три input EDB и три output EDB. За исключением EDB-0 (I/O endpoint-0), все EDB размещены в SRAM, как описано в таблице 4-3. Каждый EDB содержит информацию, описывающую X- и Y- буферы. В дополнение, каждый EDB предоставляет общую информацию статуса.
В таблице 4-5 показаны записи для блоков EDB от EDB-1 до EDB-3. Регистры EDB-0 описаны в таблице 4-6.
Таблица 4-5. Регистры конечной точки и смещения в RAM (n = 1 .. 3)
Смещение |
Имя записи |
Описание |
07 |
EPSIZXY_n |
I/O endpoint_n: размер буфера X/Y. |
06 |
EPBCTY_n |
I/O endpoint_n: счетчик байт Y. |
05 |
EPBBAY_n |
I/O endpoint_n: базовый адрес буфера Y. |
04, 03 |
SPARE |
Не используется. |
02 |
EPBCTX_n |
I/O endpoint_n: счетчик байт X. |
01 |
EPBBAX_n |
I/O endpoint_n: базовый адрес буфера X. |
00 |
EPCNF_n |
I/O endpoint_n: конфигурация. |
Таблица 4-6. Базовые адреса регистров конечной точки
Базовый адрес |
Описание |
FF08h |
Output endpoint 1 |
FF10h |
Output endpoint 2 |
FF18h |
Output endpoint 3 |
FF48h |
Input endpoint 1 |
FF50h |
Input endpoint 2 |
FF58h |
Input endpoint 3 |
4.3.1. OEPCNF_n: Output Endpoint Configuration (n = 1 .. 3) (базовые адреса: FF08h, FF10h, FF18h) - конфигурация Output Endpoint
№ бита |
Имя |
RESET |
Описание бит |
1-0 |
RSV |
x |
Зарезервировано, равно 0.
|
2 |
USBIE |
x |
Разрешение прерывания по завершению транзакции USB. Устанавливается и сбрасывается MCU.
USBIE=0: по завершению транзакции прерывание не сработает. USBIE=1: по завершению транзакции сработает прерывание.
|
3 |
STALL |
0 |
Показывает событие stall. Устанавливается и сбрасывается MCU.
STALL=0: нет события stall. STALL=1: произошло событие stall. Если этот бит установлен MCU, то инициализируется STALL рукопожатие (handshake) и бит очищается MCU.
|
4 |
DBUF |
x |
Разрешение двойного буфера (X и Y). Устанавливается и сбрасывается MCU.
DBUF=0: используется только главный буфер (только буфер X). DBUF=1: в выборе буфера участвует TOGLE - бит переключения буфера (работает двойное буферизирование).
|
5 |
TOGLE |
x |
Бит переключения буфера USB, отражающий состояние последовательности DATA0, DATA1.
|
6 |
ISO |
x |
ISO=0 означает неизохронный трансфер данных. Этот бит обязательно должен быть очищен MCU, поскольку поддерживаются только неизохронные передачи.
|
7 |
UBME |
x |
Бит разрешения UBM. Устанавливается и сбрасывается MCU.
UBME=0: UBM не может использовать эту конечную точку. UBME=1: UBM может использовать эту конечную точку.
|
4.3.2. OEPBBAX_n: Output Endpoint X-Buffer Base Address (n = 1 .. 3) (смещение 1) - базовый адрес X-буфера Output Endpoint
№ бита |
Имя |
RESET |
Описание бит |
7-0 |
A[10:3] |
x |
Биты 10..3 базового адреса буфера X, дополненные справа 3 нулевыми младшими битами для получения 11-битного адреса. Значение этого регистра устанавливается MCU. UBM или DMA используют это значение как начальный адрес для указанной транзакции. Имейте в виду, что UBM или DMA не меняют это значение по окончании транзакции.
|
В регистре OEPBBAX_n задано смещение относительно адреса 0xF800 в области данных XDATA. Т. е. реальный абсолютный адрес буфера, в который будет класть данные UBM, вычисляется следующим образом:
OUT_BUFFERXn_ADDRESS = 0xF800 + (OEPBBAX_n << 3)
4.3.3. OEPBCTX_n: Output Endpoint X Byte Count (n = 1 .. 3) (смещение 2) - счетчик байт X-буфера Output Endpoint
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
C[6:0] |
x |
Счетчик байт буфера X, который считает до 64 (1000000b). Любое значение больше 64 может привести к непредсказуемым результатам.
|
7 |
NAK |
x |
NAK=0: в буфере нет допустимых данных. Готовность к OUT хоста. NAK=1: буфер содержит допустимый пакет от хоста (выдает ответ NAK на запрос хоста OUT).
|
4.3.4. OEPBBAY_n: Output Endpoint Y-Buffer Base Address (n = 1 .. 3) (смещение 5) - базовый адрес Y-буфера Output Endpoint
№ бита |
Имя |
RESET |
Описание бит |
7-0 |
A[10:3] |
x |
Биты 10..3 базового адреса буфера Y, дополненные справа 3 нулевыми младшими битами для получения 11-битного адреса. Значение этого регистра устанавливается MCU. UBM или DMA используют это значение как начальный адрес для указанной транзакции. Имейте в виду, что UBM или DMA не меняют это значение по окончании транзакции.
|
В регистре OEPBBAY_n задано смещение относительно адреса 0xF800 в области данных XDATA. Т. е. реальный абсолютный адрес буфера, в который будет класть данные UBM, вычисляется следующим образом:
OUT_BUFFERYn_ADDRESS = 0xF800 + (OEPBBAY_n << 3)
4.3.5. OEPBCTY_n: Output Endpoint Y Byte Count (n = 1 .. 3) (смещение 6) - счетчик байт Y-буфера Output Endpoint
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
C[6:0] |
x |
Счетчик байт буфера Y, который считает до 64 (1000000b). Любое значение больше 64 может привести к непредсказуемым результатам.
|
7 |
NAK |
x |
NAK=0: в буфере нет допустимых данных. Готовность к OUT хоста. NAK=1: буфер содержит допустимый пакет от хоста (выдает ответ NAK на запрос хоста OUT).
|
4.3.6. OEPSIZXY_n: Output Endpoint X-/Y-Buffer Size (n = 1 .. 3) (смещение 7) - размер буферов X и Y Output Endpoint
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
S[6:0] |
x |
Размер буфера X и буфера Y, от 0 (0000000b) до 64 (1000000b). Любое значение больше 64 может привести к непредсказуемым результатам.
|
7 |
RSV |
x |
Зарезервировано, равно 0.
|
4.3.7. IEPCNF_n: Input Endpoint Configuration (n = 1 .. 3) (базовый адрес: FF48h, FF50h, FF58h) - конфигурация Input Endpoint
№ бита |
Имя |
RESET |
Описание бит |
1-0 |
RSV |
x |
Зарезервировано, равно 0.
|
2 |
USBIE |
x |
Разрешение прерывания по завершению транзакции USB. Устанавливается и сбрасывается MCU.
USBIE=0: по завершению транзакции прерывание не сработает. USBIE=1: по завершению транзакции сработает прерывание.
|
3 |
STALL |
0 |
Показывает событие stall. Устанавливается UBM, но может быть установлен / сброшен MCU.
STALL=0: нет события stall. STALL=1: произошло событие stall. Если этот бит установлен MCU, то инициализируется STALL рукопожатие (handshake) и бит автоматически очищается.
|
4 |
DBUF |
x |
Разрешение двойного буфера (X и Y). Устанавливается и сбрасывается MCU.
DBUF=0: используется только главный буфер (только буфер X). DBUF=1: в выборе буфера участвует TOGLE - бит переключения буфера (работает двойное буферизирование).
|
5 |
TOGLE |
x |
Бит переключения буфера USB, отражающий состояние последовательности DATA0, DATA1.
|
6 |
ISO |
x |
ISO=0 означает неизохронный трансфер данных. Этот бит обязательно должен быть очищен MCU, поскольку поддерживаются только неизохронные передачи.
|
7 |
UBME |
x |
Бит разрешения UBM. Устанавливается и сбрасывается MCU.
UBME=0: UBM не может использовать эту конечную точку. UBME=1: UBM может использовать эту конечную точку.
|
4.3.8. IEPBBAX_n: Input Endpoint X-Buffer Base Address (n = 1 .. 3) (смещение 1) - базовый адрес X-буфера Input Endpoint
№ бита |
Имя |
RESET |
Описание бит |
7-0 |
A[10:3] |
x |
Биты 10..3 базового адреса буфера X, дополненные справа 3 нулевыми младшими битами для получения 11-битного адреса. Значение этого регистра устанавливается MCU. UBM или DMA используют это значение как начальный адрес для указанной транзакции. Имейте в виду, что UBM или DMA не меняют это значение по окончании транзакции.
|
В регистре IEPBBAX_n задано смещение относительно адреса 0xF800 в области данных XDATA. Т. е. реальный абсолютный адрес буфера, из которого UBM будет брать данные для отправки хосту, вычисляется следующим образом:
IN_BUFFERXn_ADDRESS = 0xF800 + (IEPBBAX_n << 3)
4.3.9. IEPBCTX_n: Input Endpoint X-Byte Count (n = 1 .. 3) (смещение 2) - счетчик байт X-буфера Input Endpoint
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
C[6:0] |
x |
Счетчик байт буфера X, который считает до 64 (1000000b). Любое значение больше 64 может привести к непредсказуемым результатам.
|
7 |
NAK |
x |
NAK=0: буфер содержит допустимый пакет для IN-транзакции хоста. NAK=1: буфер пуст (выдает ответ NAK на запрос хоста IN).
|
4.3.10. IEPBBAY_n: Input Endpoint Y-Buffer Base Address (n = 1 .. 3) (смещение 5) - базовый адрес Y-буфера Input Endpoint
№ бита |
Имя |
RESET |
Описание бит |
7-0 |
A[10:3] |
x |
Биты 10..3 базового адреса буфера Y, дополненные справа 3 нулевыми младшими битами для получения 11-битного адреса. Значение этого регистра устанавливается MCU. UBM или DMA используют это значение как начальный адрес для указанной транзакции. Имейте в виду, что UBM или DMA не меняют это значение по окончании транзакции.
|
В регистре IEPBBAY_n задано смещение относительно адреса 0xF800 в области данных XDATA. Т. е. реальный абсолютный адрес буфера, из которого UBM будет брать данные для отправки хосту, вычисляется следующим образом:
IN_BUFFERYn_ADDRESS = 0xF800 + (IEPBBAY_n << 3)
4.3.11. IEPBCTY_n: Input Endpoint Y-Byte Count (n = 1 .. 3) (смещение 6) - счетчик байт Y-буфера Input Endpoint
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
C[6:0] |
x |
Счетчик байт буфера Y, который считает до 64 (1000000b). Любое значение больше 64 может привести к непредсказуемым результатам.
|
7 |
NAK |
x |
NAK=0: буфер содержит допустимый пакет для IN-транзакции хоста. NAK=1: буфер пуст (выдает ответ NAK на запрос хоста IN).
|
4.3.12. IEPSIZXY_n: Input Endpoint X-/Y-Buffer Size (n = 1 .. 3) (смещение 7) - размер буферов X и Y Input Endpoint
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
S[6:0] |
x |
Размер буфера X и буфера Y, от 0 (0000000b) до 64 (1000000b). Любое значение больше 64 может привести к непредсказуемым результатам.
|
7 |
RSV |
x |
Зарезервировано, равно 0.
|
4.4. Регистры дескриптора Endpoint-0
В отличие от регистров EDB-1 .. EDB-3, которые определены как ячейки памяти SRAM, endpoint-0 описана набором 4 регистров (два для вывода и два для ввода). Регистры дескриптора EDB-0 и их соответствующие адреса указаны в таблице 4-7. У EDB-0 нет регистра базового адреса буфера, поскольку эти адреса жестко назначены на ячейки FEF8h и FEF0h. Обратите внимание, что позиции бит сохранены, чтобы соответствовать EDB-n (n = 1 .. 3).
Таблица 4-7. Регистры ввода/вывода EDB-0
Адрес |
Имя регистра |
Описание |
Базовый адрес буфера |
FF83h FF82h |
OEPBCNT_0 OEPCNFG_0 |
Output endpoint_0: регистр счетчика байт Output endpoint_0: регистр конфигурации |
FEF0h |
FF81h FF80h |
IEPBCNT_0 IEPCNFG_0 |
Input endpoint_0: регистр счетчика байт Input endpoint_0: регистр конфигурации |
FEF8h |
4.4.1. IEPCNFG_0: Input Endpoint-0 Configuration Register (адрес FF80h) - регистр конфигурации Input Endpoint-0
№ бита |
Имя |
RESET |
Описание бит |
1-0 |
RSV |
0 |
Зарезервировано, равно 0.
|
2 |
USBIE |
0 |
Разрешение прерывания по завершению транзакции USB. Устанавливается и сбрасывается MCU.
USBIE=0: по завершению транзакции прерывание не сработает. USBIE=1: по завершению транзакции сработает прерывание.
|
3 |
STALL |
0 |
Показывает событие stall. Устанавливается и сбрасывается MCU.
STALL=0: нет события stall. STALL=1: произошло событие stall. Если этот бит установлен MCU, то инициализируется STALL рукопожатие (handshake) и бит очищается автоматически при следующей транзакции настройки (setup).
|
4 |
RSV |
0 |
Зарезервировано, равно 0.
|
5 |
TOGLE |
0 |
Бит переключения буфера USB, отражающий состояние последовательности DATA0, DATA1.
|
6 |
RSV |
0 |
Зарезервировано, равно 0.
|
7 |
UBME |
0 |
Бит разрешения UBM. Устанавливается и сбрасывается MCU.
UBME=0: UBM не может использовать эту конечную точку. UBME=1: UBM может использовать эту конечную точку.
|
4.4.2. IEPBCNT_0: Input Endpoint-0 Byte Count Register (адрес FF81h) - регистр счетчика байт Input Endpoint-0
№ бита |
Имя |
RESET |
Описание бит |
3-0 |
C[3:0] |
0000 |
Счетчик байт, который считает до 8 (1000b). Любое значение больше 8 зарезервировано (если используется, то все равно по умолчанию 8).
|
6-4 |
RSV |
000 |
Зарезервировано, равно 0.
|
7 |
NAK |
1 |
NAK=0: буфер содержит допустимый пакет для IN-транзакции хоста. NAK=1: буфер пуст (выдает ответ NAK на запрос хоста IN).
|
4.4.3. OEPCNFG_0: Output Endpoint-0 Configuration Register (адрес FF82h) - регистр конфигурации Output Endpoint-0
№ бита |
Имя |
RESET |
Описание бит |
1-0 |
RSV |
0 |
Зарезервировано, равно 0.
|
2 |
USBIE |
0 |
Разрешение прерывания по завершению транзакции USB. Устанавливается и сбрасывается MCU.
USBIE=0: по завершению транзакции прерывание не сработает. USBIE=1: по завершению транзакции сработает прерывание.
|
3 |
STALL |
0 |
Показывает событие stall. Устанавливается и сбрасывается MCU.
STALL=0: нет события stall. STALL=1: произошло событие stall. Если этот бит установлен MCU, то инициализируется STALL рукопожатие (handshake) и бит автоматически очищается.
|
4 |
RSV |
0 |
Зарезервировано, равно 0.
|
5 |
TOGLE |
0 |
Бит переключения буфера USB, отражающий состояние последовательности DATA0, DATA1.
|
6 |
RSV |
0 |
Зарезервировано, равно 0.
|
7 |
UBME |
0 |
Бит разрешения UBM. Устанавливается и сбрасывается MCU.
UBME=0: UBM не может использовать эту конечную точку. UBME=1: UBM может использовать эту конечную точку.
|
4.4.4. OEPBCNT_0: Output Endpoint-0 Byte Count Register (адрес FF83h) - регистр счетчика байт Output Endpoint-0
№ бита |
Имя |
RESET |
Описание бит |
3-0 |
C[3:0] |
0000 |
Счетчик байт, который считает до 8 (1000b). Любое значение больше 8 зарезервировано.
|
6-4 |
RSV |
000 |
Зарезервировано, равно 0.
|
7 |
NAK |
1 |
NAK=0: в буфере нет допустимых данных. Готовность к транзакции OUT от хоста. NAK=1: буфер содержит допустимый пакет от хоста, пока не обработанный MCU (выдает ответ NAK на запрос хоста OUT).
|
[5. Регистры USB]
5.1 FUNADR: Function Address Register (адрес FFFFh) - регистр адреса функции
В этом регистре содержится адрес функции устройства USB.
№ бита |
Имя |
RESET |
Описание бит |
6-0 |
FA[6:0] |
0 |
Эти биты задают текущий адрес устройства, назначенный на функцию. MCU записывает сюда указанное значение при поступлении от хоста команды SET ADDRESS.
|
7 |
RSV |
0 |
Зарезервировано, равно 0.
|
5.2. USBSTA: USB Status Register (адрес FFFEh) - регистр статуса USB
Все биты в этом регистре устанавливаются аппаратно и очищаются MCU, когда он записывает 1 в соответствующее место расположения бита (запись 0 не оказывает эффекта). Дополнительно каждый бит может генерировать прерывание, если установлен соответствующий бит маски прерываний (сокращение R/C означает, что чтение read и очистка clear осуществляется только под управлением MCU).
№ бита |
Имя |
RESET |
Описание бит |
0 |
STPOW |
0 |
Бит перезаписи SETUP. Устанавливается аппаратно, когда принят setup packet, при этом пакет setup уже находится в буфере setup.
STPOW=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). STPOW=1: SETUP overwrite
|
1 |
WAKEUP |
0 |
Бит удаленного пробуждения (remote wakeup).
WAKEUP=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). WAKEUP=1: запрос на пробуждение хоста, который поступил от ножки WAKEUP.
|
2 |
SETUP |
0 |
Бит, сигнализирующий о приеме транзакции SETUP. Пока SETUP в состоянии 1, на все запросы IN и OUT для конечной точки 0 будет ответ NAK, независимо от их реальных значений бита NAK.
SETUP=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). SETUP=1: принята транзакция настройки (SETUP).
|
3 |
URRI |
0 |
Бит статуса UART RI (состояние звонка) - фронт сигнала RI приводит к установке этого бита.
URRI=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). URRI=1: модемом был детектирован звонок, и это событие используется для того, чтобы разбудить чип (для вывода его из режима приостановки suspend).
|
4 |
RSV |
0 |
Зарезервировано.
|
5 |
RESR |
0 |
Бит запроса на возобновление (resume) функции.
RESR=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). RESR=1: детектировано возобновление функции (function resume).
|
6 |
SUSR |
0 |
Бит запроса на приостановку (suspend) функции. Этот бит устанавливается в ответ на глобальное или селективное событие приостановки.
SUSR=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). SUSR=1: детектирована приостановка функции (function suspend).
|
7 |
RSTR |
0 |
Бит запроса на сброс функции. Этот бит устанавливается в ответ на запуск хостом процедуры сброса порта USB (USB reset). Этот бит не затрагивается сбросом функции USB (USB function reset).
RSTR=0: MCU может очистить этот бит, если запишет в него 1 (запись 0 не дает никакого эффекта). RSTR=1: детектирован сброс функции.
|
5.3. USBMSK: USB Interrupt Mask Register (адрес FFFDh) - регистр маски прерывания USB
№ бита |
Имя |
RESET |
Описание бит |
0 |
STPOW |
0 |
Бит разрешения прерывания на событие SETUP overwrite.
STPOW=0: прерывание STPOW запрещено STPOW=1: прерывание STPOW разрешено
|
1 |
WAKEUP |
0 |
Бит разрешения прерывания на событие удаленного пробуждения (remote wakeup).
WAKEUP=0: прерывание WAKEUP запрещено WAKEUP=1: прерывание WAKEUP разрешено
|
2 |
SETUP |
0 |
Бит разрешения прерывания на событие SETUP.
SETUP=0: прерывание SETUP запрещено SETUP=1: прерывание SETUP разрешено
|
3 |
URRI |
0 |
Бит разрешения прерывания на событие звонка UART RI.
URRI=0: прерывание UART RI запрещено URRI=1: прерывание UART RI разрешено
|
4 |
RSV |
0 |
Зарезервировано.
|
5 |
RESR |
0 |
Бит разрешения прерывания на возобновление (resume) функции.
RESR=0: прерывание от возобновления функции запрещено RESR=1: прерывание от возобновления функции разрешено
|
6 |
SUSR |
0 |
Бит разрешения прерывания на приостановку (suspend) функции.
SUSR=0: прерывание от приостановки функции запрещено SUSR=1: прерывание от приостановки функции разрешено
|
7 |
RSTR |
0 |
Бит разрешения прерывания на сброс функции. Этот бит не затрагивается сбросом функции USB (USB function reset).
RSTR=0: прерывание от сброса функции запрещено RSTR=1: прерывание от сброса функции разрешено
|
5.4. USBCTL: USB Control Register (адрес FFFCh) - регистр управления USB
В отличие от остальных регистров, этот регистр очищается только сигналом сброса при включении питания. USB reset не может сбросить этот регистр (см. рис. 5-1).
№ бита |
Имя |
RESET |
Описание бит |
0 |
DIR |
0 |
Как ответ на setup paket, MCU декодирует запрос и устанавливает/сбрасывает этот бит, чтобы отразить направление трансфера данных.
DIR=0: транзакция USB data-OUT (от хоста к TUSB3410) DIR=1: транзакция USB data-IN (от TUSB3410 к хосту)
|
1 |
SIR |
0 |
Бит статуса прерывания SETUP. Этот бит управляется MCU чтобы показать аппаратуре, когда обрабатывается прерывание SETUP.
SIR=0: прерывание SETUP не находится в обработке. MCU очищает этот бит перед выходом из обработчика прерывания SETUP. SIR=1: прерывание SETUP в настоящий момент обрабатывается. MCU устанавливает этот бит в начале обработчика прерывания SETUP.
|
2 |
RSV |
0 |
Зарезервировано, равно 0.
|
3 |
RSV |
0 |
В этот бит всегда должен записываться 0.
|
4 |
FRSTE |
1 |
Бит привязки сброса функции к сбросу MCU. Этот бит соединяет USB function reset с MCU reset или наоборот разъединяет их.
FRSTE=0: запись 0 в этот бит не даёт никакого эффекта FRSTE=1: сброс функции соединен со сбросом MCU
|
5 |
RWUP |
0 |
Запрос на удаленное пробуждение устройства (device remote wakeup request). Этот бит устанавливается MCU и сбрасывается автоматически.
RWUP=0: запись 0 в этот бит не даёт никакого эффекта RWUP=1: когда MCU записывает сюда 1, генерируется импульс remote-wakeup.
|
6 |
IREN |
0 |
Разрешение режима IR. Этот бит устанавливается и сбрасывается под управлением firmware MCU.
IREN=0: кодер/декодер IR запрещен, выбран режим UART RSTR=1: кодер/декодер IR разрешен, режим UART не выбран
|
7 |
CONT |
0 |
Бит соединения/разъединения.
CONT=0: порт upstream USB отключен, pullup запрещен CONT=1: порт upstream USB подключен, pullup разрешен
|
5.5. MODECNFG: Mode Configuration Register (адрес FFFBh) - регистр конфигурации режима
Этот регистр очищается только сигналом сброса при включении питания. USB reset не может сбросить этот регистр.
№ бита |
Имя |
RESET |
Описание бит |
0 |
TXCNTL |
0 |
Управление выходом передачи: выбор аппаратного или программного (под управлением firmware) выбора состояния буфера последовательного выхода, который может переключаться в третье состояние.
TXCNTL=0: выбрано автоматическое переключение под управлением аппаратуры TXCNTL=1: выбрано программное переключение
|
1 |
SOFTSW |
0 |
Программное переключение: управляемый firmware выходной буфер с третьим состоянием разрешается для вывода на внешнюю ножку чипа.
SOFTSW=0: буфер последовательного выхода разрешен SOFTSW=1: буфер последовательного выхода запрещен
|
2 |
CLKOUTEN |
0 |
Разрешение выхода тактов: разрешает / запрещает вывод тактов на ножку CLKOUT.
CLKOUTEN=0: вывод тактов запрещен. На выходе CLKOUT логический 0. CLKOUTEN=1: вывод тактов разрешен
|
3 |
CLKSLCT |
0 |
Выбор источника сигнала для выхода тактов CLKOUT: можно выбрать либо фиксированную частоту 3.566 МГц, либо такты для UART.
CLKSLCT=0: выбран в качестве тактового сигнала генератор скорости UART. CLKSLCT=1: на CLKOUT будет выводиться фиксированная частота 3.566 МГц
|
4-7 |
RSV |
0 |
Зарезервировано.
|
Управление выводом тактов (Clock Output Control)
Бит 2 (CLKOUTEN) в регистре MODECNFG разрешает или запрещает вывод тактов на ножке CLKOUT TUSB3410. При включении по умолчанию CLKOUT запрещен. Если это необходимо, firmware может записать 1, чтобы разрешить вывод тактов.
Бит 3 (CLKSLCT) в регистре MODECNFG выбирает источник выходных тактов либо от фиксированной частоты 3.556 МГц, либо от тактов UART BaudOut.
5.6. Vendor ID/Product ID (VID/PID)
USB-IF и сертификация Microsoft WHQL требует эти параметры, и производители оборудования используют свои собственные уникальные ID вендора (Vedor ID, VID) и ID продукта (Product ID, PID, идентификатор модели). OEM не могут использовать идентификаторы VID/PID чипа вендора (например, VID/PID Texas Instruments) в своих окончательных продуктах. Уникальные комбинации VID/PID предотвращает потенциальные конфликты драйвера и разрешают сертификацию, привязанную к логотипу. Для дополнительной информации см. www.usb.org.
5.7. SERNUM7..SERNUM0: Device Serial Number Register (байты 7..0) (адреса FFEFh..FFE8h) - регистр серийного номера устройства
Каждая микросхема TUSB3410 имеет свой собственный уникальный 64-битный серийный номер, который генерируется во время производства. Этот номер последовательно увеличивается, однако нет гарантии того, что в этом процессе некоторые номера не будут пропущены. После сброса при включении питания SERNUM7 содержит самый значащий байт 64-битного серийного номера, а SERNUM0 самый младший байт. Эти данные не могут быть сброшены или перезаписаны.
Далее описана процедура загрузки серийного номера устройства в общее RAM:
• После сброса при включении питания код загрузки копирует предопределенные дескрипторы USB в общее RAM. В результате серийный номер по умолчанию, который жестко прошит в коде загрузчика (0x00 hex) копируется в общее RAM. • Код загрузки проверяет наличие EEPROM на порте I2C. Если EEPROM подключено и содержит допустимый серийный номер как часть дескриптора устройства USB (сохраненного в EEPROM), то код загрузки перезаписывает серийный номер, сохраненный в общем RAM серийным номером, который найден в EEPROM. В противном случае значение серийного номера, которое было сохранено в общем RAM, остается неизменным. Если в EEPROM было сохранено firmware, то оно запускается на выполнение. Это firmware может читать регистры SERNUM7 .. SERNUM0 и перезаписать серийный номер, сохраненный в RAM, или сохранить свой собственный номер в RAM. • В результате значение серийного номера во внешнем EEPROM имеет самый высокий приоритет для загрузки в общее XDATA RAM. Значение серийного номера используется как часть информации правильного дескриптора устройства при нормальной работе.
5.15. Функционирование сброса и путь сигнала сброса при включении питания (Power-Up Reset)
На рис. 5-1 показано логическое соединение функции сброса шины USB (сигнал ~USBR) сигнала ножки внешнего сброса (~RESET). Внутренний сигнал сброса генерируется из уровня на выводе ~RESET (сигнал ~PURS) или от сигнала сброса USB (сигнал ~USBRS). Сигнал ~USBRS может быть разрешен или запрещен битом 4 (FRSTE) регистра USBCTL (см. секцию 5.4), при включении питания FRSTE = 0. Внутренний сброс используется для переустановки всех регистров и логики, за исключением регистров USBCTL и MODECNFG, которые сбрасываются только сигналом ~PURS.
Рис. 5-1. Схема генерации и прохождения сигнала сброса.
5.16. Нагрузочный резистор (Pullup Resistor) для подключения/отключения устройства USB
Процесс энумерации TUSB3410 может запустить MCU (при этом не нужно физически переподключать кабель USB). На рисунке 5-2 показана реализация подключения и отключения TUSB3410 к USB up-stream порту. Когда бит 7 (CONT) в регистре USBCTL установлен в 1 (см. секцию 5.4), CMOS-ключ подключает VDD к нагрузочному резистору (подключенному к ножке PUR), что запускает для USB хоста нормальное событие подключения (normal connect condition). Когда CONT сброшен в 0, вывод PUR переходит в низкий логический уровень. В этом состоянии резистор 1.5 кОм подключается к GND, в результате чего устройство переходит в отключенное состояние. CMOS-ключ PUR может предоставить ток как минимум 8 mA (VDD - 0.1V).
Рис. 5-2. Схема нагрузочного резистора для подключения/отключения устройства USB
[6. Контроллер DMA]
В таблице 6-1 показаны каналы DMA и связанные с ними направления передачи данных. Два канала предоставлены для трансфера данных между хостом и UART.
Таблица 6-1. Каналы DMA
Канал DMA |
Направление передачи |
Комментарии |
DMA-1 |
От хоста к UART |
DMA пишет данные в регистр TDR UART |
DMA-3 |
От UART к хосту |
DMA читает данные из регистра RDR UART |
6.1. Регистры контроллера DMA
Каждый канал DMA может указывать на один из трех EDB (EDB-1 .. EDB-3) и передавать данные в/из канала UART. DMA может перемещать данные из указанного буфера конечной точки out (который определен EDB) в порт назначения. Точно так же DMA может переносить данные из порта в буфер конечной точки input.
На приеме по окончании передачи блока DMA обновляет счетчик байт и бит 7 (NAK) в EDB (см. секцию 4.3). Дополнительно DMA использует бит 4 (XY) в регистре DMACDR для автоматического переключения (без прерывания работы MCU, так как переключение бита XY делает блок UBM). DMA останавливается только когда происходит таймаут или случается ошибка. Когда DMA передает (из буфера X/Y), то он продолжает переключение буферов X/Y, пока не обнаружит, что значение счетчика байт меньше размера буфера (обычно размер буфера 64 байта). В этот момент передача завершается и останавливается.
6.1.1. DMACDR1: DMA Channel Definition Register (UART Transmit Channel) (адрес FFE0h) - регистр определения канала DMA (канал передачи UART)
Этот регистр задает номер EDB который использует DMA для передачи данных в UART. Дополнительно этот регистр задает направление передачи данных и выбирает буфер транзакции X или Y.
№ бита |
Имя |
RESET |
Описание бит |
2-0 |
E[2:0] |
0 |
Указатель дескриптора конечной точки. Это поле бит указывает на набор регистров EDB, которые должны использоваться для указанного трансфера.
|
3 |
T/R |
0 |
Этот бит всегда 1, что показывает - данные переносятся DMA из SRAM в регистр TDR UART (см. секцию 7.1.2). MCU не может изменить этот бит.
|
4 |
XY |
0 |
Выбор буфера X/Y.
XY=0: следующий для передачи/приема будет буфер X XY=1: следующий для передачи/приема будет буфер Y
|
5 |
CNT |
0 |
Бит управления непрерывностью трансфера DMA. Этот бит задает режим трансфера DMA, и всегда должен быть записан в состояние лог. 1.
В этом режиме DMA и UBM чередуют использование буферов X и Y (двойное буферизирование). DMA устанавливает бит 4 XY, и UBM использует его для трансфера. DMA переключается между буферами X и Y и продолжает передачу (то из буфера X, то из Y) без всякого вмешательства MCU. DMA прекращает работу и вызывает срабатывание прерывания MCU в следующих случаях:
1. Когда счетчик байтов UBM меньше размера буфера (заданного в EDB), DMA делает трансфер частично заполненного пакета и вызывает прерывание MCU по завершении. 2. Истекает таймер транзакции. DMA также вызывает срабатывание прерывания MCU.
|
6 |
INE |
0 |
Бит разрешения / запрещения прерывания DMA. Этот бит разрешает и запрещает прерывание по завершении транзакции.
INE=0: прерывание запрещено. Дополнительно бит 0 PPKT в регистре DMACSR1 (см. секцию 6.1.2) не очищается, бит 7 EN и DMAC не запрещены. INE=1: разрешает прерывание EN. Когда этот бит установлен, DMA вызывает срабатывание прерывания MCU при переходе из 1 в 0 бита 7 EN. Когда трансфер завершен, EN=0.
|
7 |
EN |
0 |
Разрешение канала DMA. MCU устанавливает этот бит для начала трансфера DMA. Когда трансфер завершен, или прерван из-за ошибки, этот бит очищается. Переход этого бита из состояния 1 в 0 генерирует прерывание (если прерывание разрешено).
EN=0: DMA остановлен. Остановка происходит, когда счетчик байт достигает нуля, или когда происходит таймаут транзакции. Когда остановлено, DMA обновляет счетчик байт, устанавливает NAK=0 в регистре счетчика байт конечной точки output, и вызывает прерывание MCU (если бит 6 INE равен 1). EN=1: установка этого бита стартует трансфер DMA.
|
6.1.2. DMACSR1: DMA Control And Status Register (UART Transmit Channel) (адрес FFE1h) - регистр управления и состояния DMA (канал передачи UART)
Этот регистр задает значение таймаута транзакции. Дополнительно он содержит код завершения, который сообщает о любых событиях ошибок и таймаута.
№ бита |
Имя |
RESET |
Описание бит |
0 |
PPKT |
0 |
Бит события частично заполненного пакета. Этот бит устанавливается DMA и очищается MCU.
PPKT=0: нет события частично заполненного пакета PPKT=1: детектировано событие частично заполненного пакета. Когда INE=0, этот бит не очищает бит 7 EN в регистре DMACDR1; таким образом, DMAC остается разрешенным, готовым к следующей транзакции. Бит PPKT очищается, когда MCU записывает в него 1, запись 0 не дает никакого эффекта.
|
7-1 |
- |
0 |
Эти биты доступны только для чтения и всегда читаются как нули.
|
6.1.3. DMACDR3: DMA Channel Definition Register (UART Receive Channel) (адрес FFE4h) - регистр определения канала DMA (канал приема UART)
Этот регистр задает номер EDB, который DMA использует для передачи данных из UART. Дополнительно этот регистр задает направление передачи данных и выбирает буфер транзакции X или Y.
№ бита |
Имя |
RESET |
Описание бит |
2-0 |
E[2:0] |
0 |
Указатель дескриптора конечной точки. Это поле бит указывает на набор регистров EDB, которые должны использоваться для указанного трансфера.
|
3 |
T/R |
0 |
Этот бит всегда читается как 1. Его нужно записать в 0, чтобы обновить бит буфера XY (в этом регистре бит 4), это надо выполнять только в режиме ускоренной передачи (burst mode).
|
4 |
XY |
0 |
Выбор буфера X/Y.
XY=0: следующий для передачи/приема будет буфер X XY=1: следующий для передачи/приема будет буфер Y
|
5 |
CNT |
0 |
Бит управления непрерывностью трансфера DMA. Этот бит задает режим трансфера DMA, и всегда должен быть записан в состояние лог. 1.
В этом режиме DMA и UBM чередуют использование буферов X и Y (двойное буферизирование). UBM устанавливает бит 4 XY, и DMA использует его для трансфера. DMA переключается между буферами X и Y и продолжает прием (то в буфер X, то в Y) без всякого вмешательства MCU. DMA прекращает работу и вызывает срабатывание прерывания MCU в следующих случаях:
1. Истекает таймер транзакции: DMA обновляет EDB и вызывает срабатывание прерывания MCU. UBM при этом передает хосту частично заполненный пакет. 2. Произошла ошибка приемника UART: DMA обновляет EDB, но при этом прерывание MCU не вызывает. UBM также передает хосту частично заполненный пакет.
|
6 |
INE |
0 |
Бит разрешения / запрещения прерывания DMA. Этот бит разрешает и запрещает прерывание по завершении транзакции.
INE=0: прерывание запрещено. Дополнительно бит 0 OVRUN и бит 1 TXFT в регистре DMACSR3 (см. секцию 6.1.4) не очищается, бит 7 EN и DMAC не запрещены. INE=1: разрешает прерывание EN. Когда этот бит установлен, DMA вызывает срабатывание прерывания MCU при переходе из 1 в 0 бита 7 EN. Когда трансфер завершен, EN=0.
|
7 |
EN |
0 |
Разрешение канала DMA. MCU устанавливает этот бит для начала трансфера DMA. Когда трансфер завершен, или прерван из-за ошибки, этот бит очищается. Переход этого бита из состояния 1 в 0 генерирует прерывание (если прерывание разрешено).
EN=0: DMA остановлен. Остановка происходит, когда происходит таймаут транзакции, или когда происходит ошибка приемника UART. Когда остановлено, DMA обновляет счетчик байт, устанавливает NAK=0 в регистре счетчика байт конечной точки input. Если остановка DMA произошла по таймауту транзакции, то DMA запускает прерывание. Однако, если остановка DMA произошла из-за ошибки UART, то DMA прерывание MCU не генерируется (в этом случае будет соответствующее прерывание от UART). EN=1: установка этого бита стартует трансфер DMA.
|
6.1.4. DMACSR3: DMA Control And Status Register (UART Receive Channel) (адрес FFE5h) - регистр управления и состояния DMA (канал приема UART)
Этот регистр задает значение таймаута транзакции. Дополнительно он содержит код завершения, который сообщает о любых событиях ошибок и таймаута.
№ бита |
Имя |
RESET |
Описание бит |
0 |
OVRUN |
0 |
Бит события переполнения. Этот бит устанавливается DMA и очищается MCU (см. таблицу 6-2).
OVRUN=0: переполнения не было OVRUN=1: детектировано переполнение. Когда IEN=0, этот бит не очищает бит 7 EN в регистре DMACDR3; таким образом, DMAC остается разрешенным, готовым к следующей транзакции. Бит OVRUN очищается, когда MCU запишет в него 1, запись 0 не дает никакого эффекта.
|
1 |
TXFT |
0 |
Бит события таймаута (см. таблицу 6-2).
TXFT=0: DMA остановил трансфер без таймаута. TXFT=1: DMA остановлен по таймауту транзакции. Когда IEN=0, этот бит не очищает бит 7 EN регистра DMACDR3 (см. секцию 6.1.3); таким образом, DMAC остается разрешенным, готовым к следующей транзакции. Очищается бит TXFT, когда MCU записывает в него 1, запись 0 не дает эффекта.
|
6-2 |
C[4:0] |
0 |
Это поле задает таймаут транзакции в единицах 1 мс. Это значение загружается в декрементный счетчик каждый раз при передаче байта. Декрементный счетчик уменьшается на 1 с каждым импульсом SOF (т. е. каждую миллисекунду). Если счетчик достиг нулевого значения, то устанавливается бит 1 TXFT и трансфер DMA останавливается. Счетчик начнет считать только когда установлены биты 7 TEN регистра DMACSR3 и бит 7 EN регистра DMACDR3, и был принят первый байт.
|
7 |
TEN |
0 |
Бит разрешения / запрещения счетчика таймаута транзакции.
TEN=0: счетчик запрещен (таймаут не отслеживается) TEN=1: счетчик таймаута разрешен
|
Таблица 6-2. События IN-завершения DMA (IN-Termination Condition)
Остановка IN |
TXFT |
OVRUN |
Комментарий |
Ошибка UART |
0 |
0 |
Было детектировано событие ошибки UART |
Частично заполненный пакет UART |
1 |
0 |
Это событие происходит, когда в приемник UART больше не поступают данные для хоста (данные поступают скудно, с паузами). |
UART overrun |
1 |
1 |
Это событие происходит, когда заполнены оба буфера X и Y, а также заполнен FIFO UART (хост занят, и не может принять данные). |
6.2. Ввод/вывод данных (Bulk Data I/O) с использованием EDB
UBM и DMAC обращаются к EDB для выборки параметров буфера для транзакций IN и OUT (IN и OUT по отношению к хосту). Подразумевается следующее:
• MCU инициализирует EDB • используется режим непрерывной работы DMA • Используется двойное буферизирование • Переключение X/Y управляется UBM
6.2.1. Транзакция IN (от TUSB3410 к хосту)
1. MCU инициализирует IEDB (пакет из 64 байт, и используется двойное буферизирование) и следующие регистры DMA:
• DMACSR3: задает величину таймаута транзакции. • DMACDR3: задает, какой используется IEDB и режим работы DMA (continuous mode, непрерывный режим). Как только в этом регистре установлен EN = 1, стартует процесс трансфера данных.
2. DMA переносит данные из UART в буфер X. Когда блок из 64 байт передан, DMA обновляет счетчик байт и сбрасывает NAK на 0 в регистре счетчика байт конечной точки input (это сигнализирует для UBM, что буфер X готов к передаче данных к хосту). Блок UBM запускает трансфер X-буфера к хосту с использованием значения счетчика байт в регистре счетчика байт и переключает бит X/Y. DMA продолжает перенос данных из UART в буфер Y. По окончании передачи блока DMA обновляет счетчик байт и сбрасывает NAK на 0 в регистре счетчика байт конечной точки input (это сигнализирует для UBM, что буфер Y готов к передаче данных к хосту). DMA продолжает трансфер данных от устройства к хосту, переключая при этом буферы X и Y без всякого вмешательства MCU.
3. Завершение трансфера: как уже было упомянуто, DMA/UBM продолжает перенос данных, переключаясь между буферами X и Y. Завершение трансфера может произойти при следующих событиях:
• Остановка переноса данных (Stop Transfer): хост оповещает MCU (через control endpoint) для остановки передачи. При этом событии MCU сбрасывает бит 7 (EN) на 0 в регистре DMACDR. • Часть пакета (Partial Packet): приемник устройства не имеет данных для передачи к хосту. При этом событии значение счетчика байт меньше 64 вызывает срабатывание таймера таймаута транзакции. Когда DMA детектирует это событие, то он устанавливает бит 1 (TXFT) на 1 и бит 0 (OVRUN) на 0 в регистре DMACSR3, обновляет счетчик байт и бит NAK в регистре счетчика байт конечной точки input, и запускает прерывание MCU. UBM передает частично заполненный пакет к хосту. • Переполнение буфера (Buffer Overrun): хост занят, буферы X и Y заполнены (X-NAK = 0 и Y-NAK = 0), и DMA не может записать что-то в эти буферы. Таймаут транзакции останавливает трансфер DMA, DMA устанавливает бит 1 (TXFT) на 1 и бит 0 (OVRUN) на 1 в регистре DMACSR3, и запускает прерывание MCU. • Событие ошибки UART (UART Error Condition): на приеме от UART событие ошибки приемника останавливает DMA устанавливает бит 1 (TXFT) на 1 и бит 0 (OVRUN) на 0 в регистре DMACSR3, но бит EN остается в установленным на 1. Таким образом, DMA не запускает прерывание MCU. Однако UART генерирует прерывание статуса, чем оповещает MCU о событии ошибки.
6.2.2. Транзакция OUT (от хоста к TUSB3410)
1. MCU инициализирует OEDB (пакет из 64 байт, и использование двойной буферизации) и следующие регистры DMA:
• DMACSR1: предоставляет индикацию частично заполненного пакета (partial packet). • DMACDR1: задает используемую конечную точку output режим работы DMA (continuous mode, непрерывный режим). Как только в этом регистре установлен EN = 1, стартует процесс трансфера данных.
2. UBM переносит данные от хоста в буфер X. Когда блок из 64 байт передан, UBM обновляет счетчик байт и сбрасывает NAK на 1 в регистре счетчика байт конечной точки output (это сигнализирует для DMA, что буфер X готов к передаче данных к UART). DMA запускает трансфер X-буфера к UART, используя значения счетчика байт в регистре счетчика байт конечной точки output. При этом UBM продолжает перенос данных от хоста в буфер Y. По окончании передачи блока UBM обновляет счетчик байт и сбрасывает NAK на 1 в регистре счетчика байт конечной точки output (это сигнализирует для DMA, что буфер Y готов к передаче данных к UART). DMA продолжает трансфер данных из буферов X и Y в UART, переключая при этом буферы X и Y без всякого вмешательства MCU.
3. Завершение трансфера: DMA/UBM продолжают трансфер данных с переключением буферов. Завершение трансфера может произойти при следующих событиях:
• Остановка переноса данных (Stop Transfer): хост оповещает MCU (с использованием control endpoint) для остановки передачи. При этом событии MCU сбрасывает EN на 0 в регистре DMACDR1. • Часть пакета (Partial Packet): UBM принял от хоста частично заполненный пакет. При этом событии значение счетчика байт меньше 64. Когда DMA детектирует это событие, он передает частично заполненный пакет в UART, устанавливает PPKT на 1, обновляет NAK на 0 в регистре счетчика байт конечной точке output и запускает прерывание MCU.
[7. UART]
...
[8. Расширенный порт ввода/вывода (Expanded GPIO Port)]
8.1. Регистры ввода/вывода и управления
TUSB3410 имеет 4 вывода порта ввода/вывода общего назначения (P3.0, P3.1, P3.3 и P3.4), которые могут управляться firmware, запущенном на MCU. каждая ножка вывода может управляться отдельно, независимо от других ножек, и каждая реализована как push/pull выход CMOS с нагрузочной способностью 12 mA с управлением режима третьего состояния и вход. В MCU выходы организованы с открытым стоком (open drain), при этом выходной низкий уровень может быть установлен продолжительное время, однако выход в состоянии высокого уровня переключается на два цикла и затем выход переходит в состояние высокого сопротивления (третье состояние).
Вывод, работающий в режиме входа, может быть прочитан инструкцией MOV. Например, MOV C,P3.3 читает вход на порте P3.3. Перед чтением предварительно убедитесь, что связанный выход находится в состоянии высокого сопротивления.
Выход может быть установлен в высокий логический уровень (и при этом вывод окажется в состоянии высокого сопротивления) инструкцией SETB. Например, SETB P3.1 переводит P3.1 в состояние лог. 1. Выход может быть установлен низкий логический уровень инструкцией CLR, так что CLR P3.4 переведет порт P3.4 в состояние низкого логического уровня (который останется в таком состоянии длительное время, пока состояние не будет изменено).
Каждый вывод GPIO имеет связанный с ним внутренний верхний нагрузочный резистор (pullup). Очень рекомендуется оставлять этот резистор подключенным, чтобы избежать колебаний уровня, попадающих во входной буфер. Исключение из этого правила - только если на вход всегда подключен внешний выход, управляющий уровнем.
8.1.1. PUR_3: GPIO Pullup Register For Port 3 (адрес FF9Eh) - регистр включения нагрузочных резисторов для порта 3
№ бита |
Имя |
RESET |
Описание бит |
0 1 3 4 |
Pin0 Pin1 Pin3 Pin4 |
0 |
MCU может писать в этот регистр. Если MCU установит любой из этих бит в 1, то соответствующий pullup резистор будет отключен от внешнего вывода. Если MCU запишет в эти биты 0, то соответствующий pullup будет подключен. Резистор pullup подключается к напряжению питания Vcc.
|
2, 5, 6, 7 |
RSV |
0 |
Зарезервировано.
|
[9. Прерывания (Interrupts)]
9.1. Регистры прерывания и статуса 8052
В стандарте 8052 зарезервировано 5 источников прерывания. SIE является стандартным регистром для разрешения прерываний (standard interrupt-enable), который управляет пятью источниками прерываний. Он также известен как IE0, размещенном по адресу S:A8h (в области данных регистров специального назначения). Все дополнительные источники прерывания объединены функцией ИЛИ на прерывание EX0.
Таблица 9-1. Карта размещения векторов (адресов) прерывания 8052
Источник прерывания |
Описание |
Адрес |
Комментарий |
ES |
Прерывание UART |
0023h |
|
ET1 |
Прерывание от Timer-1 |
001Bh |
|
EX1 |
Внешнее прерывание 1 |
0013h |
|
ET0 |
Прерывание от Timer-0 |
000Bh |
|
EX0 |
Внешнее прерывание 0 |
0003h |
К этому прерыванию также привязаны все прерывания от внутренней аппаратуры, нестандартной для архитектуры 8052 (USB, I2C, DMA и т. д.). |
Reset |
Вектор сброса |
0000h |
|
9.1.1. 8052 Standard Interrupt Enable (SIE) Register - стандартный регистр разрешения прерываний
№ бита |
Имя |
RESET |
Описание бит |
0 |
EX0 |
0 |
Разрешает или запрещает внешнее прерывание 0.
EX0=0: внешнее прерывание 0 запрещено. EX0=1: внешнее прерывание 0 разрешено.
|
1 |
ET0 |
0 |
Разрешает или запрещает прерывание от таймера 0.
ET0=0: прерывание timer-0 запрещено. ET0=1: прерывание timer-0 разрешено.
|
2 |
EX1 |
0 |
Разрешает или запрещает внешнее прерывание 1.
EX1=0: внешнее прерывание 1 запрещено. EX1=1: внешнее прерывание 1 разрешено.
|
3 |
ET1 |
0 |
Разрешает или запрещает прерывание от таймера 1.
ET1=0: прерывание timer-1 запрещено. ET1=1: прерывание timer-1 разрешено.
|
4 |
ES |
0 |
Разрешает или запрещает прерывание от последовательного порта.
ES=0: прерывание от последовательного порта запрещено. ES=1: прерывание от последовательного порта разрешено.
|
5, 6 |
RSV |
0 |
Зарезервировано.
|
7 |
EA |
0 |
Разрешить или запретить все прерывания сразу (глобальное управление прерываниями).
EA=0: все прерывания запрещены. EA=1: разрешение работы всех прерываний управляется индивидуальными битами.
|
9.1.2. Дополнительные источники прерываний
Все нестандартные для архитектуры 8052 прерывания (DMA, I2C и т. д.) объединены операцией ИЛИ для генерирования внутреннего прерывания INT0. Кроме того, INT0 должен быть запрограммирован как прерывание, активное по низкому уровню (low-level interrupt, без срабатывания по перепаду). После сброса, если INT0 не изменен, то он работает как прерывание по срезу (edge-triggered interrupt). Предоставлен регистр вектора прерывания для идентификации всех источников прерывания (см. секцию 9.1.3, VECINT: Vector Interrupt Register). Имеется до 64 векторов прерывания. MCU отвечает за чтение вектора и вызов соответствующей подходящей подпрограммы обработчика прерывания.
9.1.3. VECINT: Vector Interrupt Register (адрес FF92h) - регистр вектора прерывания
Этот регистр содержит значение вектора, идентифицирующего внутренний источник прерывания, который захватывается при переходе по адресу 0003h. Запись (любого значения) в этот регистр удаляет вектор и обновляет регистр на новое значение вектора (если в ожидании обработки находится следующее прерывание). Внимание: значение вектора является смещением; таким образом, его значение находится в инкременте до 2 (бит 0 сброшен в 0). Когда нет прерываний, ожидающих обработки, то значение вектора становится равным 00h (см. таблицу 9-2). Как показано, вектор прерывания делится на два поля: I[2:0] и G[3:0]. Поле I задает источник прерывания в пределах группы (на базисе первым-случилось-первым-обработано). В поле G, которое задает номер группы, группа G0 имеет самый низкий приоритет, а группа G15 самый высокий приоритет.
№ бита |
Имя |
RESET |
Описание бит |
0 |
- |
0 |
Всегда 0.
|
3-1 |
I[2:0] |
0 |
Это поле задает источник прерывания в указанной группе. См. таблицу 9?2. Бит 0 всегда равен нулю; таким образом, значение вектора является смещением на 2.
|
7-4 |
G[3:0] |
0 |
Это поле задает группу прерывания. I[2:0] и G[3:0] комбинируют для получения действительного вектора прерывания.
|
Таблица 9-2. Значения вектора прерывания
G[3:0] (hex) |
I[2:0] (hex) |
VECTOR (hex) |
Источник прерывания |
0 |
0 |
00 |
Нет прерывания |
1 1 1 1 1 |
0 1 2 3 4-7 |
10 12 14 16 18-1E |
Не используется Output endpoint-1 Output endpoint-2 Output endpoint-3 Зарезервировано |
2 2 2 2 2 |
0 1 2 3 4-7 |
20 22 24 26 28-2E |
Зарезервировано Input endpoint-1 Input endpoint-2 Input endpoint-3 Зарезервировано |
3 3 3 3 3 3 3 3 |
0 1 2 3 4 5 6 7 |
30 32 34 36 38 3A 3C 3E
|
Принят пакет STPOW Принят пакет SETUP Зарезервировано Зарезервировано Прерывание RESR Прерывание SUSR Прерывание RSTR Wakeup |
4 4 4 4 4 |
0 1 2 3 4-7 |
40 42 44 46 48-4E
|
Прерывание I2C TXE Прерывание I2C RXF Input endpoint-0 Output endpoint-0 Зарезервировано |
5 5 5 |
0 1 2-7 |
50 52 54-5E
|
Прерывание статуса UART Прерывание модема UART Зарезервировано |
6 6 6 |
0 1 2-7 |
60 62 64-6E
|
Прерывание UART RXF Прерывание UART TXE Зарезервировано |
7 |
0-7 |
70-7E
|
Зарезервировано |
8 8 8 |
0 2 3-7 |
80 84 86-8E
|
Прерывание DMA1 Прерывание DMA3 Зарезервировано |
9-15 |
x |
90-FE
|
Не используется |
9.1.4. Логическая схема соединения прерываний (внутренние/внешние)
На рис. 9-1 показаны логические соединения источников прерывания и их взаимосвязь с INT0. Кодер приоритета генерирует 8-битный вектор, соответствующий 64 источникам прерывания (из них используются не все). Приоритеты прерываний при этом заданы фиксировано. Вектор 0x88 имеет самый высокий приоритет, а вектор 0x12 самый низкий приоритет.
Рис. 9-1. Внутренние прерывания
[10. Порт I2C]
...
[11. Последовательность загрузки TUSB3410]
Код загрузки (бутлоадер, bootcode) является просто программой, которая размещена в 10 килобайтах boot ROM на кристалле TUSB3410. Эта программа разработана для загрузки приложения firmware либо из внешней памяти I2C (обычно это микросхема EEPROM), либо с хоста USB под управлением драйвера устройства хоста. После того, как TUSB3410 завершит загрузку, bootcode отдает управление потоком выполнения в загруженное приложение firmware.
В этой секции подробно описано, как bootcode инициализирует устройство TUSB3410. Дополнительно перечислены как справочные данные дескриптор USB по умолчанию, формат заголовка устройства I2C, формат загрузки драйвера хоста USB и поддерживаемые встроенные запросы USB, специфичные для вендора. Пользователи должны тщательно следовать соответствующему формату интерфейса с кодом загрузки. Ошибка в формате может привести к непредсказуемым результатам.
Исходный код бутлоадера также предоставлен в документации по программированию.
11.2. Алгоритм программирования кода загрузки
После сброса при включении питания код загрузки инициализирует регистры интерфейса I2C и USB наряду со значениями внутренних переменных. Затем код загрузки проверяет наличие подключенной по I2C микросхемы памяти EEPROM, и ищет в этой памяти допустимую сигнатуру. Если внешняя память подключена к I2C и в ней записана правильная сигнатура, код загрузки продолжает поиск блоки дескрипторов и обрабатывает их, если контрольная сумма совпадает. Если найдено приложение firmware, то код загрузки загружает его в RAM и передает поток управления в этот загруженный код. Иначе код загрузки подключается к USB и ждет от драйвера хоста загрузки приложения firmware. Как только загрузка firmware завершена, код загрузки также передает поток выполнения в загруженное firmware.
Далее описан пошаговый процесс работы кода загрузки.
• Проверка, находится ли код загрузки в режиме приложения. Это режим, в который происходит вход после загрузки кода приложения через микросхему I2C или через USB. Если код загрузки находится в режиме приложения, то код загрузки передает управление приложению firmware. Иначе код загрузки продолжает выполняться.
• Инициализация всех установок по умолчанию. - Вызов подпрограммы CopyDefaultSettings(). Установка скорости I2C на 400 кГц. - Вызов подпрограммы UsbDataInitialization(). Установка bFUNADR = 0, отключение от USB (bUSBCTL = 0x00), обработка события USB reset, копирование в RAM предопределенных дескрипторов устройства, конфигурации, строк. Запрет всех конечных точек и разрешение прерываний USB (SETUP, RSTR, SUSR и RESR).
• Чтение сигнатуры продукта. - Проверка - имеется ли допустимая сигнатура в устройстве памяти, подключенном через I2C. Если нет, то пропуск процесса загрузки с I2C. Чтение 2 байт по адресу 0x0000 с типом III и адресом устройства 0. Остановка поиска, если найдена допустимая сигнатура. Чтение 2 байт по адресу 0x0000 с типом II и адресом устройства 4. Остановка поиска, если найдена допустимая сигнатура.
• Если найдена допустимая сигнатура, то из I2C EEPROM загружаются кастомизированные дескрипторы устройства, конфигурации и строк. - Выполняется обработка каждого блока дескриптора из I2C, пока не будет найден конец заголовка. Если блок дескриптора содержит дескрипторы устройства, конфигурации или строки, то код загрузки перезаписывает ими дескрипторы по умолчанию. Если блок дескриптора содержит бинарный код firmware, то код загрузки устанавливает указатель заголовка на начала бинарного кода firmware в I2C EEPROM. Если блок дескриптора в конце заголовка, то код загрузки останавливает поиск.
• Разрешение глобальных прерываний и прерываний USB, и установка бита соединения в 1. - Глобальные прерывания разрешаются установкой бита 7 (EA) в регистре SIE (см. секцию 9.1.1) на 1. - Разрешение всех внутренних прерываний периферии путем установки бита EX0 в регистре SIE на 1. - Подключение к USB установкой бита 7 (CONT) в регистре USBCNTL (см. секцию 5.4) на 1.
• Ожидание любых событий прерывания, пока не поступит пакет настройки (setup packet) Get DEVICE DESCRIPTOR. - Прерывание приостановки (Suspend interrupt). устанавливается бит ожидания (idle) в регистре PCON MCU, и происходит вход в режим приостановки. Событие USB reset выводит микроконтроллер из режима сна. - Прерывание возобновления (Resume interrupt). Код загрузки пробуждается и ожидает новых запросов USB. - Прерывание сброса (Reset interrupt). Вызов подпрограммы UsbReset(). - Прерывание настройки (Setup interrupt). Код загрузки обрабатывает этот запрос. - Запрос перезагрузки USB (USB reboot request). Происходит отключение от USB очисткой бита 7 (CONT) в регистре USBCTL и рестарт по адресу 0x0000.
• Загрузка firmware из I2C EEPROM - Запрет глобальных прерываний очисткой бита 7 (EA) в регистре SIE. - Загрузка firmware в пространство XDATA, если код доступен в I2C EEPROM.
• Загрузка firmware из USB. - Если не найдено firmware в I2C EEPROM, то хост USB загружает firmware через конечную точку output 1. - В первом пакете данных, поступившим в output endpoint 1 драйвер USB хоста добавляет 3 байта перед firmware приложения в двоичном формате. Эти три байта содержат LSB и MSB, показывающие размер, за которыми идет арифметическая контрольная сумма двоичного кода firmware.
• Передача управления в код приложения firmware. - Обновление конфигурации USB и номера интерфейса. - Передача управления потоком выполнения кода в приложение firmware.
• Приложение firmware - Либо отключает устройство от USB, либо продолжает отвечать на запросы USB.
11.3. Установки по умолчанию для кода загрузки
Код загрузки имеет свои собственные предварительно заданные дескрипторы устройства, конфигурации и строк. Эти дескрипторы по умолчанию должны использоваться только для экспериментов. Они не должны использоваться в конечных продуктах.
11.3.1. Дескриптор устройства (Device Descriptor)
Дескриптор устройства предоставляет версию USB, которую поддерживает устройство, класс устройства (device class), протокол, идентификатор вендора (VID), идентификатор продукта (PID), строки описания и количество возможных конфигураций. Операционная система (Windows, MAC или Linux) читает этот дескриптор для того, чтобы принять решение о выборе драйвера для устройства, который должен использоваться для обмена с устройством.
Код загрузки использует 0x0451 (Texas Instruments) в качестве ID вендора (VID) и 0x3410 (TUSB3410) в качестве ID продукта (PID). Он также поддерживает три разных строки и одну конфигурацию. В таблице 11-1 показан дескриптор устройства.
Таблица 11-1. Дескриптор устройства
Смещение (десятичный формат) |
Поле |
Размер |
Значение |
Описание |
0 |
bLength |
1 |
0x12 |
Размер этого дескриптора в байтах |
1 |
bDescriptorType |
1 |
1 |
Тип - дескриптор устройства |
2 |
bcdUSB |
2 |
0x0110 |
USB стандарт 1.1 |
4 |
bDeviceClass |
1 |
0xFF |
Класс устройства специфичен для вендора |
5 |
bDeviceSubClass |
1 |
0 |
Нет подклассов. |
6 |
bDeviceProtocol |
1 |
0 |
Протоколы не используются. |
7 |
bMaxPacketSize0 |
1 |
8 |
Максимальный размер пакета для контрольной точки 0. |
8 |
idVendor |
2 |
0x0451 |
Значение идентификатора вендора USB (это значение назначено компании Texas Instruments, TI). |
10 |
idProduct |
2 |
0x3410 |
Номер устройства TI соответствует TUSB3410 |
12 |
bcdDevice |
2 |
0x0100 |
Номер релиза устройства 1.0 |
14 |
iManufacturer |
1 |
1 |
Индекс строкового дескриптора, описывающего производителя устройства. |
15 |
iProduct |
1 |
2 |
Индекс строкового дескриптора, описывающего продукт. |
16 |
iSerialNumber |
1 |
3 |
Индекс строкового дескриптора, описывающего серийный номер устройства. |
17 |
bNumConfigurations |
1 |
1 |
Количество возможных конфигураций устройства: 1. |
11.3.2. Дескриптор конфигурации (Configuration Descriptor)
Дескриптор конфигурации предоставляет количество интерфейсов, которое поддерживает конфигурация устройства, конфигурация системы питания, и текущее энергопотребление.
Код загрузки декларирует только один интерфейс, работающий в режиме питания от шины USB (bus-powered). Энергопотребление во время загрузки задано до 100 mA. В таблице 11-2 показан дескриптор устройства.
Таблица 11-2. Дескриптор конфигурации
Смещение (десятичный формат) |
Поле |
Размер |
Значение |
Описание |
0 |
bLength |
1 |
9 |
Размер этого дескриптора в байтах |
1 |
bDescriptorType |
1 |
2 |
Тип - дескриптор конфигурации |
2 |
wTotalLength |
2 |
9+9+7=25 |
Общая длина данных, возвращаемых для этой конфигурации. Включает комбинированную длину всех дескрипторов (конфигурации, интерфейса, конечной точки, класса и специфичных для вендора), возвращаемых для этой конфигурации. |
4 |
bNumInterfaces |
1 |
1 |
Количество интерфейсов, поддерживаемых этой конфигурацией. |
5 |
bConfigurationValue |
1 |
1 |
Значение, используемое как аргумент для запроса SetConfiguration(), чтобы была выбрана эта конфигурация. |
6 |
iConfiguration |
1 |
0 |
Индекс строкового дескриптора, описывающего эту конфигурацию. |
7 |
bmAttributes |
1 |
0x80 |
Характеристики конфигурации:
D7: зарезервировано (установлено в 1) D6: имеет собственное питание D5: поддерживается удаленное пробуждение (remote wakeup) D4-0: зарезервировано (сброшено в 0).
|
8 |
bMaxPower |
1 |
0x32 |
Это устройство потребляет ток 100 mA. |
11.3.3. Дескриптор интерфейса (Interface Descriptor)
Дескриптор интерфейса предоставляет количество поддерживаемых на этом интерфейсе конечных точек, а также класс интерфейса, подкласс и протокол. код загрузки поддерживает только одну конечную точку и использует свой собственный класс. В таблице 11-3 показан дескриптор интерфейса.
Таблица 11-3. Дескриптор интерфейса
Смещение (десятичный формат) |
Поле |
Размер |
Значение |
Описание |
0 |
bLength |
1 |
9 |
Размер этого дескриптора в байтах |
1 |
bDescriptorType |
1 |
4 |
Тип - дескриптор интерфейса |
2 |
bInterfaceNumber |
1 |
0 |
Номер интерфейса. Значение, основанное на нуле, показывает значение индекса в массиве конкурирующих интерфейсов. |
3 |
bAlternateSetting |
1 |
0 |
Значение, используемое для выбора альтернативной установки для интерфейса, указанного в предыдущем поле. |
4 |
bNumEndpoints |
1 |
1 |
Количество конечных точек, используемое этим интерфейсом (не считая конечную точку 0). Если здесь указано значение 0, то интерфейс использует только управляющий канал по умолчанию (default control pipe). |
5 |
bInterfaceClass |
1 |
0xFF |
Класс интерфейса специфичен для вендора. |
6 |
bInterfaceSubClass |
1 |
0 |
|
7 |
bInterfaceProtocol |
1 |
0 |
|
8 |
iInterface |
1 |
0 |
Индекс строкового дескриптора, описывающего этот интерфейс. |
11.3.4. Дескриптор конечной точки (Endpoint Descriptor)
Дескриптор конечной точки предоставляет тип и размер канала обмена (communication pipe), поддерживаемый этой конечной точкой. код загрузки поддерживает только одну конечную точку output размеров в 64 байта в дополнение к управляющей конечной точке control endpoint 0 (управляющая конечная точка обязательно должна присутствовать для всех устройств USB). В таблице 11-4 показан дескриптор конечной точки.
Таблица 11-3. Дескриптор конечной точки
Смещение (десятичный формат) |
Поле |
Размер |
Значение |
Описание |
0 |
bLength |
1 |
7 |
Размер этого дескриптора в байтах |
1 |
bDescriptorType |
1 |
5 |
Тип - дескриптор конечной точки |
2 |
bEndpointAddress |
1 |
0x01 |
Биты 3..0: номер конечной точки. Бит 7: направление (0 OUT, 1 IN). |
3 |
bmAttributes |
1 |
2 |
Биты 1..0: тип трансфера (10 Bulk, 11 Interrupt) |
4 |
bMaxPacketSize |
2 |
64 |
Максимальный размер пакета этой конечной точки, доступный для передачи или приема, когда выбрана эта конфигурация. |
6 |
bInterval |
1 |
0 |
Интервал опроса конечной точки для трансферов данных, указанный в миллисекундах. |
11.3.5. Строковый дескриптор (String Descriptor)
Строковый дескриптор содержит текстовые данные в формате unicode. Он используется для того, чтобы показать имя производителя, модель продукта и серийный номер в формате, удобном для прочтения человеком. Код загрузки поддерживает 3 строки. Первая строка содержит имя производителя. Вторая строка содержит имя продукта. Третья строка содержит серийный номер. В таблице 11-5 показаны строковые дескрипторы.
Таблица 11-5. Строковый дескриптор
Смещение (десятичный формат) |
Поле |
Размер |
Значение |
Описание |
0 |
bLength |
1 |
4 |
Размер строки 0 дескриптора в байтах |
1 |
bDescriptorType |
1 |
0x03 |
Тип - дескриптор строки |
2 |
wLANGID[0] |
2 |
0x0409 |
Идентификатор языка - английский. |
4 |
bLength |
1 |
36 (десятичное) |
Размер строки 1 дескриптора в байтах. |
5 |
bDescriptorType |
1 |
0x03 |
Тип - дескриптор строки |
6 |
bString |
2 |
'T', 0x00 |
Первый символ строки в формате Unicode (строка "Texas Instruments"). |
8 |
|
2 |
'e', 0x00 |
|
10 |
|
2 |
'x', 0x00 |
|
12 |
|
2 |
'a', 0x00 |
|
14 |
|
2 |
's', 0x00 |
|
16 |
|
2 |
' ', 0x00 |
|
18 |
|
2 |
'I', 0x00 |
|
20 |
|
2 |
'n', 0x00 |
|
22 |
|
2 |
's', 0x00 |
|
24 |
|
2 |
't', 0x00 |
|
26 |
|
2 |
'r', 0x00 |
|
28 |
|
2 |
'u', 0x00 |
|
30 |
|
2 |
'm', 0x00 |
|
32 |
|
2 |
'e', 0x00 |
|
34 |
|
2 |
'n', 0x00 |
|
36 |
|
2 |
't', 0x00 |
|
38 |
|
2 |
's', 0x00 |
|
40 |
bLength |
1 |
42 (десятичное) |
Размер строки 2 дескриптора в байтах. |
41 |
bDescriptorType |
1 |
0x03 |
Тип - дескриптор строки |
42 |
bString |
2 |
'T', 0x00 |
Первый символ строки в формате Unicode (строка "TUSB3410 boot device"). |
44 |
|
2 |
'U', 0x00 |
|
46 |
|
2 |
'S', 0x00 |
|
48 |
|
2 |
'B', 0x00 |
|
50 |
|
2 |
'3', 0x00 |
|
52 |
|
2 |
'4', 0x00 |
|
54 |
|
2 |
'1', 0x00 |
|
56 |
|
2 |
'0', 0x00 |
|
58 |
|
2 |
' ', 0x00 |
|
60 |
|
2 |
'B', 0x00 |
|
62 |
|
2 |
'o', 0x00 |
|
64 |
|
2 |
'o', 0x00 |
|
66 |
|
2 |
't', 0x00 |
|
68 |
|
2 |
' ', 0x00 |
|
70 |
|
2 |
'D', 0x00 |
|
72 |
|
2 |
'e', 0x00 |
|
74 |
|
2 |
'v', 0x00 |
|
76 |
|
2 |
'i', 0x00 |
|
78 |
|
2 |
'c', 0x00 |
|
80 |
|
2 |
'e', 0x00 |
|
82 |
bLength |
1 |
34 (десятичное) |
Размер строки 3 дескриптора в байтах. |
83 |
bDescriptorType |
1 |
0x03 |
Тип - дескриптор строки |
84 |
bString |
2 |
r0, 0x00 |
Строка Unicode, где r0..rF - закодированный в формате BCD серийный номер устройства, содержащийся в регистрах SERNUM0..SERNUM7 (16 символов в HEX формате). |
86 |
|
2 |
r1, 0x00 |
|
88 |
|
2 |
r2, 0x00 |
|
90 |
|
2 |
r3, 0x00 |
|
92 |
|
2 |
r4, 0x00 |
|
94 |
|
2 |
r5, 0x00 |
|
96 |
|
2 |
r6, 0x00 |
|
98 |
|
2 |
r7, 0x00 |
|
100 |
|
2 |
r8, 0x00 |
|
102 |
|
2 |
r9, 0x00 |
|
104 |
|
2 |
rA, 0x00 |
|
106 |
|
2 |
rB, 0x00 |
|
108 |
|
2 |
rC, 0x00 |
|
110 |
|
2 |
rD, 0x00 |
|
112 |
|
2 |
rE, 0x00 |
|
114 |
|
2 |
rF, 0x00 |
|
11.4. Формат заголовка внешнего устройства I2C
Правильный заголовок должен содержать сигнатуру продукта и один или большее количество блоков дескриптора. Блок дескриптора содержит префикс дескриптора и его содержимое. В префиксе дескриптора представлены тип данных, размер и контрольная сумма, описывающие содержимое блока дескриптора. Содержимое дескриптора несет необходимую информацию для процесса загрузки.
Подпрограмма обработки заголовка всегда считает от первого блока дескриптора, пока не будет достигнут требуемый номер блока. Заголовок читается в префиксе дескриптора с размером 4 байта. Этот префикс содержит тип блока, размер и контрольную сумму. Например, если код загрузки хочет найти позицию третьего блока дескриптора, то он читает первый префикс дескриптора, вычисляет позицию следующего дескриптора основываясь на размере блока, считанного из префикса. Затем код загрузки делает те же самые вычисления для того, чтобы найти позицию третьего блока дескриптора.
11.4.1. Сигнатура продукта (Product Signature)
Сигнатура продукта должна быть сохранена в первые 2 байта микросхемы памяти I2C. Эти 2 байта должны соответствовать номеру продукта. Порядок этих байт должен быть таким, что сначала идет LSB, и за ним идет MSB. Например, для TUSB3410 эта сигнатура 0x3410. Таким образом, первый байт должен быть 0x10, и второй байт должен быть 0x34.
Код загрузки TUSB3410 ищет первые 2 байта в устройстве памяти I2C. Если первые 2 байта не равны 0x10 и 0x34, то код загрузки прекращает обработку заголовка.
11.4.2. Блок дескриптора (Descriptor Block)
Каждый блок дескриптора содержит префикс и содержимое. Размер префикса всегда 4 байта. Он содержит тип данных, размер и контрольную сумму, по которой проверяется целостность данных. Содержимое дескриптора включает в себя информацию, указанную в префиксе. Размер может быть от 1 до 65535 байт. Следующий дескриптор находится сразу за предыдущим дескриптором. Если больше нет дескрипторов, то дополнительный нулевой байт должен показывать конец заголовка.
11.4.2.1. Префикс дескриптора (Descriptor Prefix)
Первый байт префикса дескриптора показывает тип данных. Он говорит коду загрузки, как обработать данные содержимого дескриптора. Второй и третий байты дают размер содержимого дескриптора. Второй байт LSB, третий байт MSB. Последний байт несет 8-битную арифметическую контрольную сумму содержимого дескриптора.
11.4.2.2. Содержимое дескриптора (Descriptor Content)
В содержимом дескриптора может храниться информация USB, firmware или другие типы данных. Размер содержимого дескриптора должен быть от 1 до 65535 байт.
11.5. Контрольная сумма в блоке дескриптора
Каждый префикс дескриптора содержит одну контрольную сумму, вычисленную от содержимого дескриптора. Если контрольная сумма не совпала, код загрузки просто игнорирует блок дескриптора.
11.6. Примеры заголовка
Заголовок может быть указан различными способами. Следующие дескрипторы показывают примеры формата заголовка и поддерживаемых блоков дескриптора.
11.6.1. Блок дескриптора, поддерживаемый кодом загрузки TUSB3410
Код загрузки TUSB3410 поддерживает следующие блоки дескриптора.
• Дескриптор устройства USB (USB Device Descriptor) • Дескриптор конфигурации USB (USB Configuration Descriptor) • Строковый дескриптор USB (USB String Descriptor) • Двоичный код Firmware1 • Автоматически выполняемый двоичный код (Autoexec Binary) Firmware2
Примечания:
1. Двоичный код firmware загружается, когда код загрузки принимает от хоста первый полученный запрос дескриптора устройства (device descriptor request). Загрузка firmware либо должна продолжаться на стадии данных, либо должно произойти отключение от USB и переподключение к USB в качестве нового устройства. 2. Код загрузки загружает этот код autoexec binary firmware перед тем, как подключиться к USB. Код firmware должен подключиться к USB как только будет загружен.
11.6.2. Заголовок дескриптора USB (USB Descriptor Header)
В таблице 11-6 показаны дескрипторы устройства, конфигурации, строк для кода загрузки. Последний нулевой байт показывает конец заголовка.
Таблица 11-6. Заголовок дескрипторов USB
Смещение (десятичный формат) |
Поле |
Размер |
Значение |
Описание |
0 |
Signature0 |
1 |
0x10 |
FUNCTION_PID_L |
1 |
Signature1 |
1 |
0x34 |
FUNCTION_PID_H |
2 |
Тип данных |
1 |
0x03 |
Дескриптор устройства USB. |
3 |
Размер данных (младший байт) |
1 |
0x12 |
Дескриптор устройства занимает 18 байт (десятичное значение). |
4 |
Размер данных (старший байт) |
1 |
0x00 |
|
5 |
Контрольная сумма |
1 |
0xCC |
Контрольная сумма данных, которые идут далее. |
6 |
bLength |
1 |
0x12 |
Размер дескриптора устройства в байтах. |
7 |
bDescriptorType |
1 |
0x01 |
Тип дескриптора - дескриптор устройства. |
8 |
bcdUSB |
2 |
0x0110 |
Версия стандарта USB: 1.1 |
10 |
bDeviceClass |
1 |
0xFF |
Класс устройства специфичен для вендора. |
11 |
bDeviceSubClass |
1 |
0x00 |
Нет подклассов. |
12 |
bDeviceProtocol |
1 |
0x00 |
Протоколы не используются |
13 |
bMaxPacketSize0 |
1 |
0x08 |
Максимальный размер пакета для конечной точки 0 |
14 |
idVendor |
2 |
0x0451 |
Идентификатор вендора USB, назначенный компании Texas Instruments (VID). |
16 |
idProduct |
2 |
0x3410 |
Идентификатор продукта USB для чипа TUSB3410 (PID). |
18 |
bcdDevice |
2 |
0x0100 |
Номер релиза устройства, равен 1.0 |
20 |
iManufacturer |
1 |
0x01 |
Индекс строкового дескриптора, описывающего производителя. |
21 |
iProducct |
1 |
0x02 |
Индекс строкового дескриптора, описывающего продукт. |
22 |
iSerialNumber |
1 |
0x03 |
Индекс строкового дескриптора, описывающего серийный номер устройства. |
23 |
bNumConfigurations |
1 |
0x01 |
Количество возможных конфигураций: 1 |
24 |
Тип данных |
1 |
0x04 |
Дескриптор конфигурации USB |
25 |
Размер данных (младший байт) |
1 |
0x19 |
25 байт |
26 |
Размер данных (старший байт) |
1 |
0x00 |
|
27 |
Контрольная сумма |
1 |
0xC6 |
Контрольная сумма данных, которые идут далее. |
28 |
bLength |
1 |
0x09 |
Размер этого дескриптора в байтах. |
29 |
bDescriptorType |
1 |
0x02 |
Тип дескриптора - дескриптор конфигурации. |
30 |
wTotalLength |
2 |
9+9+7 = 25 (0x19) |
Общая длина данных, возвращаемых для этой конфигурации, включает в себя длину всех дескрипторов (конфигурации, интерфейса, конечной точки, класса, относящихся к вендору), возвращаемых для этой конфигурации. |
32 |
bNumInterfaces |
1 |
0x01 |
Количество интерфейсов, поддерживаемых этой конфигурацией. |
33 |
bConfigurationValue |
1 |
0x01 |
Значение, используемое как аргумент запроса SetConfiguration() для выбора этой конфигурации. |
34 |
iConfiguration |
1 |
0x00 |
Индекс строкового дескриптора, описывающего эту конфигурацию. |
35 |
bmAttributes |
1 |
0xE0 |
Характеристики конфигурации.
D7: зарезервировано (установлено в 1) D6: устройство имеет собственное питание D5: поддерживается удаленное пробуждение (remote wakeup) D4..D0: зарезервировано (сброшено в 0)
|
36 |
bMaxPower |
1 |
0x64 |
Устройство потребляет 100 mA.
|
37 |
bLength |
1 |
0x09 |
Размер этого дескриптора в байтах.
|
38 |
bDescriptorType |
1 |
0x04 |
Тип дескриптора - дескриптор интерфейса.
|
39 |
bInterfaceNumber |
1 |
0x00 |
Номер интерфейса. Значение, основанное на нуле, показывает значение индекса в массиве конкурирующих интерфейсов.
|
40 |
bAlternateSetting |
1 |
0x00 |
Значение, используемое для выбора альтернативной установки для интерфейса, указанного в предыдущем поле.
|
41 |
bNumEndpoints |
1 |
0x01 |
Количество конечных точек, используемое этим интерфейсом (не считая конечную точку 0). Если здесь указано значение 0, то интерфейс использует только управляющий канал по умолчанию (default control pipe).
|
42 |
bInterfaceClass |
1 |
0xFF |
Класс интерфейса специфичен для вендора.
|
43 |
bInterfaceSubClass |
1 |
0x00 |
Нет подклассов интерфейса.
|
44 |
bInterfaceProtocol |
1 |
0x00 |
Нет протоколов для интерфейса.
|
45 |
iInterface |
1 |
0x00 |
Индекс строкового дескриптора, описывающего этот интерфейс.
|
46 |
bLength |
1 |
0x07 |
Размер дескриптора в байтах.
|
47 |
bDescriptorType |
1 |
0x05 |
Тип дескриптора - дескриптор конечной точки.
|
48 |
bEndpointAddress |
1 |
0x01 |
Биты 3..0: номер конечной точки. Бит 7: направление (0 OUT, 1 IN).
|
49 |
bmAttributes |
1 |
0x02 |
Биты 1..0: тип трансфера (10 Bulk, 11 Interrupt)
|
50 |
wMaxPacketSize |
2 |
0x0040 |
Максимальный размер пакета этой конечной точки, доступный для приема или передачи, который можно использовать при выборе этой конфигурации (64 байта).
|
52 |
bInterval |
1 |
0x00 |
Интервал опроса конечной точки для трансферов данных, указанный в миллисекундах.
|
53 |
Тип данных. |
1 |
0x05 |
Строковый дескриптор USB
|
54 |
Размер данных (младший байт) |
1 |
0x1A |
4+6+6+10 = 26 (0x1A)
|
55 |
Размер данных (старший байт) |
1 |
0x00 |
|
56 |
Контрольная сумма |
1 |
0x50 |
Контрольная сумма данных, которые идут далее. |
57 |
bLength |
1 |
0x04 |
Размер строки 0 дескриптора в байтах. |
58 |
bDescriptorType |
1 |
0x03 |
Тип дескриптора - строковый дескриптор. |
59 |
wLANGID[0] |
2 |
0x0409 |
Идентификатор языка - английский язык. |
61 |
bLength |
1 |
0x06 |
Размер строки 1 дескриптора в байтах. |
62 |
bDescriptorType |
1 |
0x03 |
Тип дескриптора - строковый дескриптор. |
63 |
bString |
2 |
'T', 0x00 |
Строка в формате Unicode ("TI") |
65 |
|
2 |
'I', 0x00 |
|
67 |
bLength |
1 |
0x06 |
Размер строки 2 дескриптора в байтах. |
68 |
bDescriptorType |
1 |
0x03 |
Тип дескриптора - строковый дескриптор. |
69 |
bString |
2 |
'u', 0x00 |
Строка в формате Unicode ("uC") |
71 |
|
2 |
'C', 0x00 |
|
73 |
bLength |
1 |
0x0A |
Размер строки 3 дескриптора в байтах. |
74 |
bDescriptorType |
1 |
0x03 |
Тип дескриптора - строковый дескриптор. |
75 |
bString |
2 |
'3', 0x00 |
Строка в формате Unicode ("3410") |
77 |
|
2 |
'4', 0x00 |
|
79 |
|
2 |
'1', 0x00 |
|
81 |
|
2 |
'0', 0x00 |
|
83 |
Тип данных |
1 |
0x00 |
Конец заголовка. |
11.6.3. Autoexec Binary Firmware
Если для каких-то целей приложение требует загрузить firmware до установки соединения USB, то может использоваться следующий заголовок. Код загрузки загружает firmware и передает управление в firmware напрямую, без подключения по USB. Однако по требованиям стандарта USB любое устройство USB должно подключиться к шине и ответить хосту в течение первых 100 мс. Таким образом, если время загрузки превышает 100 мс, блоки дескриптора USB заголовка скорости должны быть добавлены перед автозапуском двоичного кода приложения (autoexec binary firmware). В таблице 11-7 показан пример заголовка autoexec binary firmware.
Таблица 11-7. Autoexec Binary Firmware
Смещение |
Тип |
Размер |
Значение |
Описание |
0x0000 |
Signature0 |
1 |
0x10 |
FUNCTION_PID_L |
0x0001 |
Signature1 |
1 |
0x34 |
FUNCTION_PID_H |
0x0002 |
Тип данных |
1 |
0x07 |
Autoexec Binary Firmware |
0x0003 |
Размер данных (младший байт) |
1 |
0x67 |
Код приложения, к примеру, занимает 0x4567 байт. |
0x0004 |
Размер данных (старший байт) |
1 |
0x45 |
|
0x0005 |
Контрольная сумма |
1 |
0xNN |
Контрольная сумма данных кода firmware, которые идут далее. |
0x0006 |
Program |
0x4567 |
|
Двоичный код приложения firmware. |
0x456D |
Тип данных |
1 |
0x00 |
Конец заголовка. |
11.7. Формат заголовка загрузки драйвера хоста USB
Если firmware загружается через USB, то нужен драйвер хоста, который следует формату таблицы 11-8. Драйвер бутлоадера Texas Instruments генерирует подходящий формат. Таким образом, пользователи должны только предоставить двоичный образ приложения firmware для бутлоадера. Если контрольная сумма не совпала, то код загрузки отключается от USB и ждет перед переподключением к USB.
Таблица 11-8. Формат загрузки драйвера хоста
Смещение |
Тип |
Размер |
Значение |
Описание |
0x0000 |
Размер firmware (младший байт) |
1 |
0xXX |
Размер кода приложения firmware в байтах. |
0x0001 |
Размер firmware (старший байт) |
1 |
0xYY |
|
0x0002 |
Контрольная сумма |
1 |
0xZZ |
Контрольная сумма данных кода firmware, которые идут далее. |
0x0003 |
Program |
0xYYXX |
|
Двоичный код приложения firmware. |
11.8. Встроенные запросы USB, специфичные для вендора (Vendor Specific USB Requests)
Код загрузки поддерживает несколько запросов USB, специфичных для вендора. Эти запросы предназначены главным образом только для внутреннего тестирования. В нормальной работе эти функции не должны использоваться.
11.8.1. Перезагрузка (Reboot)
Команда перезагрузки принудительно запускает код загрузчика (bootcode).
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_OUT |
01000000b |
bRequest |
BTC_REBOOT |
0x85 |
wValue |
нет |
0x0000 |
wIndex |
нет |
0x0000 |
wLength |
нет |
0x0000 |
Data |
нет |
|
11.8.2. Запустить на выполнение firmware (Force Execute Firmware)
Эта команда запускает загруженный код, даже если он не был успешно загружен.
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_OUT |
01000000b |
bRequest |
BTC_FORCE_EXECUTE_FIRMWARE |
0x8F |
wValue |
нет |
0x0000 |
wIndex |
нет |
0x0000 |
wLength |
нет |
0x0000 |
Data |
нет |
|
11.8.3. Чтение внешней памяти (External Memory Read)
Код загрузки читает и возвращает содержимое внешней памяти по указанному адресу. Наверное имеется в виду память XDATA.
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_IN |
11000000b |
bRequest |
BTC_EXETERNAL_MEMORY_READ |
0x90 |
wValue |
нет |
0x0000 |
wIndex |
Адрес данных |
0xNNNN (где NNNN равно числу от 0x0000 до 0xFFFF) |
wLength |
1 байт |
0x0001 |
Data |
Байт по указанному адресу |
0xMM |
11.8.4. Запись внешней памяти (External Memory Write)
Эта команда инструктирует код загрузки записать данные во внешнюю память по указанному адресу. Наверное имеется в виду память XDATA.
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_OUT |
01000000b |
bRequest |
BTC_EXETERNAL_MEMORY_WRITE |
0x91 |
wValue |
Старший байт: 0x00 Младший байт: байт данных для записи |
0x00MM |
wIndex |
Адрес данных |
0xNNNN (где NNNN равно числу от 0x0000 до 0xFFFF) |
wLength |
нет |
0x0000 |
Data |
нет |
|
11.8.5. Чтение памяти I2C (I2C Memory Read)
Код загрузки возвращает содержимое I2C EEPROM по указанному адресу.
В поле wValue в старшем байте указывается номер устройства на шине I2C от 0x00 to 0x07 (аппаратно этот адрес обычно задается с помощью ножек A2..A0 микросхемы памяти). Тип памяти 0x01 .. 0x03 задается для устройств CAT I .. CAT III. Если бит 7 в bValueL установлен, то скорость шины I2C устанавливается 400 кГц. Этот запрос также используется для установки номера устройства и скорости перед запросом записи I2C (см. команду I2C Memory Write).
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_IN |
11000000b |
bRequest |
BTC_I2C_MEMORY_READ |
0x92 |
wValue |
Старший байт: номер устройства на шине I2C Младший байт: тип памяти [1:0], бит скорости [7] |
0xXXYY |
wIndex |
Адрес данных |
0xNNNN (где NNNN равно числу от 0x0000 до 0xFFFF) |
wLength |
1 байт |
0x0001 |
Data |
Байт по указанному адресу |
0xMM |
11.8.6. Запись памяти I2C (I2C Memory Write)
Эта команда говорит коду загрузки записать данные по указанному адресу.
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_OUT |
01000000b |
bRequest |
BTC_I2C_MEMORY_WRITE |
0x93 |
wValue |
Старший байт: должен быть 0x00 Младший байт: байт данных для записи |
0x00MM |
wIndex |
Адрес данных |
0xNNNN (где NNNN равно числу от 0x0000 до 0xFFFF) |
wLength |
нет |
0x0000 |
Data |
нет |
|
11.8.7. Чтение содержимого внутренней памяти ROM (Internal ROM Memory Read)
Код загрузки (загрузчик, bootcode) возвращает байт по указанному адресу в области boot ROM. Это двоичный код самого загрузчика, так что он читает и возвращает сам себя.
bmRequestType |
USB_REQ_TYPE_DEVICE | USB_REQ_TYPE_VENDOR | USB_REQ_TYPE_IN |
11000000b |
bRequest |
BTC_INTERNAL_ROM_MEMORY_READ |
0x94 |
wValue |
нет |
0x0000 |
wIndex |
Адрес данных |
0xNNNN (где NNNN равно числу от 0x0000 до 0xFFFF) |
wLength |
1 байт |
0x0001 |
Data |
байт по указанному адресу |
0xMM |
11.9. По каким соображениям разрабатывался код загрузки
11.9.1. Запросы USB
Для каждого запроса USB (USB request), код загрузки выполняет шаги, описанные ниже, чтобы удостовериться, что аппаратура функционирует нормально (упрощенный алгоритм обработчика прерывания на запрос USB).
1. Определяется направление запроса путем проверки MSB поля bmRequestType и соответственно установки бита DIR в регистре USBCTL. 2. Декодируется команда. 3. Если ожидается другая настройка, то возврат. Иначе запрос обрабатывается. 4. Еще проверка - если имеется другая настройка, то переход на шаг 2. 5. Очистка источника прерывания и затем регистра VECINT. 6. Выход из обработчика прерывания.
11.9.1.1. Передачи в ответ на запрос USB (USB Request Transfers)
Запрос USB состоит из 3 типов передач (transfers). Это трансферы control-read-with-data-stage (управляющий запрос чтения со стадией данных), control-write-without-data-stage (управляющий запрос записи без чтения данных) и control-write-with-data-stage (управляющий запрос записи со стадией данных). В каждом трансфере стрелочки показывают прерывания, генерируемые после приема пакета настройки (setup packet), с токенами IN или OUT.
На рисунках 11-1 и 11-2 показан поток данных USB, и как аппаратура (hardware) и программное обеспечение MCU (firmware) отвечают на запросы USB. В таблицах 11-9 и 11-10 показаны ответы кода загрузки на стандартные запросы.
Рис. 11-1. Control Read Transfer (трансфер управляющего чтения)
Таблица 11-9. Ответ кода загрузки на Control Read Transfer
CONTROL READ |
Действие в коде загрузки (BOOTCODE) |
Получение состояния устройства (get status of device). |
Возврат установок питания и удаленного пробуждения (remote wakeup). |
Получение состояния интерфейса (get status of interface). |
Возврат 2 нулевых байт. |
Получение состояния конечной точки (get status of endpoint). |
Возврат состояния конечной точки. |
Получение дескриптора устройства (get descriptor of device). |
Возвращение дескриптора устройства. |
Получение дескриптора конфигурации (get descriptor of configuration). |
Возврат дескриптора конфигурации. |
Получение строкового дескриптора (get descriptor of string). |
Возврат строкового дескриптора. |
Получение дескриптора интерфейса (get descriptor of interface). |
Переход в состояние stall. |
Получение дескриптора конечной точки (get descriptor of endpoint). |
Переход в состояние stall. |
Получение конфигурации (get configuration). |
Возвращение значения bConfiguredNumber. |
Получение интерфейса (get interface). |
Возвращение значения bInterfaceNumber. |
Рис. 11-2. Control Write Transfer Without Data Stage (трансфер управляющей записи без стадии данных)
Таблица 11-10. Ответ кода загрузки на Control Write Without Data Stage
CONTROL WRITE WITHOUT DATA STAGE |
Действие в коде загрузки (BOOTCODE) |
Очистка фичи устройства (clear feature of device). |
Переход в состояние stall. |
Очистка фичи интерфейса (clear feature of interface). |
Переход в состояние stall. |
Очистка фичи конечной точки (clear feature of endpoint). |
Очистка endpoint stall. |
Установка фичи устройства (set feature of device). |
Переход в состояние stall. |
Установка фичи интерфейса (set feature of interface). |
Переход в состояние stall. |
Установка фичи конечной точки (set feature of endpoint). |
Перевод конечной точки в состояние stall. |
Установка адреса (set address). |
Установка адреса устройства. |
Установка дескриптора (set descriptor). |
Переход в состояние stall. |
Установка конфигурации (set configuration). |
Установка bConfiguredNumber. |
Установка интерфейса (set interface). |
Установка bInterfaceNumber. |
Фрейм синхронизации (sync. frame). |
Переход в состояние stall. |
11.9.1.2. Подпрограмма обработки прерывания (Interrupt Handling Routine)
Вектор с более высоким номером имеет более высокий приоритет, чем вектор с меньшим номером. В таблице 11-11 перечислены все прерывания и их источники.
Таблица 11-11. Значения векторов прерывания и их источники
G[3:0] |
I[2:0] |
VECTOR (Hex) |
Источник прерывания |
Источник прерывания должен быть очищен |
0 |
0 |
00 |
Нет прерывания |
Нет источника прерывания |
1 1 1 |
1 2 3 |
12 14 16 |
Output?endpoint?1 Output?endpoint?2 Output?endpoint?3 |
Регистр VECINT |
1 |
4-7 |
18-1E |
Зарезервировано |
|
2 2 2 |
1 2 3 |
22 24 26 |
Input?endpoint?1 Input?endpoint?2 Input?endpoint?3 |
Регистр VECINT |
2 |
4-7 |
28-2E |
Зарезервировано |
|
3 3 3 3 3 3 3 3 |
0 1 2 3 4 5 6 7 |
30 32 34 36 38 3A 3C 3E |
Принят пакет STPOW Принят пакет SETUP Зарезервировано Зарезервировано Прерывание RESR Прерывание SUSR Прерывание RSTR Прерывание Wakeup |
Регистры USBSTA/VECINT Регистры USBSTA/VECINT
Регистры USBSTA/VECINT Регистры USBSTA/VECINT Регистры USBSTA/VECINT Регистры USBSTA/VECINT |
4 4 4 4 |
0 1 2 3 |
40 42 44 46 |
Прерывание I2C TXE Прерывание I2C RXF Input?endpoint?0 Output?endpoint?0 |
Регистр VECINT |
4 |
4-7 |
48-4E |
Зарезервировано |
|
5 5 |
0 1 |
50 52 |
Прерывание статуса UART1 Прерывание статуса модема UART1 |
Регистр LSR/VECNT |
5 |
2-7 |
54-5E |
Зарезервировано |
|
6 6 |
0 1 |
60 62 |
Прерывание RXF UART1 Прерывание TXE UART1 |
Регистр LSR/VECNT |
6 |
2-7 |
64-6E |
Зарезервировано |
|
7 |
0-7 |
70-7E |
Зарезервировано |
|
8 8 8 |
0 1 2 |
80 82 84 |
Прерывание DMA1 Зарезервировано Прерывание DMA3 |
Регистр DMACSR/VECINT
Регистр DMACSR/VECINT |
8 |
3-7 |
86-8E |
Зарезервировано |
|
9-15 |
0-7 |
90-FE |
Зарезервировано |
|
11.9.2. Аппаратный сброс, инициируемый программно
Эта возможность может использоваться при обновлении firmware. Как только обновление завершено, приложение firmware отключается от USB на время как минимум 200 мс, чтобы обеспечить выгрузку драйвера операционной системой. Затем firmware разрешает работу сторожевого таймера (watchdog timer, этот таймер по умолчанию разрешен после сброса при включении питания), и входит в бесконечный цикл без сброса сторожевого таймера. Как только истечет таймаут сторожевого таймера (128 мс), он сбросит TUSB3410 так же, как это произошло быт при включении питания. Код загрузки запускается и выполняет последовательность действий при включении питания и загрузке.
11.10. Файлы
Исходный код TUSB3410 Bootcode (SLLC139.zip) можно скачать со страницы описания TUSB3410 на сайте компании Texas Instruments. Просмотрите ссылку Related Software. В скачанном zip-архиве имеются следующие файлы.
• Types.h • USB.h • TUSB3410.h • Bootcode.h • Watchdog.h • Bootcode.c • Bootlsr.c • BootUSB.c • Header.h • Header.c • I2c.h • I2c.c
[12. Электрические параметры и условия работы]
12.1. Предельно допустимые эксплуатационные параметры (Absolute Maximum Ratings)
Превышение указанных здесь значений может полностью повредить микросхему. Эти параметры являются для чипа стрессовыми, и не подразумевается реальная эксплуатация микросхемы с этими параметрами или с параметрами, не соответствующими разделу "recommended operating conditions" (рекомендованные условия работы). Кроме того, работа в условиях предельно допустимых параметров может повлиять на надежность работы микросхемы.
12.2. Commercial Operating Condition (3.3 V) - коммерческие условия функционирования
[]
12.3. Электрические характеристики
[]
[13. Указания по применению (Application Notes)]
..
[Упаковка и размеры корпуса]
..
[Словарик]
CODE специальное адресное пространство архитектуры MCS-51 (8051, 8052), где находится код программы firmware. Адресное пространство CODE от состоит из 65536 байт (16-битный адрес в диапазоне 0000h .. FFFFh). Доступ к CODE из firmware возможен через специальные команды.
Control endpoint конечная точка, которая предназначена для управления и получения данных о состоянии. Эта конечная точка имеется во всех устройствах USB, всегда имеет номер 0, и активно участвует в процедуре энумерации устройства USB.
DATA еще отдельное адресное пространство архитектуры MCS-51 (8051, 8052), где находятся данные. Адресное пространство DATA состоит из 256 байт (8-битный адрес в диапазоне 00h .. FFh). Доступ к DATA из firmware возможен через специальные команды. Специальные 8-битные регистры, работа с которыми возможна напрямую из команд ассемблера. Это сама быстрая память, с которой возможны арифметические и логические операции.
DMA direct memory access, прямой доступ к памяти без участия программной обработки микроконтроллера.
DMAC DMA controller, контроллер DMA.
EDB endpoint descriptors block - блок дескриптора конечной точки.
endpoint конечная точка, которая физически представляет из себя буфер памяти определенного размера. Обычно размер конечной точки 8, 16, 32, 64, 128 или 256 байт.
GPIO General Purpose Input/Output - порт ввода/вывода общего назначения микроконтроллера. Порт программно управляет внешними ножками микроконтроллера, либо позволяет считать с них логические уровни.
CPU узел ядра MCU 8052. Фактически то же самое, что и MCU.
IN, input в контексте конечных точек и транзакций обозначает направление передачи от устройства USB к хосту.
Input endpoint конечная точка, которая предназначена для данных пакета IN, в этом случае байты передаются от устройства USB к хосту.
LSB Least Significant Byte - наименее значимый байт.
MCU Microcontroller Unit — микроконтроллер (микросхема, содержащая процессор, память и периферийные устройства). Применительно к TUSB3410 имеется в виду встроенное ядро микроконтроллера 8052.
MMR Memory Mapped Register - регистр, отображенный на память. Через эти регистры происходит работа с аппаратурой периферии чипа TUSB3410 (USB, I2C, UART, DMA, GPIO и т. д.).
MSB Most Significant Byte - наиболее значимый байт.
NAK отрицательный ответ на запрос хоста IN или OUT. Означает для хоста, что данные пока не могут быть переданы.
OEM Original equipment manufacturer — аббревиатура для обозначения чего-либо, имеющего отношение к производству продукта OEM-способом, при котором этот продукт, продающийся розничным покупателям под оригинальным брендом, получается путём сборки типовых комплектующих и/или их кастомизацией. Компанию, которая занимается сборкой конечного продукта, называют OEM-производителем, а компанию, которая поставляет типовые комплектующие, — OEM-поставщиком. OEM – компонентами называется продукт, использующийся как составная часть завершенного продуктового решения.
OUT, output в контексте конечных точек и транзакций обозначает направление передачи от хоста к устройству USB.
Output endpoint конечная точка, которая предназначена для данных пакета OUT, в этом случае байты передаются от хоста к устройству USB.
IR InfraRed - инфракрасный канал связи.
pullup, pull-up, pull up верхний нагрузочный резистор, подключенный к плюсу источника питания или к выходу буфера состоянием лог. 1. Если pullup относится к каналу USB чипа TUSB3410, то имеется в виду нагрузочный резистор 1.5 кОм, подключенный к сигналу D+. В другом контексте имеется в виду внутренний нагрузочный резистор, который имеется на каждом выводе порта P3, и который может быть подключен или отключен программно.
SOF Start Of Frame - начало фрейма шины USB.
stall по отношению к USB означает событие ошибки, которое требует вмешательства хоста.
UBM USB Buffer Manager - контроллер буфера USB.
upstream port восходящий порт, т. е. порт, направленный к хосту. В контексте хабов USB различают upstream и downstream порты, причем у хаба может быть только один порт upstream, которым он подключен к компьютеру, и может быть один или более одного портов downstream. Данные не могут передаваться напрямую между портами downstream, только через порт upstream. Непонятно, почему в даташите TUSB3410 упоминается этот термин - наверное просто по привычке.
XDATA специальное адресное пространство архитектуры MCS-51 (8051, 8052), где находятся данные. Адресное пространство XCODE от состоит из 65536 байт (16-битный адрес в диапазоне 0000h .. FFFFh). Доступ к XDATA из firmware возможен через специальные команды.
[Ссылки]
1. TUSB3410 site:ti.com. 2. TUSB3410 - краткая справка. |
Комментарии
RSS лента комментариев этой записи