Программирование AVR JTAG микроконтроллера ATmega32 Thu, March 28 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

JTAG микроконтроллера ATmega32 Печать
Добавил(а) microsin   

В микроконтроллер ATmega32 встроен интерфейс JTAG (совместимый со стандартом IEEE std. 1149.1). Этот интерфейс может быть использован для тестирования схем (технология граничного сканирования JTAG Boundary-Scan), программирования внутренней памяти микроконтроллера (память программ FLASH, энергонезависимая память EEPROM, фьюзы, биты защиты) и для отладки программ.

Отладчик имеет доступ к следующим внутренним ресурсам микроконтроллера:

• Все периферийные устройства.
• Оперативная память, 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 вошел в состояние сдвига данных наружу.

JTAG ATmega32 pins

Широко используемая цоколевка ATmel JTAG, совместимая с Altera JTAG, AVR Dragon, JTAGICE mkII и другими JTAG-адаптерами/отладчиками.

1 TCK GND 2
3 TDO VREF 4
5 TMS nSRST 6
7 - nTRST 8
9 TDI GND 10

Интерфейс JTAG на макетной плате AVR-USB-MEGA16:

JTAG AVR USB MEGA16 common top view

JTAG avr usb mega16 sch

Если встроенная в кристалл микроконтроллера система отладки (OCD) разрешена фьюзом OCDEN (по умолчанию, в заводском состоянии этот фьюз разрешает отладку), и микроконтроллер вошел в режим Power down (выключено) или Power save sleep (режим сна для экономии энергопотребления), то основной источник тактовой частоты остается разрешенным. В этих режимах сна это приведен к значительному общему потреблению тока. Есть три способа избежать этого:

• Запретить отладку фьюзом OCDEN Fuse.
• Запретить интерфейс JTAG фьюзом JTAGEN.
• Записать лог. 1 в бит JTD регистра MCUCSR.

Вывод 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.

JTAG ATmega32 Reset Logic fig14 1

Рис 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 при этом не сбрасывается).

COUNTER RESET сброс счетчиков таймаута.

TIMEOUT сигнал истечения таймаута сторожевого таймера.

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, чтобы сбросить всю систему, что подразумевается использовании в схеме сигнала сброса приложения только открытых коллекторов (стоков).

JTAG ATmega32 Block Diagram fig27 1

Рис. 27-1. Блок-диаграмма JTAG ATmega32.

TAP-контроллер имеет стандартную машину с 16 состояниями, которая управляет работой схемы граничного сканирования (Boundary-scan), схемы программирования JTAG, или системой OCD. Переходы между состояниями, показанные на рис. 27-2, зависят от сигнала, присутствующего на TMS (показан сигнал, соседствующий с каждым переходом состояния) в момент нарастания уровня (положительного перепада) тактов TCK. Начальное состояние после сброса при включении питания - Test-Logic-Reset.

Как определено стандартом, LSB вдвигается и выдвигается первым для всех регистров сдвига.

JTAG ATmega32 TAP Controller State Diagram fig27 2

Рис. 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.

[Использование граничного сканирования (Boundary-scan)]

Основные возможности:

• Интерфейс 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 (регистр пропуска данных).
• Device Identification Register (регистр идентификации).
• Reset Register (регистр сброса).
• Boundary-scan Chain (цепочка граничного сканирования).

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 не захватывается, так что сброс войдет в силу немедленно, как показано на рисунке ниже.

JTAG ATmega32 Reset Register fig27 4

Рис. 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, делают возможным чтение актуального значения уровня логики на выводе чипа. Для аналоговой функции здесь есть прямое подключение от внешнего вывода до аналоговой схемы, и цепочка сканирования вставляется в интерфейс между цифровой логикой и аналоговой схемой.

JTAG ATmega32 Boundary scan Cell for bidirectional Port Pin with Pull Up fig27 5

Рис. 27-5. Ячейка граничного сканирования (Boundary-scan Cell) для двунаправленного вывода порта с функцией подключаемого верхнего подтягивающего резистора (Pull-Up).

JTAG ATmega32 General Port Pin sch fig27 6

Рис. 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.

JTAG ATmega32 Additional Scan Signal for TWI fig27 7

Рис. 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).

JTAG ATmega32 Observe only Cell fig27 8

Рис. 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-генератора не сканируется, потому что у этого генератора нет внешних выводов на корпусе микроконтроллера.

JTAG ATmega32 Boundary scan Cells for Oscillators and Clock Options fig27 9

Рис. 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.

JTAG ATmega32 Analog Comparator fig27 10

Рис. 27-10. Аналоговый компаратор.

JTAG ATmega32 General Boundary scan Cell for Comparator and ADC fig27 11

Рис. 27-11. Основная ячейка сканирования, используемая для сигналов компаратора и АЦП.

Таблица 27-4. Сигналы граничного сканирования для аналогового компаратора.

Имя сигнала Направление с точки зрения компаратора Описание Рекомендуемый вход, когда не используется Выходные значения, когда используется рекомендованный вход
AC_IDLE Вход Когда true, аналоговый компаратор выключается 1 Зависит от выполняемого кода микроконтроллера
ACO Выход Выход аналогового компаратора Станет входом для выполняемого кода микроконтроллера 0
ACME Вход Когда true, использует выходной сигнал от мультиплексора ADC 0 Зависит от выполняемого кода микроконтроллера
ACBG Вход Разрешение опорного напряжения Bandgap 0 Зависит от выполняемого кода микроконтроллера

На рис. ниже показана блок-схема АЦП со всеми соответствующими сигналами управления и анализа состояния. Ячейка граничного сканирования, показанная на рис. 27-8, подключена к каждому из этих сигналов. ADC не нужно использовать для полного теста соединений, поскольку аналоговые входы совмещены с выводами цифровых портов (GPIO).

JTAG ATmega32 Analog Digital Converter fig27 12

Рис. 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 снаружи чипа микроконтроллера.

Нижний предел:  1024 • 1.5V • 0.95/5V = 291 = 0x123
Верхний предел: 1024 • 1.5V • 1.05/5V = 323 = 0x143

Рекомендуемые значения из таблицы 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 должна быть предварительно захвачена.

Register 0 PSB0
Register 1 PSB1
Register 2 PDMSB
Register 3 PDSB

Register 8 Break Control Register (BCR)

Бит RW Описание
D15 rw 1=разрешение работы таймеров во время Break
D14 rw 1=после Break счетчик PC читается как +4, не +2 ?
D13 rw 1=Break по ветвлению ?! 
D12 rw 1=Разрешение PSB0
D11 rw 1=Разрешение PSB1
D10 rw 1=Разрешение PDMSB как одной точки останова
D9 rw 1=Разрешение маски в сравнении точки останова
D8 rw 1=
D7 rw 1=*
D6 rw 1=
D5 rw 1=
D4 rw 1=*
D3 rw 1=*
D2 rw 1=
D1-0 rw (читаются как 0)

Примечание *: когда установлены D7, D4, D3, то PDSB разрешен Program Break.

Register 9 - Break Status Register (BSR)

Бит RW Описание
D15-D8 r
D7 r 1=Break при ветвлении
D6 r 1=Break на PSB0 (Reg0)
D5 r 1=Break на PSB1 (Reg1)
D4 r 1=Break на PDMSB (Reg2 как одна точка останова)
D3 r 1=Break на PDSB (Reg3)
D2 r 1=Break on ? (has been seen)
D1 r 1=Break, принудительно заданный OCD (инструкция 8)
D0 r 1=Break по инструкции AVR Break (0x9598)

Register C - OCDR Readback

Бит RW Описание
D15-D8 rw OCDR 7..0
D7-D0 r не используется (читается как 0)

Register D - Control and Status Register

Бит RW Описание
D15 rw 1=разрешить OCDR
D14 rw 1=?
D13-D5 r
D4 r 1=OCDR записан AVR и не прочитан OCD
D3 r 1=сброс не активен
D2 r 1=сброс не активен
D1-D0 r

[Программирование через JTAG]

Программирование осуществляется через те же самые 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. Ниже показана последовательность изменения машины состояний для смены слова инструкции.

JTAG ATmega32 State Machine Sequence for Changing Instruction Word fig29 12

Рис. 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 (регистр сброса).
• Programming Enable Register (регистр разрешения программирования).
• Programming Command Register (регистр команд программирования).
• Virtual Flash Page Load Register (виртуальный регистр загрузки страницы FLASH).
• Virtual Flash Page Read Register (виртуальный регистр чтения страницы FLASH).

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), и этот регистр всегда должен быть сброшен при выходе из режима программирования.

JTAG ATmega32 Programming Enable Register fig29 13

Рис. 29-13. Programming Enable Register.

Programming Command Register. Это 15-битный регистр, используемый для вдвигания в него команд программирования, и последовательного вывода результата предыдущей команды, если он имеется. Набор инструкций программирования JTAG показан в таблице 29-17. Последовательность машины состояний при вдвигании команд иллюстрирован на рис. 29-15.

JTAG ATmega32 Programming Command Register fig29 14

Рис. 29-14. Programming Command Register.

Таблица 29-17. JTAG Programming Instruction Set. Здесь: a = адрес старших бит, b = адрес младших бит, H = 0 - младший байт, 1 - старший байт, o = выход данных, i = вход данных, x = не имеет значения.

Инструкция Последовательность TDI Последовательность TDO Прим.
1a. Chip erase (очистка чипа) 0100011_10000000
0110001_10000000
0110011_10000000
0110011_10000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
 
1b. Опрос для определения завершения очистки чипа 0110011_10000000 xxxxxox_xxxxxxxx (2)
2a. Enter Flash Write (вход в запись FLASH) 0100011_00010000 xxxxxxx_xxxxxxxx  
2b. Load Address High Byte (загрузка старшего байта адреса) 0000111_aaaaaaaa xxxxxxx_xxxxxxxx (9)
2c. Load Address Low Byte (загрузка младшего байта адреса) 0000011_bbbbbbbb xxxxxxx_xxxxxxxx  
2d. Load Data Low Byte (загрузка младшего байта данных) 0010011_iiiiiiii xxxxxxx_xxxxxxxx  
2e. Load Data High Byte (загрузка старшего байта данных) 0010111_iiiiiiii xxxxxxx_xxxxxxxx  
2f. Latch Data (захват данных) 0110111_00000000
1110111_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
2g. Write Flash Page (запись страницы FLASH) 0110111_00000000
0110101_00000000
0110111_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
2h. Опрос для определения завершения записи страницы 0110111_00000000 xxxxxox_xxxxxxxx (2)
3a. Enter Flash Read (вход в чтение FLASH) 0100011_00000010 xxxxxxx_xxxxxxxx  
3b. Load Address High Byte (загрузка старшего байта адреса) 0000111_aaaaaaaa xxxxxxx_xxxxxxxx (9)
3c. Load Address Low Byte (загрузка младшего байта адреса) 0000011_bbbbbbbb xxxxxxx_xxxxxxxx  
3d. Read Data Low and High Byte (чтение младшего и старшего байта данных) 0110010_00000000
0110110_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
xxxxxxx_oooooooo
младший байт
старший байт
4a. Enter EEPROM Write (вход в запись EEPROM) 0100011_00010001 xxxxxxx_xxxxxxxx  
4b. Load Address High Byte (загрузка старшего байта адреса) 0000111_aaaaaaaa xxxxxxx_xxxxxxxx (9)
4c. Load Address Low Byte (загрузка младшего байта адреса) 0000011_bbbbbbbb xxxxxxx_xxxxxxxx  
4d. Load Data Byte (загрузка байта данных) 0010011_iiiiiiii xxxxxxx_xxxxxxxx  
4e. Latch Data (захват данных) 0110111_00000000
1110111_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
4f. Write EEPROM Page (запись страницы EEPROM) 0110011_00000000
0110001_00000000
0110011_00000000
0110011_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
4g. Poll for Page Write complete (опрос завершения записи страницы) 0110011_00000000 xxxxxox_xxxxxxxx (2)
5a. Enter EEPROM Read (вход в чтение EEPROM) 0100011_00000011 xxxxxxx_xxxxxxxx  
5b. Load Address High Byte (загрузка старшего байта адреса) 0000111_aaaaaaaa xxxxxxx_xxxxxxxx (9)
5c. Load Address Low Byte (загрузка младшего байта адреса) 0000011_bbbbbbbb xxxxxxx_xxxxxxxx  
5d. Read Data Byte (чтение байта данных) 0110011_bbbbbbbb
0110010_00000000
0110011_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
 
6a. Enter Fuse Write (вход в запись фьюзов) 0100011_01000000 xxxxxxx_xxxxxxxx  
6b. Load Data Low Byte (загрузка младшего байта данных)(6) 0010011_iiiiiiii xxxxxxx_xxxxxxxx (3)
6c. Write Fuse High byte (запись старшего байта фьюзов) 0110111_00000000
0110101_00000000
0110111_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
6d. Poll for Fuse Write complete (опрос на завершение записи фьюза) 0110111_00000000 xxxxxox_xxxxxxxx (2)
6e. Load Data Low Byte (загрузка младшего байта данных)(7) 0010011_iiiiiiii xxxxxxx_xxxxxxxx (3)
6f. Write Fuse Low byte (запись младшего байта фьюза) 0110011_00000000
0110001_00000000
0110011_00000000
0110011_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
6g. Poll for Fuse Write complete (опрос на завершение записи фьюза) 0110011_00000000 xxxxxox_xxxxxxxx (2)
7a. Enter Lock bit Write (вход в запись бит блокировки) 0100011_00100000 xxxxxxx_xxxxxxxx  
7b. Load Data Byte (загрузка байта данных)(9) 0010011_11iiiiii xxxxxxx_xxxxxxxx (4)
7c. Write Lock bits (запись битов блокировки) 0110011_00000000
0110001_00000000
0110011_00000000
0110011_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
(1)
7d. Poll for Lock bit Write complete (опрос на завершение записи бит блокировки) 0110011_00000000 xxxxxox_xxxxxxxx (2)
8a. Enter Fuse/Lock bit Read 0100011_00000100 xxxxxxx_xxxxxxxx  
8b. Read Fuse High Byte (запись старшего байта фьюзов)(7) 0111110_00000000
0111111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
 
8c. Read Fuse Low Byte (чтение младшего байта фьюзов)(8) 0110010_00000000
0110011_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
 
8d. Read Lock bits (чтение бит блокировки)(9) 0110110_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_xxoooooo
(5)
8e. Read Fuses and Lock bits (чтение фьюзов и бит блокировки) 0111010_00000000
0111110_00000000
0110010_00000000
0110110_00000000
0110111_00000000
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
xxxxxxx_oooooooo
xxxxxxx_oooooooo
xxxxxxx_oooooooo
(5)
fuse ext. byte
fuse high byte
fuse low byte
lock bits
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) не имеют значения.

JTAG ATmega32 State Machine Sequence for Changing Reading Data Word fig29 15

Рис. 29-15. Смена состояний машины для изменения/чтения слова данных.

Virtual Flash Page Load Register. Это виртуальная цепочка сканирования, у которой длина равна количеству бит на странице памяти FLASH. Размер внутреннего регистра сдвига равен 8 битам, и данные автоматически передаются байт за байтом в буфер страницы FLASH. Последовательный ввод всех слов инструкций на страницу начинается с LSB первой инструкции на этой странице и заканчивается MSB последней инструкции на этой странице. Это предоставляет эффективный способ загрузки страницы FLASH целиком перед выполнении записи страницы (Page Write).

JTAG ATmega32 Virtual Flash Page Load Read Register fig29 16 17

Рис. 29-16. Virtual Flash Page Load Register.

Virtual Flash Page Read Register. Это виртуальная цепочка сканирования, у которой длина равна количеству бит на странице памяти FLASH + 8. Размер внутреннего регистра сдвига равен 8 битам, и данные автоматически передаются байт за байтом из страницы FLASH. Первые 8 тактов используются для передачи первого байта во внутренний регистр сдвига, и биты, которые выдвигаются наружу во время этих первых 8 тактов, должны быть игнорированы. Вслед за этой инициализацией данные выдвигаются наружу начиная с LSB первой инструкции на этой странице и заканчивая MSB последней инструкции на этой странице. Это предоставляет эффективный способ чтения страницы FLASH целиком для проверки процедуры программирования.

JTAG ATmega32 Virtual Flash Page Load Read Register fig29 16 17

Рис. 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.

JTAG ATmega32 Parallel Programming Timing Including some General Timing Requirements fig29 7

Рис. 29-7. Интервалы времени параллельного программирования, включая некоторые основные требования к интервалам времени.

JTAG ATmega32 Parallel Programming Timing Loading Sequence with Timing Requirements fig29 8

Рис. 29-8. Интервалы времени параллельного программирования, последовательность загрузки с требованиями времени(1).

Примечание (1): требования к интервалам времени, показанные на первом рисунке в этой врезке (например, tDVXH, tXHXL и tXLDX) также относятся к операции загрузки.

JTAG ATmega32 Parallel Programming Timing Reading Sequence within same Page with Timing fig29 9

Рис. 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) 67     нс
tWLWH ~WR Pulse Width Low (длительность импульса лог. 0 ~WR) 150     нс
tWLRL ~WR Low to RDY/~BSY Low (интервал между ~WR лог. 0 и лог. 0 RDY/~BSY) 0   1 мкс
tWLRH ~WR Low to RDY/~BSY High (интервал между ~WR лог. 0 и лог. 1 RDY/~BSY)(1) 3.7   4.5 мс
tWLRH_CE ~WR Low to RDY/~BSY High for Chip Erase (время между ~WR лог. 0 до RDY/~BSY лог. 1 для очистки чипа)(2) 7.5   9 мс
tXLOL XTAL1 Low to ~OE Low (время между XTAL1 лог. 0 и ~OE лог. 0) 0     нс
tBVDV BS1 Valid to DATA valid (интервал между допустимым уровнем BS1 до достоверных данных) 0   250 нс
tOLDV ~OE Low to DATA Valid (интервал между ~OE до достоверных данных)     250 нс
tOHDZ ~OE High to DATA Tri-stated (интервал между ~OE в лог. 1 и третьим состоянием данных)     250 нс

Примечание:

1. tWLRH допустимо для команд записи FLASH, записи EEPROM, записи бит фьюзов и записи бит защиты.
2. tWLRH_CE допустимо для команды Chip Erase.

В этом примере описана работа в среде операционной системы 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 вход

UrJTAG test AVR USB MEGA16

Подключите адаптер JTAG к компьютеру, подайте питание на тестируемый микроконтроллер.

UrJTAG with AVR USB MEGA16

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
 
 Содержимое папки c:\temp\megaAVR_BSDL
 
04.02.2017  09:18  < DIR >          .
04.02.2017  09:18  < DIR >          ..
21.08.2012  11:54            34 596 AT90CAN128.BSD
21.08.2012  11:54            34 578 AT90CAN32.BSD
21.08.2012  11:54            34 578 AT90CAN64.BSD
16.08.2012  07:18            13 965 AT90USB1286.bsdl
16.08.2012  07:18            15 143 AT90USB1287.bsdl
16.08.2012  07:18            13 974 AT90USB646.bsdl
16.08.2012  07:18            15 129 AT90USB647.bsdl
21.08.2012  11:54            17 846 ATMEGA128.BSD
21.08.2012  11:54            13 194 ATMEGA1280.BSD
21.08.2012  11:54            10 971 ATMEGA1281.BSD
21.08.2012  11:54            14 941 ATMEGA16.BSD
21.08.2012  11:54            12 675 ATMEGA162.BSD
21.08.2012  11:54             9 331 ATMEGA164P.BSD
21.08.2012  11:54            16 405 ATMEGA165.BSD
21.08.2012  11:54            16 419 ATMEGA165P.BSD
21.08.2012  11:54            16 417 ATMEGA169.BSD
21.08.2012  11:54            12 812 ATMEGA2560.BSD
21.08.2012  11:54            10 583 ATMEGA2561.BSD
21.08.2012  11:54            12 165 atmega32.bsd
21.08.2012  11:54            11 694 atmega323.bsd
21.08.2012  11:54             9 331 ATMEGA324P.BSD
21.08.2012  11:54            16 405 ATMEGA325.BSD
21.08.2012  11:54            19 173 ATMEGA3250.BSD
21.08.2012  11:54            16 803 ATMEGA325P.BSD
21.08.2012  11:54            16 417 ATMEGA329.BSD
21.08.2012  11:54            19 278 ATMEGA3290.BSD
21.08.2012  11:54            14 855 atmega64.bsd
21.08.2012  11:54            13 180 ATMEGA640.BSD
21.08.2012  11:54             9 331 ATMEGA644P.BSD
21.08.2012  11:54            16 405 ATMEGA645.BSD
21.08.2012  11:54            19 173 ATMEGA6450.BSD
21.08.2012  11:54            16 417 ATMEGA649.BSD
21.08.2012  11:54            19 278 ATMEGA6490.BSD
16.08.2012  07:18            12 402 USB16U4.bsdl
              35 файлов        568 029 байт
               2 папок  458 596 229 120 байт свободно

В этом списке файлов есть файл 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:

jtag> detect
IR length: 4
Chain length: 1
Device Id: 10001001010100000010000000111111 (0x000000008950203F)
  Filename:     c:\temp\megaAVR_BSDL/atmega32a.bsd
jtag>

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, светодиод погаснет:

jtag> set signal PB(0) out 0
jtag> shift DR
jtag>

[Словарик]

ADC Analog-Digital Converter, аналого-цифровой преобразователь, АЦП.

Boundary-scan дословно "граничное сканирование". Специальная технология, предназначенная для проверки качества сборки печатных плат, содержащих сложные интегрированные устройства (микросхемы).

CPU Central Processor Unit, в данном контексте означает вычислительное ядро микроконтроллера.

DAC Digital-Analog Converter, цифро-аналоговый преобразователь, ЦАП.

LSB Least Significant Bit, самый младший по значимости бит.

MCU MicroController Unit, обычно имеется в виду аппаратура ядра микроконтроллера.

MSB Most Significant Bit, самый старший по значимости бит.

OCD On-Chip Debug, система отладки, встроенная в кристалл микроконтроллера.

RTC Real-Time Clock, часы реального времени.

TAP Test Access Port, порт для доступа к тестированию.

АЦП аналого-цифровой преобразователь. То же самое, что и ADC.

[Ссылки]

1. 8-Bit AVR Microcontroller ATmega32A DATASHEET COMPLETE site:atmel.com.
2. AVR BSDL files site:atmel.com.
3. Цоколевка интерфейсов JTAG.
4. Макетная плата AVR-USB-MEGA16.
5. OpenOCD: руководство пользователя.
6. UrJTAG: бесплатный инструментарий JTAG.
7FT2232H Board - макетная плата на высокоскоростном чипе моста USB фирмы FTDI.
8. AVR JTAG OCD (Private) Commands site:nongnu.askapache.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page