В микроконтроллер ATmega32 встроен интерфейс JTAG (совместимый со стандартом IEEE std. 1149.1). Этот интерфейс может быть использован для тестирования схем (технология граничного сканирования JTAG Boundary-Scan), программирования внутренней памяти микроконтроллера (память программ FLASH, энергонезависимая память EEPROM, фьюзы, биты защиты) и для отладки программ.
Отладчик имеет доступ к следующим внутренним ресурсам микроконтроллера:
Встроенная в кристалл поддержка отладки (On-chip Debug System, сокращенно OCD) включает следующее:
• Инструкция AVR Break. • Точка останова при ветвлении потока вычислений. • Точка останова для пошагового выполнения. • Точки останова в памяти программ на одиночный адрес и диапазон адресов. • Точки останова на памяти данных - или на одиночный адрес, или диапазон адресов.
Отладчик JTAG может программировать и считывать память RAM, FLASH и EEPROM, фьюзы управления и защиты. OCD поддерживается системами программирования AVR Studio, Atmel Studio, IAR.
Примечание: цоколевка и почти все функциональные особенности ATmega32, ATmega32L и ATmega32A совпадают. Поэтому все, что здесь было сказано про ATmega32, также относится и к микроконтроллерам ATmega32L и ATmega32A (если специально не указано нечто иное). Все непонятные термины и сокращения, касающиеся интерфейса JTAG, см. в разделе Словарик, в конце статьи.
У ATmega32 выводы JTAG совмещены с ножками GPIO порта C (см. таблицу и цоколевки ниже). Когда интерфейс JTAG разрешен, эти выводы не используются как порты GPIO.
Сигнал
Вывод DIP40
Вывод TQFP44
TDI, совмещен с PC5
27
24
TDO, совмещен с PC4
26
23
TMS, совмещен с PC3
25
22
TCK, совмещен с PC2
24
21
TDI, бит 5 порта C. Сигнал JTAG Test Data In: последовательный вход данных, которые вдвигаются в регистр инструкций (Instruction Register, IR) или регистр данных (Data Register, DR) цепочек сканирования.
TDO, бит 4 порта C. Сигнал JTAG Test Data Out: последовательный вывод данных из IR или DR. Вывод TD0 находится в третьем состоянии, пока TAP не выдвигает данные.
TMS, бит 3 порта C. Сигнал JTAG Test Mode Select: этот вывод используется для навигации по дереву машины состояний автомата TAP-контроллера.
TCK, бит 2 порта C. сигнал JTAG Test Clock: такты, используемые для синхронизации системы JTAG.
По умолчанию интерфейс JTAG разрешен фьюзами OCDEN и JTAGEN, и в этом случае выводы JTAG PC5 (TDI), PC4 (TDO), PC3 (TMS) и PC2 (TCK) не могут использоваться как порты GPIO. Кроме того, на выводах входов JTAG PC5(TDI), PC3(TMS) и PC2(TCK) автоматически активируются верхние подтягивающие резисторы (pull-up) даже тогда, когда произошел сброс микроконтроллера.
Вывод PC4 (TD0) находится в третьем состоянии кроме случая, когда автомат TAP вошел в состояние сдвига данных наружу.
Широко используемая цоколевка ATmel JTAG, совместимая с Altera JTAG, AVR Dragon, JTAGICE mkII и другими JTAG-адаптерами/отладчиками.
Если встроенная в кристалл микроконтроллера система отладки (OCD) разрешена фьюзом OCDEN (по умолчанию, в заводском состоянии этот фьюз разрешает отладку), и микроконтроллер вошел в режим Power down (выключено) или Power save sleep (режим сна для экономии энергопотребления), то основной источник тактовой частоты остается разрешенным. В этих режимах сна это приведен к значительному общему потреблению тока. Есть три способа избежать этого:
Вывод TDO остается в "плавающим", когда интерфейс JTAG разрешен и контроллер JTAG TAP не выдвигает данные. Если аппаратура, подключенная к выводу TDO, не делает его подтяжку к одному из логических уровней, то энергопотребление вырастет. Обратите внимание, что вывод TDI следующего устройства в цепочке обычно имеет pull-up, который решит эту проблему. Также запишите лог. 1 в бит JTD регистра MCUCSR, или оставьте бит фьюза JTAG не запрограммированным, что запретит интерфейс JTAG и снизит энергопотребление.
MCU находится в состоянии сброса, пока имеется лог. 1 в регистре сброса (Reset Register) одной из цепочек сканирования системы JTAG. Подробнее см. раздел "Использование граничного сканирования (Boundary-scan)" с кратким описанием IEEE 1149.1 (JTAG) Boundary-scan.
Рис 14-1. Логика сброса.
Пояснения к рис. 14-1:
MCU Control and Status Register регистр управления и статуса микроконтроллера (см. далее описание этого регистра). PORF, BORF, EXTRF, WDRF, JTRF биты этого регистра.
Power-On Reset логика, обеспечивающая сброс при подаче питания.
Brown-Out Reset логика, обеспечивающая сброс при выходе напряжения питания за допустимый нижний предел.
BODEN, BODLEVEL фьюзы, управляющие логикой Brown-Out Reset. Подробнее см. описание этих фьюзов в даташите на микроконтроллер.
~RESET внешний вывод для подачи сигнала сброса (активный уровень лог. 0).
SPIKE FILTER заградительный фильтр, не пропускающий короткие импульсы.
JTAG Reset Register регистр JTAG, обеспечивающий сброс микроконтроллера (блок JTAG при этом не сбрасывается).
INTERNAL RESET сигнал внутреннего сброса микроконтроллера.
CKSEL[3:0] фьюзы, определяющие выбор источника тактирования ядра микроконтроллера.
SUT[1:0] фьюзы, определяющие время запуска тактового генератора.
[JTAG и регистры микроконтроллера]
В этом разделе описаны регистры ATmega и их биты, влияющие на работу JTAG. Описание остальных битов этих регистров см. в даташите на микроконтроллер.
Примечание: когда для доступа к этим регистрам используются команды ассемблера IN и OUT, работающие с адресным пространством I/O 0x00..0x3F, то должны использоваться адреса, указанные во врезке с описанием регистра. Когда эти же регистры адресуются через адресное пространство данных командами ассемблера LD и ST, то к этому адресу нужно добавить 0x20.
OCDR – On-chip Debug Register, это регистр управляющий отладкой. Адресное смещение в пространстве адресов ввода/вывода 0x31 (адрес в пространстве данных будет 0x51).
№ разрядов
7
6
5
4
3
2
1
0
Имена бит
IDRD/OCDR7
OCDR6
OCDR5
OCDR4
OCDR3
OCDR2
OCDR1
OCDR0
Чтение/запись
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Нач. значение
0
0
0
0
0
0
0
0
Бит 7, IDRD/OCDR7: USART Receive Complete. Регистр OCDR предоставляет канал обмена данными между программой, запущенной в микроконтроллере, и отладчиком. CPU может передать байт в отладчик, записав его в этот регистр. В то же самое время внутренний флаг I/O Debug Register Dirty (IDRD) установится, чтобы показать отладчику, что был записан этот регистр. Когда CPU читает регистр OCDR, то младшие 7 бит будут прочитаны из регистра OCDR, в то время как старший бит будет битом IDRD. Отладчик очищает бит IDRD, когда читает эту информацию.
В некоторых микроконтроллерах AVR этот регистр расположен в общем стандартном адресном пространстве ввода/вывода (I/O). В этом случае к регистру OCDR можно получить доступ только в том случае, если запрограммирован фьюз OCDEN, и отладчик разрешает доступ к регистру OCDR. Во всех других случаях осуществляется доступ к стандартной ячейке I/O.
Для дополнительной информации по использованию этого регистра обратитесь к документации на отладчик.
Биты 6:0, OCDRn: On-chip Debug Register n [n = 6:0].
MCUCSR – MCU Control and Status Register, регистр управления и статуса. Адресное смещение в пространстве адресов ввода/вывода 0x34 (адрес в пространстве данных будет 0x54).
№ разрядов
7
6
5
4
3
2
1
0
Имена бит
JTD
ISC2
-
JTRF
WDRF
BORF
EXTRF
PORF
Чтение/запись
R/W
R/W
R
R/W
R/W
R/W
R/W
R/W
Нач. значение
0
0
1
0
0
0
0
0
Бит 7, JTD: JTAG Interface Disable. Когда в этом бите лог. 0, интерфейс JTAG разрешен, если запрограммирован фьюз JTAGEN. Если в этом бите лог. 1, то работа интерфейса JTAG запрещена. Чтобы избежать случайного запрета или разрешения интерфейса JTAG, должна соблюдаться определенная последовательность действий во времени, когда изменяется этот бит: программа приложения должна записать в этот бит нужное значение дважды в течение 4 тактов ядра, чтобы бит поменял свое значение.
Если интерфейс JTAG не подключен, или оставлен подключенным к другим схемам JTAG, то бит JTD должен быть установлен в лог. 1. Причина для этого в том, что желательно перевести TDO в третье состояние, чтобы избежать появления статического тока вывода TDO в интерфейсе JTAG.
Бит 4, JTRF: JTAG Reset Flag. Этот бит устанавливается, если сброс был вызван появлением лог. 1 в JTAG Reset Register, который был записан JTAG-инструкцией AVR_RESET. Этот бит сбрасывается сбросом от включения питания, или путем записи нуля в этот флаг.
У микроконтроллера ATmega32A есть 2 байта фьюзов. Таблицы в этой секции кратко описывают функционал всех фьюзов, и как они отображаются на байты фьюзов. Обратите внимание, что когда фьюз читается как лог. 0, то он считается запрограммированным.
Имена фьюзов, влияющих на работу JTAG, выделены в таблицах жирным шрифтом.
Таблица 29-3. Старший байт фьюзов.
Имя фьюза
№ бита
Описание
Значение по умолчанию
OCDEN(4)
7
Enable OCD (разрешение отладки)
1 (бит не запрограммирован, отладка запрещена)
JTAGEN(5)
6
Enable JTAG (разрешение работы JTAG)
0 (бит запрограммирован, JTAG разрешен)
SPIEN(1)
5
Разрешение последовательного программирования и загрузки данных
0 (бит запрограммирован, программирование через SPI разрешено)
CKOPT(2)
4
Опции управления генератором тактов
1 (бит не запрограммирован)
EESAVE
3
Будет сохраняться или нет содержимое EEPROM после Chip Erase
1 (бит не запрограммирован, содержимое EEPROM не будет сохранено)
BOOTSZ1
2
Выбор размера сектора для загрузчика (подробнее см. даташит, таблица "Boot Size Configuration" в разделе "Boot Loader Parameters")
0 (бит запрограммирован)(3)
BOOTSZ0
1
BOOTRST
0
Выбран или нет запуск загрузчика при сбросе
1 (бит не запрограммирован)
Примечания:
1. Фьюз SPIEN недоступен в режиме программирования через SPI (SPI Serial Programming).
2. Функция CKOPT зависит от установок битов CKSEL, подробнее см. раздел даташита "Clock Sources" (источники тактирования).
3. Значение по умолчанию для BOOTSZ1:0 соответствует максимальному размеру сектора загрузчика (Boot Size). См. таблицу "Boot Size Configuration" в секции даташита "Boot Loader Parameters".
4. Не поставляйте готовое изделие с запрограммированным фьюзом OCDEN, независимо от установки бит защиты (lock bits) и фьюза JTAGEN. Запрограммированный бит фьюзов OCDEN разрешает некоторые части системы тактирования в рабочем состоянии для некоторых режимов сна. Это может увеличить энергопотребление.
5. Если интерфейс JTAG не подключен, то по возможности фьюз JTAGEN должен быть не запрограммирован (в состоянии лог. 1, чтобы JTAG был отключен). Это позволит избежать статического тока через вывод TDO.
Таблица 29-4. Младший байт фьюзов.
Имя фьюза
№ бита
Описание
Значение по умолчанию
BODLEVEL
7
Управление уровнем детектора пропадания напряжения питания (Brown out detector, BOD)
1 (бит не запрограммирован)
BODEN
6
Разрешение работы детектора пропадания напряжения питания
1 (бит не запрограммирован, BOD запрещен)
SUT1
5
Выбор времени запуска тактового генератора
1 (бит не запрограммирован)(1)
SUT0
4
0 (запрограммирован)(1)
CKSEL3
3
Выбор источника тактирования
0 (бит запрограммирован)(2)
CKSEL2
2
0 (бит запрограммирован)(2)
CKSEL1
1
0 (бит запрограммирован)(2)
CKSEL0
0
1 (бит не запрограммирован)(2)
Примечания:
1. Значение по умолчанию SUT1:0 соответствует максимальному времени запуска генератора. Подробности см. в таблице "Start-up Times for the Internal Calibrated RC Oscillator Clock Selection" в секции "Calibrated Internal RC Oscillator" даташита.
2. Значение по умолчанию CKSEL3:0 соответствует внутреннему генератору RC, дающему тактовую частоту 1 МГц. Подробнее см. таблицу "Device Clocking Options Select" в разделе "Clock Sources" даташита.
Состояние битов фьюзов не меняется при стирании чипа (Chip Erase). Обратите внимание, что биты фьюзов заблокированы, если запрограммирован бит защиты 1 (Lock bit1, LB1). Программируйте биты фьюзов перед программированием бит защиты.
Значения фьюзов защелкиваются (их настройки вступают в действие), когда устройство входит в режим программирования, и изменение значений фьюзов не даст эффекта, пока устройство не покинет режим программирования. Это не относится к фьюзу EESAVE, настройка которого входит в действие сразу после программирования. Фьюзы также защелкиваются в нормальном режиме, когда происходит подача питания/включение (Power-up).
[JTAG и встроенная в кристалл система отладки]
Поддержка OCD основана на приватных инструкциях JTAG, и информация о них распространяется только внутри ATMEL и среди выбранных сторонних производителей оборудования и программного обеспечения.
На рис. 27-1 показан интерфейс JTAG и система OCD. Машина состояний контроллера TAP управляется сигналами TCK и TMS. Контроллер TAP выбирает либо регистр инструкций JTAG (Instruction Register, IR), либо один из нескольких регистров данных (Data Registers, DR) как цепочку сканирования (регистр сдвига) между выводами TDI (вход данных) и TDO (выход данных). IR хранит инструкции JTAG, управляющие поведением DR.
Регистры ID, Bypass и Boundary-scan Chain это регистры данных, используемые на уровне тестирования печатной платы. Интерфейс программирования JTAG (основанный на нескольких физических и виртуальных регистрах данных) используется для последовательного программирования через JTAG. Внутренняя цепочка сканирования (Internal Scan Chain) и цепочка сканирования точки останова (Break Point Scan Chain) используется только для OCD.
TAP – Test Access Port. К интерфейсу JTAG осуществляется доступ через 4 вывода корпуса AVR. В терминологии JTAG эти выводы представляют порт доступа тестирования, Test Access Port (TAP). Вот эти выводы:
Сигнал
Направление
Описание
TMS: Test mode select
вход
Этот сигнал используется для навигации по машине состояний автомата TAP-контроллера.
TCK: Test clock
вход
JTAG работает синхронно с сигналом TCK.
TDI: Test Data In
вход
Вход последовательных данных для ввода в IR или DR (цепочки сканирования).
TDO: Test Data Out
выход
Выход последовательных данных для вывода из IR или DR.
Стандарт IEEE 1149.1 также указывает возможное наличие опционального (не обязательного) сигнала сброса TAP. Это сигнал ~TRST (Test ReSeT), который не предоставляется микроконтроллером ATmega32.
Когда фьюз JTAGEN не запрограммирован (это не состояние по умолчанию, которого можно достичь только с помощью программатора), эти 4 вывода TAP работают как обычные ножки GPIO, и контроллер TAP находится в состоянии сброса. Когда фьюз JTAGEN запрограммирован (это не заводское состояние по умолчанию), и бит JTD в регистре MCUCSR очищен, входные сигналы TAP подтянуты внутри микроконтроллера к лог. 1, и JTAG разрешен для программирования и запуска тестов Boundary-scan. В этом случае выход TAP (TDO) остается в отключенном (плавающем) состоянии, когда JTAG TAP-контроллер не сдвигает данные, так что он должен быть подключен либо к внешнему верхнему подтягивающему резистору (pull-up) или другой аппаратуре, где есть такой pull-up (например, это может быть вход TDI следующего устройства в цепочке сканирования). Микроконтроллер поставляется с запрограммированным фьюзом JTAGEN (работа JTAG не запрещена, это состояние фьюза по умолчанию).
Для системы OCD, в дополнение к выводам интерфейса JTAG, отладчиком мониторится вывод ~RESET, чтобы можно было обнаружить сигнал сброса от внешних источников. Отладчик может также подтянуть вывод ~RESET к лог. 0, чтобы сбросить всю систему, что подразумевается использовании в схеме сигнала сброса приложения только открытых коллекторов (стоков).
TAP-контроллер имеет стандартную машину с 16 состояниями, которая управляет работой схемы граничного сканирования (Boundary-scan), схемы программирования JTAG, или системой OCD. Переходы между состояниями, показанные на рис. 27-2, зависят от сигнала, присутствующего на TMS (показан сигнал, соседствующий с каждым переходом состояния) в момент нарастания уровня (положительного перепада) тактов TCK. Начальное состояние после сброса при включении питания - Test-Logic-Reset.
Как определено стандартом, LSB вдвигается и выдвигается первым для всех регистров сдвига.
Рис. 27-2. Стандартная схема переходов машины состояний TAP-контроллера JTAG.
Если предположить, что настоящее состояние машины это Run-Test/Idle, то типичный сценарий использования интерфейса JTAG следующий:
• На вход TMS подается последовательность 1, 1, 0, 0 в такт с положительными перепадами TCK, чтобы войти в состояние сдвига регистра инструкций – состояние Shift-IR. В этом состоянии вдвигаются 4 бита инструкции JTAG в регистр IR через вход TDI по положительным перепадам TCK. Вход TMS должен удерживаться в лог. 0 в течение ввода 3 LSB, чтобы машина оставалась в состоянии Shift-IR. Бит MSB инструкции вдвигается, когда происходит выход из этого состояния установкой TMS в лог. 1. Когда инструкция вдвигается через вывод TDI, захваченное состояние IR (captured IR-state) 0x01 выдвигается наружу через вывод TDO. Регистр IR выбирает определенный регистр данных DR как путь распространения данных между TDI и TDO, и управляет схемами, окружающими выбранный DR.
• На вход TMS подается последовательность 1, 1, 0 для повторного входа в состояние Run-Test/Idle. Инструкция захватывается в параллельный выход из пути регистра сдвига в состояние Update-IR. Состояния Exit-IR, Pause-IR и Exit2-IR используются только для навигации по состояниям машины.
• На вход TMS подается последовательность 1, 0, 0 по положительным перепадам TCK для входа в состояние сдвига регистра данных – Shift-DR. В этом состоянии происходит загрузка выбранного DR (он был выбран предыдущей инструкцией JTAG, которая была помещена в IR) со входа TDI по положительным перепадам TCK. Чтобы остаться в состоянии Shift-DR, вход TMS должен удерживаться в лог. 0 во время ввода всех бит, кроме бита MSB. MSB данных вдвигается, когда происходит выход из этого состояния установкой TMS в лог. 1. Когда в DR вдвигаются данных через вывод TDI, параллельные входы DR, захваченные в состоянии Capture-DR, выдвигаются через вывод TDO.
• На вход TMS подается последовательность 1, 1, 0 для повторного входа в состояние Run-Test/Idle. Если выбранный DR захватывается на параллельный выход, то это происходит в состоянии Update-DR. Состояния Exit-DR, Pause-DR и Exit2-DR используются только для навигации по состояниям машины.
Как показано на диаграмме состояний, в состояние Run-Test/Idle не нужно заходить между выбором инструкции JTAG и использованием регистров данных, и некоторые инструкции JTAG могут выбирать определенные функции, выполняемые в состоянии Run-Test/Idle, делая его недоступным для использования как состояние ожидания (Idle state).
Примечание: независимо от начального состояния TAP-контроллера, в состояние Test-Logic-Reset можно всегда войти, удерживая TMS в лог. 1 на 5 тактовых периодов TCK.
Подробную информацию по спецификации JTAG можно получить из литературы, перечисленной в разделе Библиография.
[Библиография]
• IEEE: IEEE Std 1149.1-1990. IEEE Standard Test Access Port and Boundary-scan Architecture, IEEE, 1993. • Colin Maunder: The Board Designers Guide to Testable Logic Circuits, Addison-Wesley, 1992.
• Интерфейс JTAG, совместимый со стандартом IEEE std. 1149.1 Compliant. • Пограничное сканирование (Boundary-scan) по стандарту JTAG. • Полное сканирование всех функций портов, в том числе и аналоговой схемы (подключенной снаружи к выводам АЦП). • Поддержка опциональной инструкции IDCODE. • Дополнительная публичная инструкция AVR_RESET для сброса AVR.
Обзор системы. Цепочка граничного сканирования (Boundary-scan Chain) позволяет управлять логическими уровнями на выходах и анализировать входные логические уровни на цифровых портах ввода/вывода (CPIO), а также на границе между цифровой и аналоговой логики для аналоговой части схемы, подключенной к чипу микроконтроллера снаружи. На уровне системы все микросхемы, у которых есть функции JTAG, последовательно соединяются через сигналы TDI/TDO, формируя таким способом длинный регистр сдвига. Внешний контроллер (мастер шины JTAG) настраивает устройства управления уровнями на их выходах и для отслеживания уровней на их входах. Мастер-контроллер сравнивает принятые данные с ожидаемым результатом. Таким образом, технология граничного сканирования предоставляет механизм для тестирования внутренних соединений на печатной плате между различными узлами схемы, используются только 4 сигнала TAP.
Стандарт IEEE 1149.1 определяет 4 обязательные инструкции JTAG: IDCODE, BYPASS, SAMPLE/PRELOAD и EXTEST. Для ATmega32 также определены публичная, специфичная для AVR, инструкция AVR_RESET. Эти 5 инструкций могут использоваться для тестирования печатной платы системы. Начальное сканирование регистра данных покажет идентификатор устройства (ID-code), поскольку IDCODE является инструкцией JTAG по умолчанию. Может быть желательным иметь во время тестирования AVR в состоянии сброса. Если AVR не в состоянии сброса, то входы устройства можно опросить операциями сканирования, и внутреннее программное обеспечение может быть в неопределенном состоянии, когда произошел выход из режима тестирования. После сброса выходы ножек портов немедленно окажутся в состоянии высокого сопротивления, делая инструкцию HIGHZ избыточной. Если необходимо, может быть выдана инструкция BYPASS, что предоставляет самый короткий путь для данных, которые проходят через устройство. Устройство можно установить в состояние сброса либо путем подтягивания внешней ножки ~RESET к уровню лог. 0, либо выдачей инструкции AVR_RESET с подходящей установкой регистра данных сброса (Reset Data Register).
Инструкция EXTEST используется для выборки уровней внешних выводов (чтение) и загрузки выходных выводов данными (запись). Данные с выходной защелки будут передаваться на выводы, как только инструкция EXTEST окажется загруженной в регистр IR JTAG. Таким образом, должна также использоваться инструкция SAMPLE/PRELOAD для установки начальных значений в цепочку кольца сканирования, чтобы избежать повреждения платы, когда инструкция EXTEST выдается первый раз. Инструкция SAMPLE/PRELOAD также может использоваться для получения снимка состояния внешних выводов во время нормальной работы тестируемой микросхемы.
Должен быть запрограммирован фьюз JTAGEN, и очищен бит JTD в регистре MCUCSR, чтобы разрешить работу JTAG TAP.
Когда для граничного сканирования используется интерфейс JTAG, возможно использование тактовой частоты JTAG TCK выше, чем внутренняя тактовая частота чипа. Для работы тестов частота чипа не требуется.
[Регистры данных]
К операциям граничного сканирования относятся следующие регистры:
Bypass Register. Этот регистр состоит из одной стадии регистра сдвига. Когда выбран Bypass Register между TDI и TDO, этот регистр сбрасывается в 0, когда покидает состояние Capture-DR контроллера TAP. Bypass Register может использоваться для сокращения цепочки сканирования в системе, когда тестируются другие устройства печатной платы/системы.
Device Identification Register. Рисунок ниже показывает структуру регистра идентификации.
№ разрядов
31 28
27 12
11 1
0
Device ID
Version
Part Number
Manufacturer ID
1
4 бита
16 бит
11 бит
1 бит
Рис. 27-3. Формат Device Identification Register.
Version. Регистр Version это 4-битное число, идентифицирующее ревизию этого компонента. Номер версии JTAG следует за номером ревизии устройства, и повторяется в ревизии P (0xF). Ревизии A и Q равны 0x0, ревизии B и R равны 0x1, и так далее.
Part Number. Номер типа компонента это 16-битный код, идентифицирующий тип электронного компонента (в данном случае модель ATmega32A, ATmega32L и т. п.). Номера некоторых типов микроконтроллеров ATmega перечислены в таблице 27-1.
Таблица 27-1. AVR JTAG Part Number.
0x9502
Тип микроконтроллера
Version
Part Number (Hex)
ATmega16 ревизия G
0x6
0x9403
ATmega16 ревизия H
0xE
ATmega16 ревизия I
0x8
ATmega16 ревизия J
0x9
ATmega16 ревизия K
0xA
ATmega16 ревизия L
0xB
ATmega32
0x5
0x9502
ATmega32A
0x8
ATmega32L
ATmega128 ревизия C
0x3
0x9702
ATmega128 ревизия F
0x5
ATmega128 ревизия G
0x6
Примечание: ATmega32, ATmega32A и ATmega32L отличаются в регистре идентификации только по номеру версии Version.
Manufacturer ID. Идентификатор производителя это 11-битный код, который указывает на производителя микросхемы. JTAG manufacturer ID компании ATMEL и других производителей показаны в таблице ниже.
Таблица 27-2. Manufacturer ID.
Производитель
JTAG Manufacturer ID
HEX
BIN
Lexr
0x006
00000000110
Hitachi
0x007
00000000111
Intel
0x009
00000001001
Freescale (Motorola)
0x00E
00000001110
Philips Semi. (Signetics)
0x015
00000010101
Texas Instruments
0x017
00000010111
Toshiba
0x018
00000011000
Atmel
0x01F
00000011111
Lattice Semiconductors
0x021
00000100001
IBM Semiconductors
0x024
00000100100
Cypress
0x034
00000110100
DEC
0x035
00000110101
Xilinx
0x049
00001001001
Analog Devices
0x065
00001100101
Altera
0x06E
00001101110
Lattice Semiconductors
0x0AB
00010101011
Broadcom
0x0BF
00010111111
Sibyte, Inc.
0x150
00101010000
Brecis (PMC-Sierra)
0x170
00101110000
Marvell
0x1E9
00111101001
0x1AB
00110101011
ARM
0x787
11110000111
Reset Register. Регистр сброса относится к регистрам данных тестирования (Test Data Register), используемый для сброса устройства. Поскольку AVR переводит при сбросе свои выводы портов в третье состояние, то Reset Register также может заменить функцию не реализованной опциональной JTAG-инструкции HIGHZ.
Лог. 1 в регистре сброса соответствует подтяжке внешнего вывода сброса (~RESET) к уровню лог. 0. Сброс устройства продолжается, пока присутствует лог. 1 в Reset Register. В зависимости от настроек фьюзов для опций тактирования, после освобождения регистра сброса (после появления в нем лог. 0) микроконтроллер останется в состоянии сброса еще на период таймаута сброса (Reset Time-Out Period, см. раздел даташита "Clock Sources", посвященных источникам тактирования). Вывод из регистра данных DR не захватывается, так что сброс войдет в силу немедленно, как показано на рисунке ниже.
Рис. 27-4. Reset Register.
Boundary-scan Chain. Цепочка граничного сканирования (Boundary-scan Chain) имеет возможность управления выходными логическими уровнями и отслеживание уровней на цифровых выводах GPIO, как и уровнями на границе между цифровой и аналоговой логики для аналоговых схем, подключенных к микроконтроллеру снаружи. Подробное описание см. в главе "Boundary-scan Chain".
[JTAG-инструкции, относящиеся к Boundry-scan]
Регистр инструкций (Instruction Register, IR) имеет длину 4-бита, что дает поддержку 16 инструкций. Перечисленные ниже инструкции JTAG полезны для функционирования технологии Boundary-scan. Обратите внимание, что опциональная инструкция HIGHZ не реализована, однако все выходы могут быть переведены в третье состояние с помощью инструкции AVR_RESET, поскольку начальное состояние всех выводов портов отключенное.
LSB вдвигается и выдвигается первым для всех регистров сдвига.
OPCODE (двоичный код) для для каждой инструкции показан в круглых скобках рядом с именем инструкции в шестнадцатеричном формате. Текст с описанием показывает, какой регистр данных будет выбран как путь данных между TDI и TDO для каждой инструкции.
EXTEST (0x0). Эта обязательная инструкция JTAG, применяемая для выбора цепочки Boundary-scan как регистра данных DR для тестирования схем, находящихся снаружи по отношению к корпусу AVR. Для каждого вывода порта, запрета верхних подтягивающих резисторов (Pull-up Disable), управления выходом, выходных данных и входных данных имеется доступный разряд в цепочке сканирования. Таким образом, цепочка получается довольно длинной (см. таблицу 27-7). Для аналоговых схем, подключенных к чипу снаружи, есть интерфейс между аналоговой и цифровой логикой в цепочке сканирования. Содержимое захваченных выходов цепочки граничного сканирования будут переданы наружу, как только в IR-регистр JTAG окажется загруженной инструкция EXTEST.
Активные состояния инструкции:
• Capture-DR: данные внешних выводов захватываются в цепочку Boundary-scan. • Shift-DR: внутренняя цепочка сканирования сдвигается по тактам на входе TCK. • Update-DR: данные из цепочки сканирования прикладываются на выходные выводы.
IDCODE (0x1). Опциональная инструкция JTAG выбирает 32-битный регистр идентификации (ID Register) как регистр данных (DR). ID Register содержит номер версии, номер устройства (его тип) и код производителя, присвоенный организацией JEDEC. После включения питания эта инструкция находится в IR по умолчанию.
Активные состояния инструкции:
• Capture-DR: данные в регистре IDCODE выбираются в цепочку Boundary-scan. • Shift-DR: цепочка сканирования IDCODE сдвигается по тактам на входе TCK.
SAMPLE_PRELOAD (0x2). Обязательная инструкция JTAG для предварительной загрузки выходных защелок и получения снимка входных и выходных выводов без влияния на работу системы. Однако выходные защелки не подключены к этим выводам. Цепочка Boundary-scan выбирается как DR.
Активные состояния инструкции:
• Capture-DR: данные на внешних выводах выбираются в цепочку Boundary-scan. • Shift-DR: цепочка сканирования (Boundary-scan Chain) сдвигается по тактам на входе TCK. • Update-DR: данные из цепочки Boundary-scan прикладываются к выходным защелкам. Однако выходные защелки не подключены к выводам.
AVR_RESET (0xC). Публичная JTAG-инструкция, относящаяся к специфике AVR, предназначенная для принудительного перевода AVR в режим сброса, или вывода его из режим сброса. TAP-контроллер не сбрасывается этой инструкцией. Этот одноразрядный регистр сброса выбирается как DR. Обратите внимание, что сброс активен, пока находится лог. 1 в цепочке сканирования, когда активна инструкция сброса. Вывод из этой цепочки не захватывается.
Активные состояния инструкции:
• Shift-DR: Reset Register сдвигается по сигналу тактов TCK.
BYPASS (0xF). Обязательная инструкция JTAG, выбирающая в качестве DR регистра пропуска данных (Bypass Register).
Активные состояния инструкции:
• Capture-DR: загружает лог. 0 в Bypass Register. • Shift-DR: ячейка Bypass Register вставленная между TDI и TDO, сдвигается по тактам TCK.
[Boundary-scan Chain]
Цепочка граничного сканирования (Boundary-scan) дает возможность управлять логическими уровнями выходов и отслеживать логические уровни цифровых портов ввода/вывода, а также на границе между цифровой и аналоговой схемой, подключаемой к чипу снаружи.
Сканирование цифровых выводов портов. Первый рисунок ниже показывает ячейку граничного сканирования (Boundary-scan Cell) для ножки двунаправленного порта GPIO с функцией подключаемого верхнего подтягивающего резистора (pull-up). Эта ячейка состоит из стандартной ячейки Boundary-scan для функции Pull-up Enable (PUExn), и из ячейки двунаправленного вывода, которая комбинирует в себе 3 сигнала: Output Control (OCxn), Output Data (ODxn) и Input Data (IDxn), в регистр сдвига только из двух стадий (разрядов). Индексы порта и вывода в следующем описании не используются.
Логика Boundary-scan не включена в рисунках из даташита. Рис. 27-6 показывает простую ножку цифрового порта, как она описана в секции "I/O Ports". Подробности Boundary-scan из первого рисунка (27-5) заменяют блок, обозначенный пунктиром, из нижнего рисунка (27-6).
Когда альтернативная функция порта не представлена, входные данные (Input Data, ID) соответствуют значению регистра PINxn (но ID не имеет синхронизатора), выходные данные (Output Data) соответствуют регистру PORT, управление выходом (Output Control) соответствует регистру направления данных (Data Direction Register, DDR), и разрешение подтягивающего резистора (Pull-up Enable, PUExn) соответствует логическому выражению PUD · DDxn · PORTxn.
Цифровые альтернативные функции порта, подключенные вне области, ограниченной штриховой линией на рис. 27-6, делают возможным чтение актуального значения уровня логики на выводе чипа. Для аналоговой функции здесь есть прямое подключение от внешнего вывода до аналоговой схемы, и цепочка сканирования вставляется в интерфейс между цифровой логикой и аналоговой схемой.
Рис. 27-5. Ячейка граничного сканирования (Boundary-scan Cell) для двунаправленного вывода порта с функцией подключаемого верхнего подтягивающего резистора (Pull-Up).
Рис. 27-6. Общая схема вывода порта.
См. также раздел "I/O Ports" в даташите на микроконтроллер.
У ATmega32, как и у многих AVR, есть популярный двухпроводный интерфейс I2C (по терминологии Atmel он называется TWI, сокращение от Two-wire Interface), реализованный аппаратно. Его выводы SCL и SDA имеют один дополнительный управляющий сигнал в цепочке сканирования, разрешающий работу интерфейса - Twowire Interface Enable (TWIEN). Как показано на рисунке ниже, TWIEN разрешает работу буфера с тремя состояниями, снабженный функцией управления скоростью переключения (slew-rate control), параллельно с обычными цифровыми выводами порта (GPIO). Основная ячейка сканирования, как показано на рис. 27-11, подключена к сигналу TWIEN.
Рис. 27-7. Дополнительный сигнал сканирования для TWI/I2C.
Примечания:
1. Не предоставлена отдельная цепочка сканирования для 50-наносекундного фильтра коротких помех на входе (spike filter). Обычная поддержка сканирования для цифровых выводов порта достаточна для проверки соединений в схеме. Единственная причина наличия TWIEN в цепочке сканирования - иметь возможность отключить буфер управления скоростью переключения (slew-rate control buffer), когда выполняется тестирование схемы по технологии граничного сканирования.
2. Убедитесь, что сигналы OC и TWIEN не выставлены одновременно, так как это приведет к конфликту выходов.
Вывод сброса ~RESET микроконтроллера принимает на входе 5V, и у него активный для сброса уровень лог. 0. Также на этом выводе присутствует логика определения уровня 12V, предназначенная для режима высоковольтного параллельного программирования (High Voltage Parallel programming, HVPP). Сигнал 5V сброса называется RSTT, и сигнал 12V сброса называется RSTHV. Для обоих этих сигналов предоставлена ячейка, показанная на рисунке ниже, предназначенная только для считывания (Observe-only Cell).
Рис. 27-8. Ячейка сканирования, предназначенная только для обзора сигнала.
Микроконтроллеры AVR имеют множество опций тактирования, выбираемых фьюзами: внутренний RC-генератор (Internal RC Oscillator, используется довольно часто), внешний RC-генератор (External RC, используется редко), подача внешнего тактового сигнала (External Clock), высокочастотный кварцевый генератор (High Frequency Crystal Oscillator, используется чаще всего), низкочастотный кварцевый генератор (Low-frequency Crystal Oscillator) и генератор на керамическом резонаторе (Ceramic Resonator).
На рисунке ниже показано, как каждый генератор с внешними соединениями (использующий внешние выводы микроконтроллера) поддерживается в цепочке сканирования. Сигнал разрешения (Enable) поддерживается обычной ячейкой граничного сканирования, в то время как выход генератора/тактов подключен к ячейке, предназначенной только для считывания (такой, как показана на рис. 27-8). В дополнение к основному тактовому сигналу (который используется для тактирования MCU и периферийных устройств микроконтроллера), генератор таймера (Timer Oscillator, дополнительный генератор, используемый для RTC) сканируется таким же способом. Выход внутреннего RC-генератора не сканируется, потому что у этого генератора нет внешних выводов на корпусе микроконтроллера.
Рис. 27-9. Ячейки Boundary-scan для генераторов и опций тактирования.
В следующая таблица суммирует информацию по регистрам сканирования для внешнего тактового сигнала XTAL1, генераторов с соединениями XTAL1/XTAL2, как и для генератора таймера на 32768 Гц.
Таблица 27-3. Сигналы сканирования для генераторов(1)(2)(3).
Сигнал разрешения
Сканируемая линия тактов
Опция тактирования
Сканируемая линия тактов, когда она не используется
EXTCLKEN
EXTCLK (XTAL1)
Внешние такты
0
OSCON
OSCCK
Внешний кварц или внешний керамический резонатор
0
RCOSCEN
RCCK
Внешний RC генератор
1
OSC32EN
OSC32CK
Внешний низкочастотный кварц
0
TOSKON
TOSCK
Генератор RTC на 32 кГц
0
Примечания:
(1). Не разрешайте одновременно больше одного источника тактового сигнала.
(2). Сканирование выходов генератора даст неопределенные логические уровни, потому что тактовая частота внутреннего генератора не синхронна с тактовой частотой JTAG. Если это возможно, предпочтительнее сканировать внешний сигнал тактов (когда он работает на частоте, на порядок ниже частоты TCK).
(3). Конфигурация тактирования задается программированием фьюзов. Поскольку фьюзы нельзя поменять во время работы программы (run-time), то считается, что опции тактирования фиксированы для имеющегося приложения. Советуем проводить сканирование с такими же опциями тактирования, как будут использоваться в конечной рабочей системе. Сигналы разрешения поддерживаются в цепочке сканирования, потому что системная логика может запретить опции тактирования в режимах сна (sleep mode), так что отключает выводы генератора от цепочки сканирования. Фьюзы INTCAP не поддерживаются в цепочке сканирования, так что цепочка сканирования не может предоставить для генератора XTAL требуемые внутренние конденсаторы для его запуска, если фьюзы запрограммированы не корректно.
Сигналы компаратора, относящиеся к граничному сканированию, показаны на рисунке 27-10. Ячейка граничного сканирования, показанная на рис. 27-11, подключена к каждому из этих сигналов. Сигналы описаны в таблице 27-4.
Компаратор не требуется для действительной проверки соединений в схеме, потому что его аналоговые входы совмещены с обычными цифровыми портами GPIO.
Рис. 27-10. Аналоговый компаратор.
Рис. 27-11. Основная ячейка сканирования, используемая для сигналов компаратора и АЦП.
Таблица 27-4. Сигналы граничного сканирования для аналогового компаратора.
Имя сигнала
Направление с точки зрения компаратора
Описание
Рекомендуемый вход, когда не используется
Выходные значения, когда используется рекомендованный вход
AC_IDLE
Вход
Когда true, аналоговый компаратор выключается
1
Зависит от выполняемого кода микроконтроллера
ACO
Выход
Выход аналогового компаратора
Станет входом для выполняемого кода микроконтроллера
0
ACME
Вход
Когда true, использует выходной сигнал от мультиплексора ADC
На рис. ниже показана блок-схема АЦП со всеми соответствующими сигналами управления и анализа состояния. Ячейка граничного сканирования, показанная на рис. 27-8, подключена к каждому из этих сигналов. ADC не нужно использовать для полного теста соединений, поскольку аналоговые входы совмещены с выводами цифровых портов (GPIO).
Рис. 27-12. Аналого-цифровой преобразователь.
Примечание: неправильная установка ключей, показанных на рис. 27-12, приведут к соединению сигналов, которые могут повредить микроконтроллер. Есть несколько выборов входов схемы выборки/хранения на инверсном входе выходного компаратора на рис. 27-12. Убедитесь, что выбран только один путь - либо вывода ADC, либо источник опорного напряжения, либо общий провод.
Эти сигналы кратко описаны в следующей таблице.
Таблица 27-5. Сигналы граничного сканирования для ADC (АЦП).
Имя сигнала
Направление с точки зрения ADC
Описание
Рекомендуемый вход, когда не используется
Выходные значения, когда используются рекомендованные входы, и CPU не использует ADC
COMP
Выход
Выход компаратора
0
0
ACLK
Вход
Тактовый сигнал для каскадов усиления, реализуемые как фильтры на переключаемых конденсаторах
0
0
ACTEN
Вход
Разрешает путь от каскадов усиления до компаратора
0
0
ADCBGEN
Вход
Разрешение опорного напряжения Bandgap в качестве инверсного входа компаратора
0
0
ADCEN
Вход
Сигнал включения для ADC
0
0
AMPEN
Вход
Сигнал включения для каскадов усиления
0
0
DAC_9
Вход
Бит 9 цифрового значения для DAC
1
1
DAC_8
Вход
Бит 8 цифрового значения для DAC
0
0
DAC_7
Вход
Бит 7 цифрового значения для DAC
0
0
DAC_6
Вход
Бит 6 цифрового значения для DAC
0
0
DAC_5
Вход
Бит 5 цифрового значения для DAC
0
0
DAC_4
Вход
Бит 4 цифрового значения для DAC
0
0
DAC_3
Вход
Бит 3 цифрового значения для DAC
0
0
DAC_2
Вход
Бит 2 цифрового значения для DAC
0
0
DAC_1
Вход
Бит 1 цифрового значения для DAC
0
0
DAC_0
Вход
Бит 0 цифрового значения для DAC
0
0
EXTCH
Вход
Подключает каналы 0..3 к пути обхода вокруг каскадов усиления
1
1
G10
Вход
Разрешение усиления в 10 раз
0
0
G20
Вход
Разрешение усиления в 20 раз
0
0
GNDEN
Вход
Когда true, инверсный вход компаратора подключается к земле
0
0
HOLD
Вход
Сигнал выборки/хранения. Когда лог. 0, делает выборку аналогового сигнала. Удерживает выборку, когда лог. Если каскады усиления используются, то этот сигнал должен быть активным, когда ACLK = лог. 1.
1
1
IREFEN
Вход
Разрешает опорное напряжение Bandgap как сигнал AREF для DAC
0
0
MUXEN_7
Вход
Бит 7 входа мультиплексора
0
0
MUXEN_6
Вход
Бит 6 входа мультиплексора
0
0
MUXEN_5
Вход
Бит 5 входа мультиплексора
0
0
MUXEN_4
Вход
Бит 4 входа мультиплексора
0
0
MUXEN_3
Вход
Бит 3 входа мультиплексора
0
0
MUXEN_2
Вход
Бит 2 входа мультиплексора
0
0
MUXEN_1
Вход
Бит 1 входа мультиплексора
0
0
MUXEN_0
Вход
Бит 0 входа мультиплексора
1
1
NEGSEL_2
Вход
Вход мультиплексора для инвертирующего входа дифференциального сигнала, бит 2.
0
0
NEGSEL_1
Вход
Вход мультиплексора для инвертирующего входа дифференциального сигнала, бит 1.
0
0
NEGSEL_0
Вход
Вход мультиплексора для инвертирующего входа дифференциального сигнала, бит 0.
0
0
PASSEN
Вход
Разрешает прохождение сигнала каскадов усиления.
1
1
PRECH
Вход
Выход защелки предзаряда компаратора (активный лог. 0).
1
1
SCTEST
Вход
Разрешение TEST переключаемого конденсатора. Выход из каскада усиления x10 выходит на вывод порта ADC_4.
0
0
ST
Вход
Выходы каскадов усиления будут устанавливаться быстрее, если этот сигнал в лог. 1 первые 2 периода ACLK после того, как AMPEN перешел в лог. 1.
0
0
VCCREN
Вход
Выбирает Vcc как опорное напряжение ADC.
0
0
Если ADC не используется в сканировании, то рекомендуются входные значения из таблицы, приведенной выше. Во время сканирования не рекомендуется использовать каскады дифференциального усиления АЦП. Каскады усиления, основанные на переключаемых конденсатора, требуют быстрого функционирования и аккуратного выдерживания интервалов времени, что сложно обеспечить в цепочке сканирования. Таким образом, не предоставляется подробная информация по поводу операций с каскадом дифференциального усиления.
AVR ADC основан на аналоговой схеме, показанной на рис. 27-12, которая работает по алгоритму последовательного приближения, реализованному в цифровой логике. Когда это используется в граничном сканировании, есть проблема в том, что нужно гарантировать наличие приложенного аналогового напряжения, измеряемого в некоторых пределах. Это можно проще осуществить без запуска алгоритма последовательной аппроксимации: подайте нижний предел на цифровые линии DAC[9:0], убедитесь, что выход компаратора в лог. 0, затем подайте верхний предел на DAC[9:0], и проверьте, что на выходе компаратора лог. 1.
ADC не требует полного тестирования на соединения, поскольку аналоговые входы также совмещены с цифровыми портами GPIO.
Когда используете ADC, помните о следующем:
• Вывод порта канала ADC при использовании должен быть сконфигурирован как вход, с отключенным резистором pull-up - чтобы не конфликтовать с уровнем сигнала на входе коммутатора АЦП. • В нормальное режиме пустое преобразование (состоящее из 10 сравнений) будет выполнено, когда ADC разрешен. Советуем ждать как минимум 200 нс после разрешения работы ADC до того, как будет осуществляться управление/анализ любого сигнала ADC, или можно выполнить пустое преобразование перед использованием первого результата теста. • Значения DAC должны быть стабильны в средней точке 0x200, когда сигнал HOLD удерживается в лог. 0 (режим выборки, Sample mode).
В качестве примера рассмотрим задачу проверки 1.5V ±5% входного сигнала на канале 3 ADC, когда напряжение питания VCC равно 5.0V и AREF подключено к VCC снаружи чипа микроконтроллера.
Рекомендуемые значения из таблицы 27-5 используются за исключением тех случаев, когда используются другие значения в алгоритме из следующей таблицы. Показаны только значения DAC и выводов порта в цепочке сканирования (Scan Chain). Столбец "Actions" описывает инструкцию JTAG, которая используется перед заполнением регистра Boundary-scan в последующих столбцах. Проверка должна быть выполнена по данным, выведенным из чипа при сканировании, эти данные указаны в той же строке этой таблицы.
Таблица 27-6. Алгоритм использования ADC.
Шаг
Действия
ADCEN
DAC
MUXEN
HOLD
PRECH
PA3.Data
PA3.Control
PA3.Pullup_Enable
1
SAMPLE_PRELOAD
1
0x200
0x08
1
1
0
0
0
2
EXTEST
1
0x200
0x08
0
1
0
0
0
3
1
0x200
0x08
1
1
0
0
0
4
1
0x123
0x08
1
1
0
0
0
5
1
0x123
0x08
1
0
0
0
0
6
Проверка, что выведенный при сканировании бит COMP равен лог. 0
1
0x200
0x08
1
1
0
0
0
7
1
0x200
0x08
0
1
0
0
0
8
1
0x200
0x08
1
1
0
0
0
9
1
0x143
0x08
1
1
0
0
0
10
1
0x143
0x08
1
0
0
0
0
11
Проверка, что выведенный при сканировании бит COMP равен лог. 1
1
0x200
0x08
1
1
0
0
0
При использовании этого алгоритма ограничения по интервалам времени сигнала HOLD накладывают ограничения на тактовую частоту TCK. Поскольку алгоритм удерживает HOLD в лог. 1 для 5 шагов, то частота TCK должна быть как минимум в 5 раз больше чем количество битов сканирования, поделенное на максимальное время удержания thold,max.
[Порядок работы граничного сканирования ATmega32]
В таблице ниже показан порядок сканирования между TDI и TDO, когда как путь прохождения данных между ними выбрана цепочка граничного сканирования (Boundary-scan Chain). Бит 0 будет самым младшим (LSB); это первый бит, введенный при сканировании, и первый выведенный бит. Порядок сканирования следует порядку выводов, пока это возможно. Таким образом, биты порта A (PAx) сканируются в обратном порядке в сравнении с другими портами (PB, PC, PD).
Исключениями из правил будут цепочки сканирования аналоговых схем, которые представляют самые значащие старшие биты цепочки сканирования, независимо от того, к какому физическому выводу корпуса чипа они подключены. На рис. 27-5, PXn. Data соответствует выводу FF0, PXn. Управление соответствует FF1 и PXn. Pullup_enable соответствует FF2. Биты 2, 3, 4 и 5 Port C не находятся в цепочке сканирования, поскольку эти выводы задействованы под подключение TAP, когда разрешен интерфейс JTAG.
Таблица 27-7. Порядок сканирования ATmega32A.
№ бита
Имя сигнала
Модуль
140
AC_IDLE
Компаратор
139
ACO
138
ACME
137
ACBG
136
COMP
ADC
135
PRIVATE_SIGNAL1(1)
134
ACLK
133
ACTEN
132
PRIVATE_SIGNAL2(2)
131
ADCBGEN
130
ADCEN
129
AMPEN
128
DAC_9
127
DAC_8
126
DAC_7
125
DAC_6
124
DAC_5
123
DAC_4
122
DAC_3
121
DAC_2
120
DAC_1
119
DAC_0
118
EXTCH
117
G10
116
G20
115
GNDEN
114
HOLD
113
IREFEN
112
MUXEN_7
111
MUXEN_6
110
MUXEN_5
109
MUXEN_4
108
MUXEN_3
107
MUXEN_2
106
MUXEN_1
105
MUXEN_0
104
NEGSEL_2
103
NEGSEL_1
102
NEGSEL_0
101
PASSEN
100
PRECH
99
SCTEST
98
ST
97
VCCREN
96
PB0.Data
Port B
95
PB0.Control
94
PB0.Pullup_Enable
93
PB1.Data
92
PB1.Control
91
PB1.Pullup_Enable
90
PB2.Data
89
PB2.Control
88
PB2.Pullup_Enable
87
PB3.Data
86
PB3.Control
85
PB3.Pullup_Enable
84
PB4.Data
83
PB4.Control
82
PB4.Pullup_Enable
81
PB5.Data
80
PB5.Control
79
PB5.Pullup_Enable
78
PB6.Data
77
PB6.Control
76
PB6.Pullup_Enable
75
PB7.Data
74
PB7.Control
73
PB7.Pullup_Enable
72
RSTT
Логика сброса (только для обзора сигналов).
71
RSTHV
70
EXTCLKEN
Разрешающие сигналы для главной тактовой частоты / генераторов.
69
OSCON
68
RCOSCEN
67
OSC32EN
66
EXTCLK (XTAL1)
Вход тактов и генераторов для основной тактовой частоты ядра (только для обзора сигнала)
65
OSCCK
64
RCCK
63
OSC32CK
62
TWIEN
TWI
61
PD0.Data
Port D
60
PD0.Control
59
PD0.Pullup_Enable
58
PD1.Data
57
PD1.Control
56
PD1.Pullup_Enable
55
PD2.Data
54
PD2.Control
53
PD2.Pullup_Enable
52
PD3.Data
51
PD3.Control
50
PD3.Pullup_Enable
49
PD4.Data
48
PD4.Control
47
PD4.Pullup_Enable
46
PD5.Data
45
PD5.Control
44
PD5.Pullup_Enable
43
PD6.Data
42
PD6.Control
41
PD6.Pullup_Enable
40
PD7.Data
39
PD7.Control
38
PD7.Pullup_Enable
37
PC0.Data
Port C
36
PC0.Control
35
PC0.Pullup_Enable
34
PC1.Data
33
PC1.Control
32
PC1.Pullup_Enable
31
PC6.Data
30
PC6.Control
29
PC6.Pullup_Enable
28
PC7.Data
27
PC7.Control
26
PC7.Pullup_Enable
25
TOSC
Генератор таймера 32 кГц
24
TOSCON
23
PA7.Data
Port A
22
PA7.Control
21
PA7.Pullup_Enable
20
PA6.Data
19
PA6.Control
18
PA6.Pullup_Enable
17
PA5.Data
16
PA5.Control
15
PA5.Pullup_Enable
14
PA4.Data
13
PA4.Control
12
PA4.Pullup_Enable
11
PA3.Data
10
PA3.Control
9
PA3.Pullup_Enable
8
PA2.Data
7
PA2.Control
6
PA2.Pullup_Enable
5
PA1.Data
4
PA1.Control
3
PA1.Pullup_Enable
2
PA0.Data
1
PA0.Control
0
PA0.Pullup_Enable
Примечания:
(1). PRIVATE_SIGNAL1 всегда сканируется как 0. (2). PRIVATE_SIGNAL2 всегда сканируется как 0.
[Файлы описания граничного сканирования BDSL]
Файлы с описанием на языке Boundary-scan Description Language (BSDL) описывают устройства, поддерживающие граничное сканирование, в стандартном формате, используемом программным обеспечением автоматической генерации тестов. Порядок и функция бит в регистре данных Boundary-scan включены в это описание.
[Использование OCD]
Как показано на рис. 27-1, аппаратура поддерживающая отладку (OCD), главным образом состоит из:
• Цепочка сканирования на интерфейсе между внутренним CPU микроконтроллера AVR и внутренними периферийными устройствами. • Блок точки останова. • Интерфейс коммуникации между CPU и системой JTAG.
Все операции чтения (read) или модификация/запись (modify/write) нужные для реализации отладчика, реализованы выдачей инструкций AVR через внутреннюю цепочку сканирования CPU AVR. CPU посылает результат в ячейку, отображенную на память I/O, которая является частью коммуникационного интерфейса между CPU и системой JTAG. Блок точки останова реализует точку останова по изменению потока вычислений (Break on Change of Program Flow), одиночная точка останова на выполнение одной инструкции (Single Step Break), две точки останова на памяти программ (Program Memory Break) и две комбинированные точки останова. Всего 4 точки останова могут быть сконфигурированы в одном из вариантов:
• 4 одиночные точки останова на памяти программ. • 3 одиночные точки останова на памяти программ + 1 точка останова на памяти данных. • 2 одиночные точки останова на памяти программ + 2 точки останова на памяти данных. • 2 одиночные точки останова на памяти программ + 1 точка останова на памяти программ с маской ("точка останова на диапазон"). • 2 одиночные точки останова на памяти программ + 1 точки останова на памяти данных с маской ("точка останова на диапазон").
Однако система отладки, наподобие Atmel Studio®, может использовать одну или большее количество этих ресурсов для своих внутренних целей, оставляя меньше возможностей конечному пользователю.
Фьюз JTAGEN должен быть запрограммирован, чтобы разрешить работу JTAG TAP. Чтобы могла работать система OCD, дополнительно должен быть запрограммирован фьюз OCDEN, и не должны быть запрограммированы биты защиты (Lock bits). Как возможность защиты программного обеспечения, система OCD запрещается, если установлены биты защиты. Иначе система отладки предоставляет бэкдор в устройство, позволяя проводить несанкционированное копирование и обратную разработку программного обеспечения.
Интегрированная система разработки и отладки (IDE) Atmel Studio позволяет пользователю полный контроль за выполнением программ на устройстве AVR, на котором есть функция отладки (OCD), и когда к нему подключен внутрисхемный эмулятор (AVR In-Circuit Emulator). Также возможно выполнение программы пользователя в симуляторе процессора AVR (AVR Instruction Set Simulator). Atmel Studio поддерживает выполнение кода по листингу ассемблера, который был скомпилирован с помощью AVR Assembler компании Atmel, и по исходному коду на языке C, который был скомпилирован компиляторами сторонних производителей (из коробки в системе Atmel Studio используется форк бесплатного AVR GCC).
В этом описании дана только общая информация о системе Atmel Studio, касающаяся OCD. Более подробное описание Atmel Studio см. в специальном руководстве (Atmel Studio User Guide), которое доступна как система онлайн-помощи. Все выполняемые команды видны в листинге отладки Atmel Studio, как на уровне листинга исходного кода, так и в дизассемблированном виде. Пользователь может выполнить программу в реальном времени, выполнять одиночные шаги по коду, либо трассировать выполнения до нужного места в программе, выполнять трассировку выполнения с заходом в тело функции и без захода в функцию, выполнять код до выхода из функции, устанавливать курсор на нужный оператор кода и запускать выполнение до указанного курсором места, в любой момент останавливать выполнение и сбрасывать процессор. Дополнительно пользователь может установить неограниченное количество точек останова по коду (которые работают с использованием инструкции BREAK) и до двух точек останова на памяти данных, которые можно альтернативно комбинировать с маской (диапазоном) точки останова.
Поддержка отладки основана на частных инструкциях JTAG, описание которых распространяется только внутри самой ATMEL и между специально выбранных сторонних производителей систем отладки. Вот эти приватные инструкции, предназначенные для доступа к системе OCD:
Мнемоника команды
HEX
Описание
PRIVATE0
0x8
Force Break
PRIVATE1
0x9
Run
PRIVATE2
0xA
Выполнение инструкции AVR (2 слова!). Используйте 0x0A, SDR 0xFFFF0000 для чтения PC (реально вернет PC+2 или PC+4)
PRIVATE3
0xB
Доступ к регистрам OCD
Имеется всего 16 адресуемых регистров. После IR следующий DRSHIFT будет флагом RW (1 означает запись) + 4 бита адреса. Эти данные в инструкции 21 бита (5+16). Имейте в виду, что операция чтения адреса OCD должна быть предварительно захвачена.
Программирование осуществляется через те же самые 4 вывода JTAG: TCK, TMS, TDI и TDO. Только эти выводы нужны для управления/отслеживания процесса программирования через JTAG (в дополнение к выводам питания). Не требуется подавать внешнее напряжение 12V, не требуется управление сбросом и выводами тактирования (XTAL1, XTAL2). Фьюз JTAGEN должен быть запрограммирован (микроконтроллер поставляется с завода с запрограммированным битом JTAGEN), и бит JTD регистра MCUCSR должен быть очищен, чтобы был разрешен доступ к порту TAP JTAG.
Альтернативно, если бит JTD установлен, он может быть сброшен подачей внешнего сброса, тогда JTD очистится через 2 такта чипа, и выводы JTAG станут доступны для программирования. Это подразумевает, что выводы JTAG используются как обычные порты GPIO в рабочем режиме, но все еще можно воспользоваться ими для внутрисистемного программирования через JTAG. Обратите внимание, что эта техника, использующая внешний сброс для очистки JTD, не может использоваться для разрешения работы JTAG в режиме граничного сканирования (Boundary-scan) или в режиме отладки OCD). В этих случаях выводы JTAG должны быть выделены специально, и не могут использоваться как порты GPIO.
Программирование через JTAG предоставляет следующие возможности:
• Программирование и проверка FLASH (память программ). • Программирование и проверка EEPROM (энергонезависимая память данных). • Программирование и проверка фьюзов. • Программирование и проверка битов защиты (Lock bit).
Примечание: биты защиты действуют одинаково и в режиме параллельного программирования. Если биты защиты LB1 или LB2 запрограммированы, то бит OCDEN не может быть запрограммирован, кроме как через выполнение стирания чипа. Эта функция безопасности гарантирует, что не будет действовать бэкдор JTAG/ISP, позволяющий чтение всего содержимого запрограммированного устройства.
В последовательности данных младший бит (LSB) вдвигается и выдвигается первым.
Инструкции JTAG, относящиеся к программированию. Регистр инструкций (IR) имеет длину 4 бита, что дает поддержку до 16 инструкций. Ниже рассмотрены все эти инструкции.
Код операции для каждой инструкции (OPCODE) в шестнадцатеричном формате показан рядом с именем инструкции. Сопутствующий текст описывает для каждой инструкции, какой регистр данных выбирается как путь между TDI и TDO.
Состояние Run-Test/Idle контроллера TAP используется для генерации внутренних тактов. Оно также может использоваться как состояние ожидания между последовательностями операций JTAG. Ниже показана последовательность изменения машины состояний для смены слова инструкции.
Рис. 29-12. Последовательность машины состояний для изменения слова инструкции (Instruction Word, IW).
AVR_RESET (0xC). Публичная, относящаяся к AVR инструкция JTAG для перевода AVR в режим сброса, или вывода AVR из режима сброса. TAP-контроллер не сбрасывается этой инструкцией. Один бит регистра сброса (Reset Register) выбирается как регистр данных. Обратите внимание, что сброс будет активным, пока в цепочке сканирования сброса присутствует лог. 1. Вывод из этой цепочки не захватывается.
Активные состояния инструкции:
• Shift-DR: Reset Register сдвигается по тактам на выводе входе TCK.
PROG_ENABLE (0x4). Публичная, относящаяся к AVR инструкция JTAG для разрешения программирования через порт JTAG. В качестве регистра данных выбирается 16-битный регистр разрешения программирования (Programming Enable Register). Активные состояния инструкции:
• Shift-DR: сигнатура разрешения программирования вдвигается в регистр данных. • Update-DR: сигнатура разрешения программирования сравнивается правильным значением, и если введенная сигнатура корректна, то происходит вход в режим программирования.
PROG_COMMANDS (0x5). Публичная, относящаяся к AVR инструкция JTAG для ввода команд программирования через порт JTAG. Как регистр данных выбирается 15-битный регистр команд программирования (Programming Command Register). Активные состояния инструкции:
• Capture-DR: результат предыдущей команды загружается в регистр данных. • Shift-DR: регистр данных сдвигается по тактам TCK, при этом результат предыдущей команды выдвигается наружу, и при этом вдвигается новая команда. • Update-DR: команда программирования применяется для входов FLASH. • Run-Test/Idle: генерируется 1 цикл тактов, что дает выполнение выданной команды.
PROG_PAGELOAD (0x6). Публичная, относящаяся к AVR инструкция JTAG для прямой загрузки страницы данных FLASH через порт JTAG. Как регистр данных выбирается 1024-битный виртуальный регистр загрузки страницы FLASH (Virtual Flash Page Load Register). Это виртуальная цепочка сканирования, длина которой в битах равна количеству бит одной страницы памяти FLASH. Внутренний регистр сдвига имеет разрядность 8 бит. В отличие от большинства инструкций JTAG, состояние Update-DR не используется для передачи данных из регистра сдвига. Эти данные автоматически передаются байт за байтом в буфер страницы FLASH в состоянии Shift-DR внутренней машины состояний. Имеется только одно активное состояние:
• Shift-DR: данные страницы FLASH вдвигаются через TDI по тактам на входе TCK, и автоматически загружаются в страницу в страницу FLASH байт за байтом.
Примечание: инструкция PROG_PAGELOAD может использоваться только если устройство AVR находится первым в цепочке сканирования JTAG. Если AVR не первый в цепочке сканирования, то должен использоваться побайтный алгоритм программирования.
PROG_PAGEREAD (0x7). Публичная, относящаяся к AVR инструкция JTAG для чтения данных всей страницы FLASH. В качестве регистра данных используется 1032-битный виртуальный регистр чтения страницы FLASH (Virtual Flash Page Read Register). Это виртуальная цепочка сканирования, длина которой равна количеству бит страницы FLASH плюс 8. Внутренний регистр сдвига имеет разрядность 8 бит. В отличие от большинства инструкций JTAG, состояние Capture-DR не используется для передачи данных в регистр сдвига. Данные автоматически передаются из буфера страницы FLASH байт за байтом в состоянии Shift-DR внутренней машины состояний. Имеется только одно активное состояние:
• Shift-DR: данные FLASH автоматически считываются по одному байту и выдвигаются через TDO по тактам на входе TCK. Уровень на входе TDI игнорируется.
Примечание: инструкция PROG_PAGEREAD может использоваться только если устройство AVR находится первым в цепочке сканирования JTAG. Если AVR не первый в цепочке сканирования, то должен использоваться побайтный алгоритм программирования.
Регистры данных. Эти регистры данных выбираются инструкциями JTAG, описанными в предыдущей секции. Следующие регистры данных относятся к операциям программирования:
Reset Register. Это регистр данных для тестирования (Test Data Register), используемый для сброса устройства во время программирования. Это требуется для сброса устройства перед входом в режим программирования.
Лог. 1 в регистре сброса соответствует подтяжке внешнего вывода ~RESET к лог. 0, что соответствует аппаратному сбросу микроконтроллера. Устройство находится в состоянии сброса, пока лог. 1 находится в регистре сброса (этот регистр имеет размер 1 бит). В зависимости от настроек фьюзов для опций тактирования, устройство будет оставаться в состоянии сброса на время таймаута (Reset Time-Out Period, см. раздел "Clock Sources" даташита) после того, как регистр сброса будет освобожден (в нем появится лог. 0). Вывод из регистра данных не захватывается, так что сброс произойдет немедленно.
Programming Enable Register. Это 16-битный регистр, содержимое которого сравнивается с двоичным кодом 1010_0011_0111_0000. Если содержимое записанной в этот регистр сигнатуры совпадает с этим кодом, то программирование через JTAG разрешается. Этот регистр сбрасывается в 0 после сброса при включении питания (Power-on Reset), и этот регистр всегда должен быть сброшен при выходе из режима программирования.
Рис. 29-13. Programming Enable Register.
Programming Command Register. Это 15-битный регистр, используемый для вдвигания в него команд программирования, и последовательного вывода результата предыдущей команды, если он имеется. Набор инструкций программирования JTAG показан в таблице 29-17. Последовательность машины состояний при вдвигании команд иллюстрирован на рис. 29-15.
Рис. 29-14. Programming Command Register.
Таблица 29-17. JTAG Programming Instruction Set. Здесь: a = адрес старших бит, b = адрес младших бит, H = 0 - младший байт, 1 - старший байт, o = выход данных, i = вход данных, x = не имеет значения.
9a. Enter Signature Byte Read (вход в чтение байта сигнатуры)
0100011_00001000
xxxxxxx_xxxxxxxx
9b. Load Address Byte (загрузка байта адреса)
0000011_bbbbbbbb
xxxxxxx_xxxxxxxx
9c. Read Signature Byte (чтение байта сигнатуры)
0110010_00000000 0110011_00000000
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo
10a. Enter Calibration Byte Read (вход в чтение байта калибровки)
0100011_00001000
xxxxxxx_xxxxxxxx
10b. Load Address Byte (загрузка байта адреса)
0000011_bbbbbbbb
xxxxxxx_xxxxxxxx
10c. Read Calibration Byte
0110110_00000000 0110111_00000000
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo
Примечания:
(1). Эта последовательность команд не требуется, если 7 старших бит были корректно установлены последовательностью предыдущей команды (что является нормальным случаем). (2). Повторяется пока o = 1. (3). Установите биты в 0 для программирования соответствующего фьюза, 1 для отмены программирования фьюза. (4). Установите биты в 0 для программирования соответствующего бита защиты, 1 для того, чтобы оставить бит защиты не измененным. (5). 0 = бит запрограммирован, 1 = бит не запрограммирован (фьюз). (6). Карта бит для старшего байта фьюзов показана в таблице 29-3. (7). Карта бит для младшего байта фьюзов показана в таблице 29-4. (8). Карта байта бит защиты показана в таблице 29-1. (9). Адреса бит, превышающие PCMSB и EEAMSB (таблица 29-10 и таблица 29-11) не имеют значения.
Рис. 29-15. Смена состояний машины для изменения/чтения слова данных.
Virtual Flash Page Load Register. Это виртуальная цепочка сканирования, у которой длина равна количеству бит на странице памяти FLASH. Размер внутреннего регистра сдвига равен 8 битам, и данные автоматически передаются байт за байтом в буфер страницы FLASH. Последовательный ввод всех слов инструкций на страницу начинается с LSB первой инструкции на этой странице и заканчивается MSB последней инструкции на этой странице. Это предоставляет эффективный способ загрузки страницы FLASH целиком перед выполнении записи страницы (Page Write).
Рис. 29-16. Virtual Flash Page Load Register.
Virtual Flash Page Read Register. Это виртуальная цепочка сканирования, у которой длина равна количеству бит на странице памяти FLASH + 8. Размер внутреннего регистра сдвига равен 8 битам, и данные автоматически передаются байт за байтом из страницы FLASH. Первые 8 тактов используются для передачи первого байта во внутренний регистр сдвига, и биты, которые выдвигаются наружу во время этих первых 8 тактов, должны быть игнорированы. Вслед за этой инициализацией данные выдвигаются наружу начиная с LSB первой инструкции на этой странице и заканчивая MSB последней инструкции на этой странице. Это предоставляет эффективный способ чтения страницы FLASH целиком для проверки процедуры программирования.
Рис. 29-17. Virtual Flash Page Read Register.
Алгоритм программирования. Все ссылки ниже типа "1a", "1b" и так далее, относятся к таблице 29-17. Интервалы времени см. таблице 29-13 врезки "Характеристики параллельного программирования".
Вход в режим программирования:
1. Введите JTAG-инструкцию AVR_RESET, и вдвиньте 1 в Reset Register. 2. Введите инструкцию PROG_ENABLE, и вдвиньте 1010_0011_0111_0000 в Programming Enable Register.
Выход из режима программирования:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Запретите все инструкции программирования, используя инструкцию "no operation" (нет операции) 11a. 3. Введите инструкцию PROG_ENABLE, и вдвиньте 0000_0000_0000_0000 в Programming Enable Register. 4. Введите JTAG-инструкцию AVR_RESET, и вдвиньте 0 в Reset Register.
Выполнение стирания чипа (Chip Erase):
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Запустите стирание памяти микроконтроллера (chip erase), используя инструкцию программирования 1a. 3. Опрашивайте флаг завершения стирания (chip erase complete) с помощью инструкции программирования 1b, или ждите интервал времени tWLRH_CE (см. раздел "Command Byte Bit Coding" в секции "Parallel Programming Parameters, Pin Mapping, and Commands" даташита).
Программирование памяти FLASH. Перед программированием FLASH должна быть выполнена операция Chip Erase.
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите запись Flash, используя инструкцию программирования 2a. 3. Загрузите старший байт адреса, используя инструкцию программирования 2b. 4. Загрузите младший байт адреса, используя инструкцию программирования 2c. 5. Загрузите данные, используя инструкции программирования 2d, 2e и 2f. 6. Повторите шаги 4 и 5 для всех слов инструкций на этой странице. 7. Запишите эту страницу, используя инструкцию программирования 2g. 8. Опросите флаг завершения записи (Flash write complete), используя инструкцию программирования 2h, или ждите интервал времени tWLRH (см. таблицу 29-13, VCC = 5V ±10%). 9. Повторите шаги 3..7, пока не будут запрограммированы все данные.
Более эффективную передачу данных можно реализовать с инструкцией PROG_PAGELOAD:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите запись FLASH, используя инструкцию программирования 2a. 3. Загрузите адрес страницы, используя инструкции программирования 2b и 2c. PCWORD (см. таблицу 29-10) используется для адреса в пределах одной страницы, и туда должен быть записан 0. 4. Введите JTAG-инструкцию PROG_PAGELOAD. 5. Загрузите всю страницу целиком, вдвигая все слова инструкций на странице, начиная с LSB первой инструкции на этой странице и заканчивая MSB последней инструкцией на этой странице. 6. Введите JTAG-инструкцию PROG_COMMANDS. 7. Запишите страницу, используя инструкцию программирования 2g. 8. Опрашивайте флаг завершения программирования (Flash write complete), используя инструкцию программирования 2h, или ждите время tWLRH (см. таблицу 29-13, VCC = 5V ±10%). 9. Повторяйте шаги 3..8, пока не будут запрограммированы все данные.
Чтение FLASH:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите чтение FLASH, используя инструкцию программирования 3a. 3. Загрузите адрес, используя инструкции программирования 3b и 3c. 4. Прочитайте данные, используя инструкцию программирования 3d. 5. Повторите шаги 3 и 4, пока не будут прочитаны все данные.
Более эффективную передачу данных можно реализовать с инструкцией PROG_PAGEREAD:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите чтение FLASH, используя инструкцию программирования 3a. 3. Загрузите адрес страницы, используя инструкции программирования 3b и 3c. PCWORD (см. таблицу Command Byte Bit Coding в секции Parallel Programming Parameters, Pin Mapping, and Commands) используется для адреса в пределах одной страницы, и туда должен быть записан 0. 4. Введите JTAG-инструкцию PROG_PAGEREAD. 5. Прочитайте всю страницу целиком, выдвигая все слова инструкции страницы, начиная с LSB первой инструкции этой страницы и заканчивая MSB последней инструкции этой страницы. Помните, что первые выдвинутые 8 бит должны быть проигнорированы. 6. Введите JTAG-инструкцию PROG_COMMANDS. 7. Повторите шаги 3..6, пока не прочитаете все данные.
Программирование EEPROM. Перед программированием EEPROM необходимо выполнить Chip Erase.
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите запись EEPROM, используя инструкцию программирования 4a. 3. Загрузите старший байт адреса, используя инструкцию программирования 4b. 4. Загрузите младший байт адреса, используя инструкцию программирования 4c. 5. Загрузите данные, используя инструкции программирования 4d и 4e. 6. Повторите шаги 4 и 5 для все байт данных на этой странице. 7. Запишите данные, используя инструкцию программирования 4f. 8. Опрашивайте флаг завершения записи (EEPROM write complete), используя инструкцию программирования 4g, или ждите время tWLRH (см. таблицу 29-13, VCC = 5V ±10%). 9. Повторите шаги 3..8, пока не будут запрограммированы все данные.
Обратите внимание, что для программирования EEPROM нельзя использовать инструкцию PROG_PAGELOAD.
Чтение EEPROM:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите чтение EEPROM, используя инструкцию программирования 5a. 3. Загрузите адрес, используя инструкции программирования 5b и 5c. 4. Прочитайте данные, используя инструкцию программирования 5d. 5. Повторите шаги 3 и 4, пока все данные не будут прочитаны.
Обратите внимание, что для чтения EEPROM нельзя использовать инструкцию PROG_PAGEREAD.
Программирование фьюзов:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите запись фьюзов, используя инструкцию программирования 6a. 3. Загрузите старший байт фьюзов, используя инструкцию программированияs 6b. Значение бита 0 в этом байте запрограммирует соответствующий фьюз, значение 1 сделает фьюз не запрограммированным. 4. Запишите старший байт фьюзов, используя инструкцию программирования 6c. 5. Опрашивайте флаг завершения программирования (Fuse write complete), используя инструкцию программирования 6d, или ждите время tWLRH (см. таблицу 29-13, VCC = 5V ±10%). 6. Загрузите младший байт фьюзов, используя инструкцию программированияs 6e. Значение бита 0 в этом байте запрограммирует соответствующий фьюз, значение 1 сделает фьюз не запрограммированным. 7. Запишите младший байт фьюзов, используя инструкцию программирования 6f. 8. Опрашивайте флаг завершения программирования (Fuse write complete), используя инструкцию программирования 6g, или ждите время tWLRH (см. таблицу 29-13, VCC = 5V ±10%).
Программирование битов защиты:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Запись битов защиты, используя инструкцию программирования 7a. 3. Загрузите данные, используя инструкцию программированияs 7b. Значение бита 0 в этом байте запрограммирует соответствующий бит защиты, значение 1 оставит бит не измененным. 4. Запишите биты защиты, используя инструкцию программирования 7c. 5. Опрашивайте флаг завершения записи (Lock bit write complete), используя инструкцию программирования 7d, или ждите время tWLRH (см. таблицу 29-13, VCC = 5V ±10%).
Чтение фьюзов и битов защиты:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите чтение бит фьюзов/зашиты, используя инструкцию программирования 8a. 3a. Для чтения всех фьюзов и бит защиты используйте инструкцию программирования 8e. 3b. Для чтения только старшего байта фьюзов, используйте инструкцию программирования 8b. 3c. Для чтения только младшего байта фьюзов, используйте инструкцию программирования 8c. 3d. Для чтения только байта битов защиты, используйте инструкцию программирования 8d.
Чтение байт сигнатуры:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите чтение бита сигнатуры, используя инструкцию программирования 9a. 3. Загрузите адрес 0x00, используя инструкцию программирования 9b. 4. Прочитайте первый байт сигнатуры, инструкцию программирования 9c. 5. Повторите шаги 3 и 4 с адресами 0x01 и 0x02 для чтения второго и третьего байта сигнатуры соответственно.
Чтение байта калибровки:
1. Введите JTAG-инструкцию PROG_COMMANDS. 2. Разрешите чтение байта калибровки, используя инструкцию программирования 10a. 3. Загрузите адрес 0x00, используя инструкцию программирования 10b. 4. Прочитайте байт калибровки, используя инструкцию программирования 10c.
Рис. 29-7. Интервалы времени параллельного программирования, включая некоторые основные требования к интервалам времени.
Рис. 29-8. Интервалы времени параллельного программирования, последовательность загрузки с требованиями времени(1).
Примечание (1): требования к интервалам времени, показанные на первом рисунке в этой врезке (например, tDVXH, tXHXL и tXLDX) также относятся к операции загрузки.
Рис. 29-9. Интервалы времени параллельного программирования, последовательность чтения (в пределах одной страницы) с требованиями к интервалам времени(2).
Примечание (2): требования к интервалам времени, показанные на первом рисунке в этой врезке (например tDVXH, tXHXL и tXLDX) также относятся к операции чтения.
Таблица 29-13. Характеристики параллельного программирования, VCC = 5V ± 10%.
Символ
Параметр
MIN
Typ.
MAX
Ед.
VPP
Programming Enable Voltage (напряжение разрешения программирования)
11.5
12.5
V
IPP
Programming Enable Current (ток разрешения программирования)
250
мкА
tDVXH
Data and Control Valid before XTAL1 High (допустимые уровни данных и управления до XTAL1 в состоянии лог. 1)
67
нс
tXLXH
XTAL1 Low to XTAL1 High (интервал между уровнями лог. 0 и лог. 1 сигнала XTAL1)
200
нс
tXHXL
XTAL1 Pulse Width High (ширина импульса лог. 1 сигнала XTAL1)
150
нс
tXLDX
Data and Control Hold after XTAL1 Low (время удержания данных и управления после лог. 0 сигнала XTAL1)
67
нс
tXLWL
XTAL1 Low to ~WR Low (время между лог. 0 на XTAL1 до лог. 0 на ~WR)
0
нс
tXLPH
XTAL1 Low to PAGEL high (время между лог. 0 на XTAL1 и лог. 1 на PAGEL)
0
нс
tPLXH
PAGEL low to XTAL1 high (время между лог. 0 PAGEL и лог. 1 на XTAL1)
150
нс
tBVPH
BS1 Valid before PAGEL High (достоверность BS1 перед лог. 1 на PAGEL)
67
нс
tPHPL
PAGEL Pulse Width High (длительность импульса лог. 1 сигнала PAGEL)
150
нс
tPLBX
BS1 Hold after PAGEL Low (удержание BS1 после PAGEL в лог. 0)
67
нс
tWLBX
BS2/1 Hold after ~WR Low (удержание BS2/1 после ~WR в лог. 0)
67
нс
tPLWL
PAGEL Low to ~WR Low (время между лог. 0 PAGEL до ~WR лог. 0)
67
нс
tBVWL
BS1 Valid to ~WR Low (достоверность BS1 до ~WR в лог. 0)
В этом примере описана работа в среде операционной системы Windows, JTAG-адаптер на основе FT2232H Board [7] подключен к плате AVR-USB-MEGA16, на которую установлен ATmega32A [4]. Управление осуществляется с помощью открытого программного обеспечения UrJTAG [6].
1. Скачайте с сайта Atmel пакет BSDL-файлов (подробнее см. [6]).
2. С помощью кабеля из 5 проводов подключите JTAG тестируемого микроконтроллера ATmega32A к контактам разъема адаптера JTAG.
Сигнал
FT2232H Board, коннектор JP3
AVR-USB-MEGA16, коннектор U3 JTAG
GND
4 (GND)
2 или 10
TCK
6 (AD0) выход
1 вход
TDI
7 (AD1) выход
9 вход
TDO
8 (AD2) вход
3 выход
TMS
9 (AD3) выход
5 вход
Подключите адаптер JTAG к компьютеру, подайте питание на тестируемый микроконтроллер.
3. Запустите jtag.exe, выполните команду подключения к адаптеру JTAG:
jtag> cable FT2232 vid=0403 pid=6010
Connected to libftd2xx driver.
jtag>
4. Распакуйте содержимое архива в произвольную папку на диске. Главное требование - файлы BSDL (*.bsd) должны находиться в папке, путь до которой не содержит пробелов (UrJTAG пока что не поддерживает пути с пробелами, по крайней мере в команде bsdl path). Предположим, что файлы распакованы и находятся в папке c:\temp\megaAVR_BSDL.
Теперь эту папку можно добавить командой bsdl path, и UrJTAG будет просматривать её в поиске описаний микросхем, когда будет введена команда detect.
c:\Program Files\UrJTAG>dir c:\temp\megaAVR_BSDL
Том в устройстве C не имеет метки.
Серийный номер тома: 7CCB-BDB0
В этом списке файлов есть файл atmega32.bsd (выделен в списке жирным шрифтом), который, к сожалению, не подходит для ATmega32A, потому что атрибут IDCODE_REGISTER в файле не совпадает с атрибутом, который будет прочитан из микросхемы через JTAG:
jtag> bsdl path c:\temp\megaAVR_BSDL
jtag> detect
IR length: 4
Chain length: 1
Device Id: 10001001010100000010000000111111 (0x000000008950203F)
Manufacturer: Atmel
Unknown part!
chain.c(149) Part 0 without active instruction
chain.c(200) Part 0 without active instruction
chain.c(149) Part 0 without active instruction
jtag>
Сообщение "Unknown part!" говорит о том, что среди всех BSDL-файлов, которые были просмотрены, не было найдено ни одно описание микросхемы, который содержит идентификатор, совпадающий с прочитанным через JTAG (выделен жирным шрифтом). Однако это легко исправить, если изменить атрибут IDCODE_REGISTER в файле atmega32.bsd.
5. Сделайте копию файла atmega32.bsd под новым именем atmega32a.bsd.
6. Откройте файл atmega32a.bsd, найдите в нем атрибут IDCODE_REGISTER.
attribute IDCODE_REGISTER of ATmega32 : entity is
"0101" &
"1001010100000010" &
"00000011111" &
"1" ;
Этот IDCODE почти полностью совпадает с кодом, прочитанным из ATmega32A, кроме первых 4 бит (выделены). Исправьте их на 1000:
attribute IDCODE_REGISTER of ATmega32 : entity is
"1000" &
"1001010100000010" &
"00000011111" &
"1" ;
7. Теперь микроконтроллер ATmega32A будет распознаваться командой detect:
8. На макетной плате AVR-USB-MEGA16 к ножке микроконтроллера PB0 подключен светодиод. Следующие команды переведут ножку PB0 в режим выхода с лог. 1 на выходе. Светодиод загорится:
jtag> instruction EXTEST
jtag> shift IR
jtag> set signal PB(0) out 1
jtag> shift DR jtag>
Теперь выведем на ножку PB0 уровень лог. 0, светодиод погаснет: