Tck tms tdi tdo: Интерфейс JTAG? — Это очень просто / Хабр

Содержание

Интерфейс JTAG? — Это очень просто / Хабр

Многие знакомы со словом «JTAG», но знакомство это скорее всего поверхностное. В этой статье я хочу перевести Вас на новый уровень, так сказать «во френдзону». Возможно, для многих я не открою ничего нового, но надеюсь тем, кто давно хотел ознакомиться, будет интересно почитать. Итак, от винта.
Введение

В 1985 сформировалась группа производителей электроники — JTAG (Joint Test Action Group). Для решения проблем тестирования в 1990 был выдвинут промышленный стандарт — спецификация IEEE Std 1149.1-1990 (IEEE Standard Test Access Port and Boundary-Scan Architecture). В этом же году Intel вывел в свет первый процессор с JTAG — 80486. С тех пор стандарт постоянно модифицируется и, в данный момент, последняя версия датируется 2013 годом.
«А какие же это проблемы с тестированием?»,- спросите Вы. Ну как же! Мало удовольствия прыгать с осциллографом по выводам микросхемы, особенно если их много больше двух! Стандарт позволяет значительно упростить жизнь за счет встраивания специальной архитектуры в современные чипы, обеспечивающей доступ к выводам (точнее, к специальным блокам ввода-вывода) с помощью 4-х проводного последовательного интерфейса. Эта архитектура позволяет не только контролировать их состояние, но и управлять ими. Таким образом можно обойтись без громоздких пробников с физическим контактом и насладиться всей прелестью этапа отладки цифровых микросхем или устройств уровня печатной платы.

Стандарт используют как для целей внутрисхемного программирования и отладки программ, так и при работе с корпусированными микросхемами. Он же используется для проверки на качество припайки микросхем к плате, межплатного и внутристоечного монтажа плат и блоков. Также надо сказать ему спасибо за восстановление закирпиченных по неосторожности мобильных устройств.

И как же работает?

Механизм граничного сканирования заключен, всего лишь, в сдвиговом регистре (Boundary Scan), подключенном между выводами микросхемы и ядром, и мультиплексоре который подключает в нужный момент этот регистр. Каждому конкретному выводу соответствуют так называемые «ячейки».

В состав ячейки входит один триггер регистра граничного сканирования и мультиплексора выбора данных. Ячейки могут быть разных типов в зависимости от вывода микросхемы и команд интерфейса, т.е. зависит от производителя той или иной микросхемы. Производители не придерживаются строго стандарта и, поэтому, развелось множество модификаций.

На рисунке представлена одна из разновидностей ячейки. PI, PO — параллельные вход и выход, SI,SO — последовательные.

Сигналы на регистр микросхемы попадают через мультиплексор, который позволяет считывать как состояния выводов ядра микросхемы (инструкция INTEST), так и данные, поступающие извне на сдвиговый регистр (инструкция EXTEST). Разновидности инструкций и их функциональность опять же меняются от желаний производителя, но существуют так называемые обязательные:

  • EXTEST — инструкция, позволяющая за счет установки логических значений на рабочих контактах электронных компонентов проверить внешние цепи, имеющие непосредственное отношение к тестируемому компоненту.
  • INTEST — инструкция обеспечивает возможность установки логических значений внутри микросхемы, то есть на входах ядра, тем самым проверяя его.
  • SAMPLE_PRELOAD — позволяет тестировать ядро электронного элемента в статическом режиме, устанавливая значения логических уровней на границе его выходных буферов.
  • BYPASS — инструкция, при которой наш регистр граничного сканирования «схлопывается» в один триггер. При этом данные со входа (TDI) на выход (TDO) передаются с задержкой в один такт частоты синхронизации интерфейса (TCK). Этот режим позволяет эффективно использовать возможности последовательного интерфейса при организации длинных последовательно объединенных цепочек.
  • IDCODE — инструкция выдвигает на выход значение встроенного 32-битного регистра с идентификаторами производителя, модели и версии устройства.
Сигнальные линии интерфейса

Как уже говорилось выше, интерфейс JTAG имеет следующие сигнальные линии:
  • TDI — Test Data Input — сигнал данных на вход, данные задвигаются по переднему фронту TCK.
  • TDO — Test Data Output — выход последовательных данных JTAG, выдвигаются по заднему фронту TCK, должен находиться в третьем состоянии — Z — когда данные не передаются.
  • TMS — Test Mode Select — сигнал управления TAP — контроллером.
  • TRST — Test Reset — не всегда есть, так как ресета можно добиться удерживая некоторое время TMS = 1, активный уровень сигнала — 0.
  • TCK — Test Clock — тактовая частота.

JTAG — синхронный интерфейс, сигналы принимаются по переднему фронту синхроимпульсов младшими битами вперед и только в течении состояний TAP — контроллера Shift-DR \ Shift-IR. Выходные данные выдвигаются по заднему фронту.
TAP — контроллер

Мы добрались до самой сути JTAG, а именно — управляющий работой автомат. С его помощью собственно и живет всё вокруг. Автомат имеет 16 состояний. Управление интерфейсом осуществляется путем воздействия на автомат посредством сигнала TMS. Переходы происходят по переднему фронту сигнала TCK. Чтение и запись данных происходят одновременно. Ниже привожу иллюстрацию работы, взятую из документации микросхем фирмы Altera.

Диаграмма переходов автомата, управляющего режимами TAP

Состояния диаграммы переходов:

  • Test-Logic-Reset – исходное состояние;
  • Run-Test/Idle – переходное состояние контроллера при выполнении тестов или ожидании следующей
  • команды;
  • Select-IR, Select-DR – состояние, после которого будет производиться тестирование команд, данных;
  • Capture-IR, Capture-DR – состояние приёма команд, данных;
  • Shift-IR, Shift-DR – состояние сдвига команд, данных;
  • Exit1-IR, Exit2-IR – выход из режима работы с командами;
  • Exit1-DR, Exit2-DR – выход из режима работы с данными;
  • Pause-IR, Pause-DR – состояние паузы;
  • Update-IR, Update-DR – состояние перезаписи данных в выходные регистры.
DR — действия происходят над данными, IR — соответственно над инструкциями.

Исходное состояние, в котором находится автомат после включения, это Test-Logic Reset. Пока сигнал TMS имеет значение «лог.1», состояние автомата остается неизменным. В этом состоянии, по умолчанию, выбрана инструкция IDCODE или BYPASS.

Сигнал сброса TRST не является обязательным, поэтому для сброса автомата в исходное состояние применяют следующую процедуру. Необходимо подать на вход TMS сигнал высокого уровня и удерживать его не менее 5 тактов частоты TCK. Если сигнал TMS будет установлен хостом в низкий уровень, то автомат перейдёт к состоянию Run-Test/Idle (активное состояни, в котором ничего не происходит). Обычно из этого состояния можно перейти в состояние Select-IR, для того чтобы загрузить в контроллер новую инструкцию. Но если на вход сигнала TMS подействует не сигнал, подаваемый от хоста, а помеха низкого уровня, то, как и в предыдущем случае, автомат перейдёт в состояние Run-Test/Idle. Если же кратковременная помеха (длительностью не более одного периода синхрочастоты) прекратится, то автомат через три такта снова вернётся в исходное состояние – Test-Logic Reset.
Чтобы загрузить в контроллер новую команду, надо из состояния Run-Test/Idle перевести автомат в состояние Select-IR, Capture-IR, Shift-IR. Затем необходимо «продвинуть» в цепочку данных новую команду, а потом перевести автомат через состояния Exit1-IR, Update-IR и снова в Run-Test/Idle. Логика работы с данными такая же. Нужно учитывать, что сигнал высокого уровня при переходе из состояний Shift-IR\DR подается вместе с последним битом информации.


Диаграмма сигналов при выполнении переходов для загрузки команды

Если используя специализированный САПР написать код работы JTAG на Verilog, то результирующая диаграмма будет выглядеть примерно так:

Сылка на дропбокс, картинка в полный размер

Наконец можно показать полную структурную схему устройства JTAG и Вы вполне должны в ней разобраться:

… И в заключение…

Использование JTAG и технологии граничного сканирования в микросхеме, на плате или в устройстве добавляет стоимость и увеличивает время разработки проекта. Но, всё же эти затраты легко окупаются при проведении тестирования, которое обеспечивается на каждой стадии цикла жизни изделия. То, что было первоначально разработано как производственный испытательный инструмент, используется до начала производства, во время серийного производства и после производства, то есть на этапе эксплуатации конечным пользователем. Кроме непосредственно граничного тестирования, проектировщики используют технологию JTAG для того, чтобы производить самотестирование (BIST) (в тех компонентах, где оно реализовано) и загружать внутренние значения в регистры устройства или программировать микросхемы ПЗУ. Тесты, которые были разработаны и использованы на этапе проектирования, могут быть переданы производству, для того чтобы обеспечить дополнительное снижение стоимости и времени на проверку изделий при выходном контроле.Основные положительные эффекты от применения технологии JTAG в производственной фазе – экономия времени при разработке испытательных тестов, улучшенный «охват» тестируемого изделия при поиске ошибки и диагностировании и улучшенная производительность испытаний при одновременном уменьшении времени испытания.
Применение граничного сканирования при эксплуатации изделия также даёт определённый положительный эффект. Отказы при эксплуатации часто происходят из-за структурных отказов, которые вызываются повышенной температурой, влажностью, вибрацией. Используя граничное сканирование, техники имеют возможность быстро проверить изделие на структурные ошибки вплоть до уровня компонентов без трудоёмкого исследования или возвращения платы изготовителю на завод.

Литература:
Wiki
Boundary-scan in Altera devices
офф. страница рабочей группы стандарта IEEE 1149.1
1149.1-2013 — IEEE Standard for Test Access Port and Boundary-Scan Architecture
Хорошая хабро-статья, в которой затронуто JTAG тестирование
выпуск EEVblog про JTAG от Killy
В статье использовались некоторые данные из журнала «Современная электроника» выпуск №2 2007.

Разбираем протокол 2-wire JTAG / Хабр

2-wire JTAG (он же двухпроводной JTAG, он же CompactJTAG, он же cJTAG) – это новомодный интерфейс, являющийся частью стандарта IEEE 1149.7-2009. Он обеспечивает ту же и даже большую функциональность, что и обычный JTAG (IEEE 1149.1), но использует всего два сигнала вместо четырех.

К сожалению, ни в русскоязычном, ни в англоязычном сегментах Интернета нет никакой информации об этом стандарте, кроме нескольких статей, написанных маркетологами. Тем не менее некоторое время назад мне по долгу службы пришлось с этим стандартом разобраться, и теперь у вас есть уникальный шанс ознакомится с результатами моих изысканий.

Я предполагаю, что вы знакомы с обычным JTAG-ом. Освежить память можно здесь: habrahabr.ru/post/190012

Часто считают, что IEEE 1149.7 и 2-wire JTAG – это синонимы. На самом деле это не так, потому что IEEE 1149.7 включает в себя режимы, использующие как два, так и четыре сигнала. Так что 2-wire JTAG – это подмножество IEEE 1149.7.

Официально IEEE 1149.7 называется IEEE Standard for Reduced-Pin and Enhanced-Functionality. Несмотря на то, что помимо двухпроводности IEEE 1149.7 предлагает еще стопицот новых фич, по моему опыту именно возможность сэкономить две ножки на корпусе микросхемы привлекает разработчиков больше всего.

К сожалению, создатели IEEE 1149.7 употребляли тяжелые наркотики безо всякой меры, поэтому родили без преуменьшения чудовищный документ, который твердо занял первое место в моем личном хит-параде самых уродски написанных стандартов. Помимо того, что он вырос почти в десять раз (1037 страниц против 139 у старого JTAG-а), он еще и написан так, что абсолютно невозможно ничего понять.

Тем не менее, если вы однажды окажетесь лицом к лицу с микросхемой, у которой вместо четырех JTAG-ног (TCK, TMS, TDI и TDO) всего две (TCKC и TMSC – “C” на конце означает “Compact”), а готового софта для работы с ней не будет, то вам придется что-то делать.

Что обычно делает инженер, когда видит перед собой микросхему с неопознанным JTAG-портом. Конечно же пытается выяснить, какие устройства к нему подключены. Узнать это можно, прочитав их IDCODE. Для обычного JTAG процедура проста и выглядит так, как описано по ссылке www.fpga4fun.com/JTAG3.html:

  1. Сначала определяем число устройств в цепочке:
    • Переходим в Test Mode Reset
    • Переходим в Shift-IR
    • Задвигаем через TDI кучу единиц (сколько не жалко, например, 1000) во все IR-ы в цепочке. Теперь все устройства в BYPASS
    • Переходим из Shift-IR в Shift-DR
    • Задвигаем через TDI кучу нулей (сколько не жалко, например, 1000) во все DR-ы в цепочке, чтобы обнулить их
    • Начинаем задвигать через TDI единицы в DR. Как только получили единицу из TDO, прекращаем. Число устройств в цепочке равно числу задвинутых единиц.
  2. Потом для каждого устройства читаем IDCODE:
    • Переходим в Test Mode Reset – в результате во все IR-ы записывается адрес регистра IDCODE.
    • Идем в Shift-DR
    • Читаем из TDO 32 бита для каждого устройства (кстати, для этого придется задвинуть что-нибудь в TDI). Первые 32 бита, прочитанные из TDO – IDCODE последнего устройства в цепочке, следующие 32 бита – IDCODE предпоследнего устройства, и т.д.

Изначально я хотел показать, как сделать то же самое, используя двухпроводной JTAG, но оказалось, что эта процедура длинновата для примера. Поэтому я решил упростить ее, предположив, что в JTAG-цепочке только одно устройство, и адрес его регистра IDCODE известен. Таким образом, выглядеть чтение IDCODE будет так:
  1. Записываем в Instruction Register (IR) адрес IDCODE:
    • Идем в Shift-IR
    • Находясь в Shift-IR, задвигаем в TDI адрес регистра IDCODE
  2. Читаем данные из IDCODE:
    • Идем в Shift-DR
    • Находясь в Shift-DR, задвигаем в TDI 32 произвольных бита и одновременно получаем содержимое IDCODE через TDO

Очевидно, что умея выполнять упрощенную процедуру, можно без проблем реализовать и полную, потому что они используют одни и те же команды. Однако без TDI и TDO, которых у 2-wire JTAG нет, ничего из вышеперечисленного работать не будет. Как же предлагается обойтись без них? Очень просто: по TMSC будут передаваться Scan-пакеты, содержащие TMS, TDI и TDO. Вот так выглядят два идущих друг за другом пакета (nTDI означает, что передается инвертированный TDI):
На самом деле, это только один из возможных форматов, описанных в стандарте – он называется OScan1. Есть еще JScan, MScan, SScan, а OScan-ов аж восемь штук. Правда, обязательны для 2-wire JTAG только JScan0-3, MScan, Oscan0 и Oscan1.

Тут нужно заметить, что сигнал TMSC, в отличие от обычного TMS, двунаправленный, потому что в каждом пакете TMS и TDI передаются в одну сторону, а TDO – в другую.

Однако если вы попробуете просто начать передавать OScan-пакеты, то вас ждет неприятный сюрприз. Короче говоря, ничего работать не будет. А все потому, что по умолчанию любое устройство с поддержкой IEEE 1149.7 находится в режиме совместимости со стандартом 1149.1 (так называемом «стандартном режиме» – standard mode) и никакие такие пакеты не воспринимает. Поэтому прежде чем слать всякие OSсan-ы, необходимо такое устройство сконфигурировать для работы в нужном формате и перевести его в «продвинутый режим» (advanced mode).

Прежде чем рассказать, как это сделать, требуется небольшое лирическое отступление. Одной из главных целей при разработке IEEE 1149.7 было обеспечить совместимость с существующим «железом», которое во все времена выглядело примерно так:


Вместо того, чтобы требовать от разработчиков микросхем переделать всю JTAG-логику, стандарт предлагает добавить адаптер, преобразующий двухпроводной интерфейс в обычный четырехпроводной:
Этот адаптер содержит свой собственный Test Access Port (TAP), называемый TAP.7, чтобы можно было отличить его от обычного TAP (он же TAP.1). У контроллера TAP.7 внутри точно такой же автомат, как у TAP.1, но есть и некоторые отличия, например, у него нет Instruction Register, зато есть много других регистров, которых нет у TAP.1.

По умолчанию TAP.7 «прозрачен», т.е. сигнал TCKC просто напрямую подключен к TCK, а TMSC – к TMS. Поэтому все сигналы, посылаемые по TCKC и TMSC передаются безо всяких изменений на TCK и TMS:


Очевидно, что при попытке передать Oscan1-пакет в таком режиме «nTDI» будет воспринят контроллером TAP.1 просто как первый бит, переданный по линии TMS, «TMS» — как второй бит, и т.д. Именно поэтому перед тем, как передавать пакеты, нужно перевести контроллер TAP.7 в «продвинутый режим». Это делается путем записи в один из внутренних регистров TAP.7. На время конфигурирования TCK и TMS отключаются (а TDI и TDO и раньше были отключены):
После того, как конфигурирование закончено, TCK, TMS, TDI и TDO управляются внутренней логикой контроллера:
Таким образом, процесс переключения в «продвинутый режим» и последующее чтение IDCODE выглядит так:
  1. Инициализировать контроллеры TAP.7 и TAP.1
  2. Отключить TCK и TMS
  3. Выбрать нужный формат передачи
  4. Если выбран формат OScan, MScan или SScan, то перейти в «продвинутый режим»
  5. Подключить TCK, TMS, TDI и TDO
  6. Записать в Instruction Register адрес IDCODE
  7. Прочитать данные из IDCODE

Инициализация TAP.7. Escape Reset

Поскольку никогда нельзя знать, в каком состоянии находятся автоматы TAP.7 и TAP.1, то перед началом работы необходимо сбросить их. Для сброса контроллера TAP.7 применяется Escape Reset – один из видов эскейп-последовательностей, определенных стандартом. От всех остальных JTAG-команд эскейп-последовательности отличаются тем, что значения TMS считываются не по переднему фронту TCK, а асинхронно. Контроллер TAP.7 считает количество фронтов сигнала TMS, пришедших за то время, пока TCKC неизменен. Количество фронтов определяет вид эскейп-последовательности. Для Escape Reset оно должно быть больше семи:
Также Escape Reset переводит TAP.7 в состояние Test Logic Reset. Вся прелесть эскейп-последовательностей в том, что они абсолютно никак не влияют на TAP.1, который их просто игнорирует. TAP.1 считывает значения TMS только по переднему фронту TCK, поэтому ему абсолютно все равно, что происходит с TMS в остальное время.
Вот так на экране осциллографа выглядит Escape Reset, который передает USB-JTAG адаптер Digilent HS2:
Как видно, все восемь фронтов на месте, однако расстояние между шестым и седьмым выглядит подозрительно. Я уже пожаловался в Digilent – обещали исправить.
Инициализация TAP.1

Чтобы сбросить TAP.1 вслед за TAP.7, стандарт рекомендует послать пять единиц по TMSC: они гарантированно переводят TAP-контроллер в Test-Logic-Reset из абсолютно любого другого состояния (можете проверить сами):
Поскольку больше в Test-Logic-Reset возвращаться мы не планируем, то имеет смысл вслед за пятью единицами послать нолик и тем самым перевести автомат в состояние Run-Test/Idle. Напомню, что контроллер считывает значения TMS в момент переднего фронта TCK и сразу же изменяет состояние автомата в соответствии с этими значениями:
Отключение TCK и TMS

Чтобы отключить TCM и TMS, нужно перевести контроллер TAP.7 в режим Control Mode 2. Всего контроллер поддерживает восемь разных Control Mode-ов, пронумерованных от нуля до семи. Нас интересует именно Control Mode 2, так как только в нем появляется доступ к служебным регистрам контроллера, один из которых нам и нужен, чтобы изменить формат пакетов на OScan1.

Переключение между Control Mode-ами осуществляется последовательно путем выполнения так называемого Zero-bit DR Shift (ZBS). Каждый выполненный ZBS увеличивает Control Mode на единицу. В отличие от эскейп-последовательностей, в теории ZBS может повлиять на контроллер TAP.1, однако на практике это крайне маловероятно. С точки зрения стандарта IEEE 1149.1 Zero-bit DR Shift не имеет абсолютно никакого смысла, поэтому разработчики понадеялись, что ни «железо», ни «софт», разработанные до появления 2-wire JTAG, не должны были использовать ZBS ни для каких своих нужд. На временной диаграмме ZBS выглядит так:


Как видно, ZBS начинается и заканчивается в состоянии Run-Test/Idle, поэтому важно не забыть после Escape Reset и Test-Logic-Reset перейти в Run-Test/Idle до того, как посылать первый ZBS.

Когда нужный режим выбран, его нужно зафиксировать (LOCK), после чего последующие ZBS-ы уже не смогут влиять на выбор режима. LOCK – это почти то же самое, что ZBS, только с заходом в Shift-DR:


Заметьте, что состояние TAP.1, в отличие от TAP.7, уже не меняется. Это потому, что TCK и TMS отключаются сразу, как только номер Control Mode-а становится равен двум, даже если он еще не зафиксирован.
Таким образом, чтобы попасть в Control Mode 2, нужно:
  1. Послать два ZBS
  2. Послать LOCK

Выбор формата

Теперь, когда мы находимся в режиме Control Mode 2, можно писать в служебные регистры. Стандарт описывает множество регистров, запись в которые производится специальными командами. Команды делятся на две группы – двухсекционные (two-part command) и трехсекционные (three-part command), которые я рассматривать не буду.

У двухсекционных команд в первой секции передается номер команды, а во второй – данные. Обе секции передаются одинаковым образом: из состояния Run-Test/Idle надо перейти в Shift-DR, после чего вернуться в Run-Test/Idle. Передаваемое значение равно количеству тактов, проведенных в Shift-DR.
Нас интересует команда под номером три — STFMT (Store Scan Format), которая записывает номер желаемого формата (для OScan1 он равен девяти), передаваемый во второй секции, в регистр SCNFMT (Scan Format).

Таким образом, в первой секции нам надо передать тройку, а во второй – девятку. Сначала записываем номер команды, для чего ждем три такта в состоянии Shift-DR (состояние TAP.1 не показано, так как оно не меняется):


Потом записываем данные (девять тактов в состоянии Shift-DR):
Запись в регистр SCNFMT сама по себе формат не меняет. Чтобы контроллер переключил формат, нужно послать специальный проверочный пакет (check packet).
Check Packet

Проверочный пакет проверяет корректность настроек, и если все в порядке, то контроллер переключает формат и, при необходимости, переходит в «продвинутый режим». Как у всего остального в IEEE 1149.7, у проверочного пакета куча разных вариантов. Вам придется поверить мне на слово, что нам нужен пакет с END-директивой (и не спрашивайте, что это значит), который выглядит вот так:
Ура, теперь мы в «продвинутом режиме» и можем наконец-то использовать OScan1! Чтобы вернутся в «стандартный режим», достаточно перейти в Test-Logic-Reset.
Подключение TCK, TMS, TDI и TDO

Итак, мы в «продвинутом режиме», но все еще в Control Mode 2, а это значит, что TAP.1 до сих пор отключен, и прочитать из него IDCODE мы не можем. Стандарт описывает четыре способа выхода из Control Mode:
  1. Перейти в Test-Logic-Reset
  2. Перейти в Select-IR-Scan
  3. Записать единичку в регистр ECL (Exit Control Level), используя двухсекционную команду STMC
  4. Сделать что-то неведомое, связанное с синхронизацией TAP.7-контроллеров

В Test-Logic-Reset нам нельзя, а то контроллер вернется в «стандартный режим». Двухсекционную команду слать долго. А вот пойти в Select-IR-Scan и вернуться в Run-Test/Idle, не проходя через Test-Logic-Reset, довольно просто – нужно всего лишь послать последовательность 011011 по TMS (заходить в Shift-IR не обязательно). Помните, что в JTAG всегда первым передается младший бит:
Красными точками отмечены места, в которых контроллер считывает биты TMS со входа TMSC. По TDI передаются нули (т.е. во всех пакетах биты nTDI равны единице), хотя они все равно игнорируются, так как мы не заходим в состояние Shift-IR.

Кстати, в отличие от «стандартного режима», состояние TAP.7 меняется не сразу же после получения нового бита TMS, а по третьему (последнему) переднему фронту TCKC в OScan1-пакете (на рисунке эти моменты показаны черными стрелочками) – это сделано для того, чтобы контроллер успел вставить в OScan1-пакет бит TDO и отправить его на хост (в этом конкретном случае контроллер возвращает нули по TDO).

Чтение IDCODE

Теперь, когда TAP.1 снова подключен к TAP.7, мы можем наконец прочитать содержимое регистра IDCODE.

Адрес регистра IDCODE не описан в стандарте, поэтому во всех контроллерах он разный (в моем случае он четырехбитный и равен 0xC). Чтобы упростить жизнь пользователям, Instruction Register инициализируется адресом IDCODE в состоянии Test-Logic-Reset. Однако в состоянии Capture-IR содержимое Instruction Register перезаписывается числом 0x1 (вне зависимости от длины Instruction Register его младший бит устанавливается в единицу, а все остальные в ноль) для того, чтобы можно было обнаружить обрыв цепи при тестировании. Так как мы заходили в Capture-IR на предыдущем этапе, то адрес IDCODE уже затерт, поэтому сначала нужно перезаписать его.

Для записи адреса регистра надо войти в состояние Shift-IR и задвинуть адрес (0xC) по TDI младшим битом вперед. При этом на TDO появится значение, находившееся в Instruction Register до этого, т.е. 0x1 (опять же, младшим битом вперед). В случае обычного четырехпроводного JTAG IEEE 1149.1 это выглядело бы так:


А вот так это выглядит при использовании пакетов OScan1:
Красными точками отмечены места, в которых контроллер считывает биты TMS, а зелеными – биты nTDI со входа TMSC. Фиолетовыми точками отмечены места, в которых контроллер считывает биты TDO перед тем, как вставить их в OScan1-пакеты.
Стрелочками показаны некоторые зависимости, например, сигналы TMS и TDI меняются по соответствующим фронтам TCKC, а сигнал TDO меняется по заднему фронту TCK.

Теперь остается только пойти в состояние Shift-DR, задвинуть 32 произвольных бита по TDI и прочесть 32 бита с TDO, которые и будут содержать IDCODE. С вашего позволения временную диаграмму чтения IDCODE приводить не буду.

Заключение

Я описал примерно 5% возможностей IEEE 1149.7. Тем не менее, я надеюсь, что у вас появилось какое-никакое понимание принципов, лежащих в его основе.

Все диаграммы в этой статье проверены на реальном железе с использованием USB-JTAG адаптера Digilent HS2, коммерческого контроллера 2-wire JTAG, к исходным кодам которого у меня есть доступ, отладочной платы с FPGA и логического анализатора ChipScope от Xilinx.

Программа для генерации последовательностей была написана с использованием API для HS2 на основе примера, который можно скачать вместе с Digilent Adept SDK и отлично работала как под Linux, так и под Windows.

Цоколевка интерфейсов JTAG | arm

Здесь приведены цоколевки попадавшихся мне интерфейсов JTAG.

[JTAG10]

Эта версия JTAG используется для подключения микроконтроллеров AVR (например, ATmega16) к внутрисхемному эмулятору JTAGICE mkII. Никакие нагрузочные резисторы в целевой плате не нужны. Резисторы, показанные на схеме необходимы для развязки, если ножки микроконтроллера с этими сигналами используются в пользовательской программе (чего следует избегать). Для подключения необходим минимум из 6 проводов — TCK, TDO, TDI, TMS, VTref and GND. Опциональным является сигнал nSRST, но его лучше развести. Сигнал nTRST не используется, он зарезервирован для совместимости с другим железом. Пример подключения к целевой плате и программирование см. [4, 5, 6].

[JTAG14]

Эта версия может использоваться вместе с микроконтроллерами AT91SAM7 на некоторых отладочных платах, например Tahoe — AT91SAM7LIGHT, отладочная плата, OrCAD (FREE) (site:svn.berlios.de). Для подключения к отладчику J-LINK необходим переходник с JTAG20 на JTAG14.

[JTAG20]

Полная, стандартная версия JTAG, использующаяся на большинстве отладочных плат — например AT91SAM7X-EK от Atmel или sam7-ex256 от Olimex. Для подключения к эмулятору J-LINK переходник не нужен.

[ARM-20 JTAG]

Эта разводка используется на большинстве систем, основанных на микроконтроллерах ARM.

[ARM-14 JTAG]

Урезанная версия ARM-20.

[MIPS EJTAG]

JTAG на устройствах с микроконтроллерами MIPS, которые можно найти на электронике с Wi-Fi.

[Toshiba MIPS]

[Philips MIPS]

[AVR JTAG]

Широко используемая цоколевка, совместимая с AVR, Altera JTAG и др.

[Altera ByteBlaster]

Широко используемая цоколевка, совместимая с AVR, Altera JTAG и др.

[Maxim MAXQ JTAG]

Цоколевка, частично совместимая с AVR JTAG.

[Actel FlashPro3 JTAG]

[PLD-JTAG]

[Cypress Ultra-isr]

[Lattice JTAG ispDOWNLOAD 2x5pin]

[Lattice JTAG ispDOWNLOAD 9pin]

[TI MSP430]

Цоколевка JTAG Texas Instruments для микроконтроллеров MSP430.

[Xilinx JTAG]

Xilinx Parallel IV 14pin JTAG.

[Xilinx JTAG 9pin]

Xilinx Parallel III и IV 9pin JTAG.

[Linksys WRT54G(S) — используется как EJTAG]

Цоколевки интерфейсов JTAG, используемые на роутерах Linksys WRT54G / WRT54GS.

[Bosch EDC16/MED9 car ECU]

Bosch EDC16 BDM JTAG.

[Motorola PowerPC BDM port]

MPC BDM JTAG.

[Какую цоколевку JTAG выбрать?]

Если Вы разрабатываете электронное устройство на основе микроконтроллера ARM или MIPS, то рекомендуется выбрать соответствующий коннектор (EJTAG или ARM JTAG), чтобы сохранить совместимость со стандартным инструментарием разработки. В других случаях рекомендуется выбрать цоколевку JTAG, рекомендованную производителем Вашего чипа, или выбрать AVR/Byteblaster JTAG (который совместим со многими продуктами на рынке), или стандартный 8pin коннектор PLD JTAG.

Если у Вас в устройстве есть несколько чипов с JTAG, то нужно либо предоставить для каждого отдельный коннектор JTAG (это самое простое, но не экономное решение), либо соединить интерфейсы JTAG в цепочку (в этом случае коннектор JTAG будет только один). Обычно JTAG поддерживает множество устройств в одной цепочке JTAG, но многие инструменты не поддерживают эту возможность. Ознакомьтесь с документацией на Ваши средства разработки, перед тем как соединять устройства в цепочку JTAG.

[Ссылки]

1. Цоколевки коннекторов ISP.
3. Преобразователь JTAG 20 pin -> (JTAG 10 pin + DBGU + SAM-BA).
4. AVR JTAGICE mkII: отладка программы ATmega16 на C.
5. Макетная плата AT91SAM7X. 
6. Программировать ATMegaXX можно не только по интерфейсу ISP, но и через интерфейс JTAG.
7. HappyJTAG: простой интерфейс JTAG для AVR.
8. HappyJTAG2: JTAG и ISP для AVR.

Разбираем протокол 2-wire JTAG

2-wire JTAG (он же двухпроводной JTAG, он же CompactJTAG, он же cJTAG) – это новомодный интерфейс, являющийся частью стандарта IEEE 1149.7-2009. Он обеспечивает ту же и даже большую функциональность, что и обычный JTAG (IEEE 1149.1), но использует всего два сигнала вместо четырех.

К сожалению, ни в русскоязычном, ни в англоязычном сегментах Интернета нет никакой информации об этом стандарте, кроме нескольких статей, написанных маркетологами. Тем не менее некоторое время назад мне по долгу службы пришлось с этим стандартом разобраться, и теперь у вас есть уникальный шанс ознакомится с результатами моих изысканий.

Я предполагаю, что вы знакомы с обычным JTAG-ом. Освежить память можно здесь: habrahabr.ru/post/190012/

Часто считают, что IEEE 1149.7 и 2-wire JTAG – это синонимы. На самом деле это не так, потому что IEEE 1149.7 включает в себя режимы, использующие как два, так и четыре сигнала. Так что 2-wire JTAG – это подмножество IEEE 1149.7.

Официально IEEE 1149.7 называется IEEE Standard for Reduced-Pin and Enhanced-Functionality. Несмотря на то, что помимо двухпроводности IEEE 1149.7 предлагает еще стопицот новых фич, по моему опыту именно возможность сэкономить две ножки на корпусе микросхемы привлекает разработчиков больше всего.

К сожалению, создатели IEEE 1149.7 употребляли тяжелые наркотики безо всякой меры, поэтому родили без преуменьшения чудовищный документ, который твердо занял первое место в моем личном хит-параде самых уродски написанных стандартов. Помимо того, что он вырос почти в десять раз (1037 страниц против 139 у старого JTAG-а), он еще и написан так, что абсолютно невозможно ничего понять.

Тем не менее, если вы однажды окажетесь лицом к лицу с микросхемой, у которой вместо четырех JTAG-ног (TCK, TMS, TDI и TDO) всего две (TCKC и TMSC – “C” на конце означает “Compact”), а готового софта для работы с ней не будет, то вам придется что-то делать.

Что обычно делает инженер, когда видит перед собой микросхему с неопознанным JTAG-портом. Конечно же пытается выяснить, какие устройства к нему подключены. Узнать это можно, прочитав их IDCODE. Для обычного JTAG процедура проста и выглядит так, как описано по ссылке www.fpga4fun.com/JTAG3.html:

  • Сначала определяем число устройств в цепочке:

    • Переходим в Test Mode Reset

    • Переходим в Shift-IR

    • Задвигаем через TDI кучу единиц (сколько не жалко, например, 1000) во все IR-ы в цепочке. Теперь все устройства в BYPASS

    • Переходим из Shift-IR в Shift-DR

    • Задвигаем через TDI кучу нулей (сколько не жалко, например, 1000) во все DR-ы в цепочке, чтобы обнулить их

    • Начинаем задвигать через TDI единицы в DR. Как только получили единицу из TDO, прекращаем. Число устройств в цепочке равно числу задвинутых единиц.
  • Делаем JTAG программатор для прошивки флеш-памяти спутниковых тюнеров и не только

    Нашел в своем архиве фото, на котором был запечатлен процесс изготовления  JTAG-программатора, который понадобился мне, чтобы оживить спутниковый тюнер. Теперь немного подробнее, что за «зверь» такой JTAG:

    JTAG (сокращение от англ. Joint Test Action Group; произносится «джей-тáг») — название рабочей группы по разработке стандарта IEEE 1149. Позднее это сокращение стало прочно ассоциироваться с разработанным этой группой специализированным аппаратным интерфейсом на базе стандарта IEEE 1149.1. Официальное название стандарта Standard Test Access Port and Boundary-Scan Architecture. Интерфейс предназначен для подключения сложных цифровых микросхем или устройств уровня печатной платы к стандартной аппаратуре тестирования и отладки. Кому интересно и дальше, полная статья на википедии.

    А теперь вернемся к делу, от знакомых попал ко мне спутниковый тюнер, самый обычный и простой Globo на процессоре Ali M3329B. С такими симптомами, вообще не включался, сначала я грешил на блок питания, но прозвонив все напруги мультиметром оказалось все же с питанием все нормально. Поизучав немного разных статьей по ремонту данных ресиверов, пришел к выводу, что судя по симптомам полностью слетела прошивка, и восстановить его можно прошив через JTAG-программатор. Так же была мысль, что он полностью сгорел и восстановлению не подлежит, но я все-же предпочитал верить, что прошивка через JTAG поможет.

    Для изготовления выбрал вот эту схему:

    ali02

    Питание на схему подаётся от ресивера, к которому она подключается. В использовании внешнего источника питания для схемы нет необходимости по двум причинам. Во-первых, потребляемый ток очень мал и не создаёт дополнительной нагрузки на блок питания ресивера, во-вторых, питание от того же источника, что и процессор с флэш-памятью улучшает согласование логических уровней.

    74HC244 это не инвертирующий буфер. Микросхема содержит два независимых четырехразрядных буфера. Каждый буфер имеет свой сигнал разрешения выхода (низкий активный уровень). На входах нет триггеров Шмитта. Микросхема выполнена по технологии “быстрый” КМОП, что обеспечивает высокое быстродействие. Мощный токовый выход делает возможным сохранение высокого быстродействия даже при емкостной нагрузке. Быстродействие 74HC244  сравнимо с быстродействием микросхем, основанных на диодах Шоттки, при этом 74HC244 сохраняет достоинства микросхем КМОП, т.е. высокая помехозащищенность и низкая потребляемая мощность. Входы микросхемы защищены от повреждения статическим электричеством при помощи диодов.

    Увы 74HC244 в своих запасах я не обнаружил. Нашел только аналог  74F244, который немного отличался напряжением питания Vcc. У 74HC244 рекомендуемое от 2 до 6 В, а у 74F244 — от 4,5 до 5,5 В. Хотя максимальные пределы от -0.5 до +7 В, поэтому решил не заморачиваться, и приступить к изготовлению.

    Взяв исходную схему на первом изображении, и перерисовав ее в программе DipTrace получилась вот такая схема:

    00

    Далее преобразовал ее в печатную плату:

    01

    Все было оттрасировано автоматически, не оттрасировало только одну линию, но это проблема была решена двумя SMD перемычками. На изображении выше — готовая для изготовления печатная плата.

    На плате я так же подписал все выводы, но к сожалению с выходные сигналы неправильно подписал, как видно на первоисточнике 1- GND, 2- TCK, 3- TMS, 4- TDO, 5- TDI и 6- RST, у меня же получилось GND, TMS, TCK, TDI, TDO, и RST, ошибся именно когда делал подписи контактам, по схеме все правильно, согласно первоисточнику, т.е.  1- GND, 2- TCK, 3- TMS, 4- TDO, 5- TDI и 6- RST.

    Печатная плата с правильными обозначением контактов:

    03

    Далее собственно процесс физического изготовления:

    20150619_140943

    Собственно главное — гетинакс, напильник, небольшая ручная ножовка, наждачная бумага. Отвертка и резак для расслоения гетинакса на 2 части, поскольку у меня кусочек был фольгированный с двух сторон, а плата наша простая, односторонняя.

    Проделав всю роботу, выточив гетинакс под размеры платы (примерно 55х50 мм), берем чистящее средство COMET  (Комет) в порошке и губку для мытья посуды. Очищаем гетинакс от следов жира и грязи. Лучше не вытирать остатки воды, а дать просохнуть так.

    Пока сохнет гетинакс идем за компьютер и печатаем нашу схему на лазерном принтере и фотобумаге в зеркальном отражении указав максимальное качество печати. Важно не забыть поставить зеркальное отражение, иначе в итоге на плате получим все на выворот!

    И так, гетинакс готов, печатная плата напечатана, аккуратно подогнав края гетинакса к рисунку печатной платы на фотобумаге крепим ее липкой бумажной лентой к гетинаксу, берем утюг и ставим его на максимальную температуру.

    20150619_140849

    Естественно фольгированной стороной гетинакса к рисунку печатной платы.

    Когда утюг нагрелся, плотно прижимая, начинаем гладить — равномерно прогревая гетинакс со стороны бумаги. Плату такого размера греем не более 30-60 сек, иначе тонер расползется. Рекомендую поставить таймер на телефоне, чтобы время было рядом, перед глазами. Когда все сделано, даем время плате остыть.

    Отдираем фотобумагу от платы, перед нами готовая плата, которую остается вытравить в хлорном железе FeCl₃,  если есть не большие огрехи, перед травление, поправляем дорожки скальпелем и тонким маркером для дисков.

    20150619_141721

    В процессе травления хлорным железом необходимо непрерывно перемешивать раствор, например покачиванием посуды. Если размер платы не очень большой, можно плату класть на поверхность раствора рисунком вниз — не нужно покачивать, но трудно отследить окончание процесса травления. Время травления хлорным железом составляет от 5 до 50 минут и зависит от температуры, концентрации раствора и его загрязнённости медью, толщины медной фольги. После травления плату нужно промыть проточной водой и высушить.

    В итоге получаем вот такую печатную плату

    20150619_150659

    Тонер так же  очищаем порошком «Комет», он держится достаточно хорошо, и чтоб не повредить дорожки платы очищаем его не спеша.

    После очистки от тонера видим аккуратную, красивую печатную плату

    20150619_152024

    Далее приступаем к лужению, берем паяльник, канифоль, олово и флюс, которым намажем плату, для более комфортного лужения:

    20150619_155205     20150619_155330

    Теперь приступаем к пайке элементов:

    20150619_162107

    На фото плата с запаянным 74F244 и двумя SMD перемычками.

    Запаяем резисторы, конденсатор и разъем LPT-порта (папа), а так же провода GND, TCK, TMS, TDO, TDI и RST для подключения к устройству которое необходимо прошить.  И два провода, для питания программатора

    20160112_152017     20160112_152319

     

    Собственно, на этом процесс изготовления окончен, JTAG-программатор готов для работы, можно прошивать спутниковый тюнер, главное наличие LPT-порта в компьютере, во многих современных компьютерах он к сожалению отсутствует.

    О самом процессе прошивки спутникового тюнера, с помощью данного программатора напишу своей следующей статье.

    JTAG -адаптер на микросхеме FT2232D » Схемотехника

    Зачем делать еще один JTAG-адаптер при таком количестве готовых недорогих решений? Идея состоит в использовании одного и того же устройства для программирования и отладки микроконтроллеров с архитектурой AVR и ARM . Такой целью задался я перед реализацией сего проекта.

    Реализовать подобный адаптер стало возможно благодаря использованию аппаратного USB-UART/FIFO моста на микросхеме FT2232D. Особенностью драйвера FT2232D является поддержка режима MPSSE( Multi-Protocol Synchronous Serial Engine ), благодаря которому на микросхеме FT2232D можно реализовать преобразователи USB-JTAG, USB-SPI,USB-I2C. С сайта производителя можно скачать драйвера под различные операционные системы, библиотеки для разработки программных средств и примеры реализаций.

    Микросхема имеет два канала, каждый из которых может быть настроен независимо от второго на свой режим работы. Конфигурация каналов записывается во внешнюю EEPROM, подключаемую к драйверу. Запись и чтение настроек из EEPROM осуществляется с помощью программ, которые также можно скачать с сайта производителя , например FT_PROG.

    Программное обеспечение для поддержки микросхемы FT2232D программаторами и отладчиками можно разработать самостоятельно, используя библиотеки , любезно предоставленные производителем . Но к счастью на данный момент уже существуют отладочные средства, поддерживающие чипы FT2232.

    Для программирования AVR микроконтроллеров в режиме ISP с помощью данного адаптера можно использовать программатор AVReal. JTAG отладчик для AVR называется HappyJTAG2 . Для микроконтроллеров с ядром ARM работа с адаптером поддерживается программным обеспечением OpenOCD, который устанавливает соединение с адаптером и выступает программным сервером, способным соединиться с клиентом gdb. Такой механизм отладки используется в интегрированной среде разработки Eclipse.

    С загрузкой прошивки в микроконтроллеры ARM дело обстоит еще проще, поскольку для этих целей в микроконтроллер встроен загрузчик, загружающий прошивку по последовательному интерфейсу UART, который также поддерживается микросхемой FT2232D.

    Итак , рассмотрим схему адаптера. Схема адаптера почти полностью взята из документации на микросхему FT2232D и в особых  разъяснениях не нуждается. Проект печатной платы( скачать ) адаптера разработан в свободной системе проектирования KiCad ( скачать ) и предоставляется бесплатно на условиях лицензии GNU GPL.

    На плате адаптера установлено три 20 -выводных разъема BH-20. На два из них ( X2,X4 ) выведены сигналы от обеих каналов микросхемы FT2232D. Эти линии могут использоваться для реализации различных преобразователей с помощью кабельных переходников . На разъем X3 выведены гальванически развязанные с помощью двух изоляторов на микросхеме ADUM1401 сигналы JTAG.

    Светодиод HL4 отображает наличие питающего напряжения на целевой плате.

    Индикаторы HL2 и HL3 сигнализируют наличие приема и передачи. Светодиод HL1 включается при подключении адаптера к USB-порту компьютера.

    На плате установлен линейный преобразователь на микросхеме LM1117MPX-3.3 , обеспечивающий питание +3,3В микросхемы FT2232D.

    Подключение адаптера к персональному компьютеру осуществляется стандартным кабелем USB, который используется, например, для подключения принтера или сканера.

    Этой публикацией я открываю цикл статей, посвященных использованию данного адаптера. Планирую детально описать процесс подключения адаптера , конфигурации EEPROM, запуск отладки ARM -микроконтроллера в Eclipse CDT, программирование и отладка AVR и т.д. А пока что плата отправляется на подготовку к производству.

    Продолжение следует.

    Viewed 28116 times by 3920 viewers

    Что такое JTAG-программатор?

    Существует довольно много конфигураций различных программаторов, которые позволяют переписать программные наработки в микроконтроллер. Они могут быть различными, рассчитанными на профессионалов или, наоборот, иметь упрощенный интерфейс. К последним программаторам относится и герой этой статьи. Вы узнаете не только, что он представляет собой, но и как сделать программатор JTAG своими руками. Вы найдёте схемы и фотографии, как должен выглядеть результат.

    Чем является JTAG-программатор?

    jtag программаторОн представляет собой упрощенный вариант профессионального AVR JTAG ICE, который, как можно догадаться по его названию, предназначен для программирования микроконтроллеров семейства AVR. Его главное отличие в том, что собрать его может даже непрофессионал, и конечная стоимость будет многократно ниже, чем при покупке заводского. По сути, представленный в статье механизм – китайская реплика, поэтому этот программатор AVR ещё и можно купить. Поэтому не кривя душой можно сказать, что существует ещё и вариант покупки. Но сборка своими руками позволит избежать возможных негативных последствий вследствие дешевизны и низкого качества покупаемых деталей при производстве.

    Почему выбирают именно программатор JTAG?

    программатор avrГлавное – его низкая стоимость и лёгкость в сборке. JTAG-программатор может программировать все устройства, имеющие интерфейс JTAG. Для работы через компьютер необходима среда разработки AVR Studio 4-й или больше версии. С ними этот программатор AVR сможет работать.

    Недостатки программатора

    Самые последние версии семейств микроконтроллеров, без дополнительной работы, не программируются. Также существуют значительные проблемы с теми представителями, у которых меньше 40 ног и 16 Кб памяти. Как можно заметить, круг потенциальных клиентов довольно ограничен. Но несколько популярных моделей как раз подпадают под него, так что он пригодится.

    Схема

    программатор jtag своими рукамиСхема программатора простая, для работы необходима ATMega16 и немного дополнительной электроники. В качестве интерфейса может быть использовано MAX232 (для работы с COM) и FT232RL (для работы с USB). Стоит оговориться, что при использовании второго варианта подключать питание через USB не рекомендуют. В таких случаях из-за ошибки или недосмотра могут получить напряжение защитные диоды, и на выводах FT232RL будет высокое напряжение. Это чревато выходом из строя или программатора, или объекта программирования. Решается этот нюанс подачей питания через плату.

    Для большей простоты тем, кто не имеет достаточной квалификации, программатор рассчитан на MAX232, но для другого варианта требуется только установить другой разъем.

    Настройка

    Учитывая, что есть необходимые схемы, следует только вытравить плату. Далее всё аккуратно подсоединяется, припаивается на места, и проверяется работа программатора путём прошивки загрузчика. Затем следует с AVR Studio обновить прошивку для JTAG-программатора до последней версии или до тех пор, пока надо. К адаптеру подключается программатор. Если он работает – значит можно переходить к следующему разделу, в котором обрисованы нюансы работы и программирования. Следует учесть, что все необходимые провода есть, они только нестандартно расположены.

    схема программатора

    В качестве подготовки к работе следует выставить Fuse биты. Они зависят от нотации, в которой производится работа. Для лучшего понимания представляем вот такую таблицу:

    Бит

    Прямая нотация (Даташит, UniProf)

    Инверсная нотация (AVR DUDE GUI, PonyProg)

    OCDEN

    [ ]

    [1]

    JTAGEN

    [ ]

    [1]

    SPIEN

    [ ]

    [1]

    CKOPT

    [1]

    [ ]

    EESAVE

    [1]

    [ ]

    BOOTSZ1

    [ ]

    [1]

    BOOTSZ0

    [ ]

    [1]

    BOOTRST

    [1]

    [ ]

    BODLEVEL

    [1]

    [ ]

    BODEN

    [1]

    [ ]

    SUT1

    [ ]

    [1]

    SUT0

    [ ]

    [1]

    CKSEL3

    [1]

    [ ]

    CKSEL2

    [1]

    [ ]

    CKSEL1

    [1]

    [ ]

    CKSEL0

    [1]

    [ ]

    А как понять, какую выбрать? Ответ на вопрос прост: следует подключиться к микроконтроллеру и начать читать эти самые биты. Обратите внимание на SPIEN – если есть галочка напротив него, то это значит, что нотация инверсная. Если её нет – значит, она прямая. Если всё было сделано правильно, то программатор готов, чтобы прошивать микроконтроллеры. Но если он в последующем не сможет сделать прошивку – перечитайте и проверьте всё ещё раз.

    Работа с программатором

    программатор инструкцияДля большей понятливости будет приведён пример программирования мигания светодиодов. Первоначально следует запустить студию и создать новый проект. Затем выбрать язык программирования (в данном случае ассемблер) и задать имя проекта. Программа сама сможет определить, что вы используете JTAG-программатор. В качестве платформы следует выбрать его, а в окошечке рядом – программируемый им микроконтроллер. Далее всё довольно обычно – следует только вбить текст для программы. Чтобы читатели могли проверить работоспособность, предлагаем опробовать JTAG-программатор указанным в статье кодом. Можно увидеть, что диоды начали мигать очень быстро, что неудивительно, ведь здесь не предусмотрена задержка. Итак, программатор, инструкция его создания и использования есть. Вам остаётся только воплотить полёт своей фантазии.

    Немного о практике. Для проверки подключите к порту А 3 светодиода. Затем к плате подключается: четыре провода интерфейса (TCK, TDI, TMS, TDO) и 2 силовых Vcc идут на плюс, а GND подключается к земле. Всё, питание есть, можно идти дальше. В студии необходимо провести компиляцию кода и его запуск. Проект быстро скомпилируется, тут же будет прошит и начнёт работать. Чтобы следить за процессом исполнения, можно нажать F11, и тогда можно наблюдать, на каком ряду кода сейчас программа. Для этого достаточно поднести курсор к ряду, который включает светодиод, и он загорится. Существует ещё много экспериментов. Помните, что для того чтобы что-то сделать, необходимо работать. Пускай продвижение будет медленным, но со временем вы сможете получить именно то, что хотите, главное — не опускать руки и продолжать экспериментирование с упором на теоретическую базу (без неё никак).

    Интерфейс JTAG? — Это очень просто / Хабр

    Многие знакомы со словом «JTAG», но знакомство это скорее всего поверхностное. В этой статье я хочу перевести Вас на новый уровень, так сказать «во френдзону». Возможно, для многих я не открою ничего нового, но надеюсь тем, кто давно хотел ознакомиться, будет интересно почитать. Итак, от винта.
    Введение

    В 1985 сформирована группа производителей электроники — JTAG (Joint Test Action Group). Для решения проблем тестирования в 1990 был выдвинутый стандарт — спецификация IEEE Std 1149.1-1990 (Стандартный тестовый порт доступа IEEE и архитектура пограничного сканирования). В этом же году Intel вывел в свет первый процессор с JTAG — 80486. С тех пор стандарт постоянно модифицируется, в данный момент последняя версия датируется 2013 годом.
    «А какие же это проблемы с тестированием?», — спросите Вы. Ну как же! Мало удовольствия прыгать с осциллографом по выводам микросхемы, особенно если их много больше двух! Стандарт позволяет значительно упростить жизнь за счет встраивания специальной архитектуры в современных чипах, обеспечивающей доступ к выводам (точнее, к специальным блокам ввода-вывода) с помощью 4-х проводного последовательного интерфейса.Эта архитектура позволяет не только контролировать их состояние, но и управлять ими. Таким образом можно обойтись без громоздких пробников с физическим контактом и насладиться всем прелестью этапа отладки цифровых микросхем или устройств уровня печатной платы.

    стандарт использовать как для целей внутрисхемного программирования и отладки программ, так и при работе с корпусированными микросхемами. Он же используется для проверки качества припайки микросхем к плате, межплатного и внутреннего монтажа плат и блоков.Также надо сказать ему спасибо за восстановление закирпиченных по неосторожности мобильных устройств.

    И как же работает?

    Механизм граничного сжатия заключен, всего лишь, в сдвиговом регистре (пограничное сканирование), подключенном между выводами микросхемы и ядром, и мультиплексоре который подключает в нужный момент этот регистр. Каждому конкретному выводу соответствуют так называемые «ячейки».

    В состав ячейки входит один триггер регистрационного граничного сканирования и мультиплексора выбора данных.Ячейки могут быть разных типов вывода микросхемы и командного интерфейса, т.е. зависит от производителя той или иной микросхемы. Производители не придерживаются строго стандарта и, поэтому, развелось множество модификаций.

    На рисунке представлена ​​одна из разновидностей клеток. PI, PO — параллельные вход и выход, SI, SO — последовательные.

    Сигналы на регистр микросхемы попадают через мультиплексор, который позволяет считывать как состояния выводов ядра микросхемы (инструкция INTEST), так и данные, поступающие извне на сдвиговый регистр (инструкция EXTEST).Разновидности инструкций и их функциональность опять же меняются от желаний производителя, но существуют так называемые обязательные:

    • EXTEST — инструкция, позволяющая за счет установки логических значений на рабочих контактах компонентов электронных проверять внешние цепи, имеющие непосредственное отношение к тестируемому компоненту.
    • INTEST — инструкция обеспечивает возможность установки логических устройств внутри микросхемы, то есть на входах ядра, тем самым проверяя его.
    • SAMPLE_PRELOAD — позволяет тестировать ядро ​​электронного элемента в статическом режиме, установить значения логических уровней на границе его выходных буферов.
    • BYPASS — инструкция, при которой наш граничный инструмент «схлопывается» в один триггер. При этом данные со входа (TDI) на выход (TDO) передаются с задержкой в ​​один такт синхронизации интерфейса (TCK). Этот режим позволяет использовать возможности последовательного интерфейса при организации длинных последовательных объединений.
    • IDCODE — инструкция выдвигает на выход значение встроенного 32-битного регистра с подключми производителя, модели и версии устройства.
    Сигнальные линии интерфейса

    Как уже говорилось выше, интерфейс JTAG имеет следующие сигнальные линии:
    • TDI — Test Data Input — данные на вход, данные задвигаются по переднему фронту TCK.
    • TDO — Вывод тестовых данных — выходных последовательных данных JTAG, выдвигаются по заднему фронту TCK, должны находиться в третьем состоянии — Z — когда данные не передаются.
    • TMS — Test Mode Select — сигнал управления TAP — контроллером.
    • TRST — Test Reset — не всегда есть, так как ресета можно добиться удерживая некоторое время TMS = 1, активный уровень сигнала — 0.
    • TCK — Test Clock — тактовая частота.

    JTAG — синхронный интерфейс, сигналы принимаются по переднему фронту синхроимпульсов младшими битами вперед и только в текущем состоянии TAP — контроллер Shift-DR \ Shift-IR. Выходные данные выдвигаются по заднему фронту.
    TAP — контроллер

    Мы добрались до самой сути JTAG, а именно — управляющий работой автомат. С его помощью собственно и живет всё вокруг. Автомат имеет 16 состояний. Управление интерфейсом осуществляется путем воздействия на автомат посредством сигнала TMS. Переходы по переднему фронту сигнала TCK. Чтение и запись данных происходит одновременно. Ниже привожу иллюстрацию работы, взятую из документации микросхем Altera.

    Диаграмма переходов автомата, управляющего режимаами TAP

    Состояния диаграммы переходов:

    • Test-Logic-Reset — исходное состояние;
    • Run-Test / Idle — переходное состояние контроллера при выполнении тестов или ожидании следующей
    • команды;
    • Select-IR, Select-DR — состояние, после которого будет производиться тестирование команд, данных;
    • Capture-IR, Capture-DR — состояние приёма команд, данных;
    • Shift-IR, Shift-DR — состояние сдвига команд, данных;
    • Exit1-IR, Exit2-IR — выход из режима работы с командойми;
    • Exit1-DR, Exit2-DR — выход из режима работы с данными;
    • Pause-IR, Pause-DR — состояние паузы;
    • Update-IR, Update-DR — состояние перезаписи данных в выходные регистры.
    DR — действия над данными, IR — соответственно над инструкциями.

    Исходное состояние, в котором находится автомат после включения, это Test-Logic Reset. Пока сигнал TMS имеет значение «лог.1», состояние автомата остается неизменным. В этом состоянии, по умолчанию, выбрана инструкция IDCODE или BYPASS.
    Сигнал сброса TRST не является обязательным, поэтому для сброса автомата в исходное состояние применяет следующие функции. Необходимо подать на вход TMS сигнал высокого уровня и удерживать его не менее 5 тактов частоты TCK.Если сигнал TMS будет установлен хостом в низком уровне, то автомат перейдёт к состоянию Run-Test / Idle (активное состояни, в котором ничего не происходит). Обычно из этого состояния можно перейти в состояние Select-IR, для того, чтобы загрузить в контроллер новую инструкцию. TMS подействует не сигнал, подаваемый от хоста, а помеха низкого уровня, то, как и в предыдущем случае, автомат перейдёт в состояние Run-Test / Idle. Если же кратковременная помеха (длительность не более одного периода синхрочастоты) прекратится, то автомат через три такта снова вернётся в исходное состояние — Сброс логики тестирования.
    Чтобы загрузить в контроллер новую команду, надо из состояния Run-Test / Idle перевести автомат в состояние Select-IR, Capture-IR, Shift-IR. Затем необходимо «продвинуть» в цепочку данных новую команду, а затем автомат перевести через состояние Exit1-IR, Update-IR и снова в Run-Test / Idle. Логика работы с данными такая же. Необходимо учитывать, что сигнал высокого уровня при переходе из состояний Shift-IR \ DR подается вместе с последующим битомом информации.


    Диаграмма сигналов при выполнении переходов для загрузки команды

    Если с помощью специализированного САПР написать код работы JTAG на Verilog, то результирующая диаграмма будет выглядеть примерно так:

    Установка на дропбокс, картинка в полном размере

    Наконец можно показать полную структурную схему устройства JTAG и Вы вполне должны в ней разобраться:

    … И в заключение…

    Использование JTAG и технологии граничного сканирования в микросхеме, на плате или в рубе стоимость и увеличивает время разработки проекта. Но, всё же эти затраты легко окупаются при тестировании, которое обеспечивается на каждой стадии цикла жизни изделия. То, что было разработано как производственный испытательный инструмент, используется до начала производства, во время серийного производства и после производства.Разработчики используют JTAG для того, чтобы выполнить самотестирование (в тех компонентах, где оно реализовано) и загрузить внутренние значения в регистры устройства или программировать микросхемы ПЗУ. Тесты, которые были разработаны и использованы на этапе проектирования, могут быть переданы на производство, чтобы обеспечить дополнительное снижение стоимости и времени на проверку изделий при выходном контроле.Основные положительные эффекты от применения технологии JTAG в производственной фазе — экономия времени при разработке испытательных тестов, улучшенный «охват» тестируемого изделия при поиске ошибки и диагностики и улучшенная производительность испытаний при уменьшенном времени испытаний.
    Применение граничного сканирования при эксплуатации также даётный положительный эффект. Отказы при эксплуатации часто происходят из-за структурных отказов, которые вызываются повышенной температурой, влажностью, вибрацией. Используя граничное сканирование, техники возможность быстро проверить изделие на структурные ошибки до уровня компонентов без трудоёмкого исследования или возвращения платы изготовителю на завод.

    Литература:
    Wiki
    Граничное сканирование в устройствах Altera
    офф.страница рабочей группы стандарта IEEE 1149.1
    1149.1-2013 — Стандарт IEEE для тестового порта доступа и архитектуры граничного сканирования
    Хорошая статья, в которой затрагивает тестирование JTAG
    выпуск EEVblog про JTAG от Killy
    В статье использовались некоторые данные из журнала «Современная электроника» выпуск №2 2007.

    .

    Разбираем протокол 2-проводной JTAG / Хабр

    2-проводной JTAG (он же двухпроводной JTAG, он же CompactJTAG, он же cJTAG) — это новый интерфейс, являющийся частью стандарта IEEE 1149.7-2009. Он обеспечивает ту же и даже большую функциональность, что и обычный JTAG (IEEE 1149.1), но использует всего два сигнала.

    К сожалению, ни в русскоязычном, ни в русскоязычном сегменте рынка Интернета никакой информации об этом стандарте, кроме нескольких статей, написанных маркетологами.У вас есть уникальный шанс получить результаты моих изысканий.

    Я предполагаю, что вы знакомы с обычным JTAG-ом. Освежить память можно здесь: habrahabr.ru/post/1

    Часто считают, что IEEE 1149.7 и двухпроводной JTAG — это синонимы. На самом деле это не так, потому что IEEE 1149.7 включает в себя режимы, использующие как два, так и четыре сигнала. Так что 2-проводный JTAG — это подмножество IEEE 1149.7.

    Официально IEEE 1149.7 называется Стандарт IEEE для сокращенного вывода и расширенной функциональности . Несмотря на то, что помимо двухпроводности IEEE 1149.7 предлагает еще стопицот новых фич, по моему опыту именно возможность сэкономить две ножки на корпусе микросхемы привлекает разработчиков больше всего.

    К сожалению, создатели IEEE 1149.7 употребляли тяжелые наркотики безо всякой меры, поэтому родили без преуменьшения чудовищный документ, который твердо занял первое место в моем личном хит-параде самых уродски написанных стандартов.Помимо того, что он вырос почти в десять раз (1037 страниц против 139 у старого JTAG-а), он еще и написан так, что абсолютно невозможно ничего понять.

    Тем не менее, вы можете использовать это через четыре JTAG-ног (TCK, TMS, TDI и TDO) всего две (TCKC и TMSC — «C» на конце «Compact»), а готового софта для работы с ней не будет, то вам придется что-то делать.

    Что обычно делает инженер, когда видит перед собой микросхему с неопознанным JTAG-портом.Конечно же выяснить, какие устройства к нему подключены. Узнать это можно, прочитав их IDCODE. Для обычного JTAG процедура проста и так, как описано по ссылке www.fpga4fun.com/JTAG3.html:

    1. Сначала выглядит определяем число устройств в цепочке:
      • Переходим в Test Mode Reset
      • Переходим в Shift-IR
      • Задвигаем через TDI кучу единиц (сколько не жалко, например, 1000) во все IR-ы в цепочке. Теперь все устройства в BYPASS
      • Переходим из Shift-IR в Shift-DR
      • Задвигаем через TDI кучу нулей (сколько не жалко, например, 1000) во все DR-ы в цепочке, чтобы обнулить их
      • Начинаем задвигать через TDI единицы в DR.Как только получили единицу из TDO, прекращаем. Число устройств в цепочке равно числу задвинутых.
    2. Потом для каждого устройства читаем IDCODE:
      • Переходим в Test Mode Reset — в результате во все IR-ы записывается адрес регистратора IDCODE.
      • Идем в Shift-DR
      • Читаем из TDO 32 бита для каждого устройства (кстати, для этого придется задвинуть что-нибудь в TDI). Первые 32 бита, прочитанные из TDO — IDCODE последнего устройства в цепочке, следующие 32 бита — IDCODE предпоследнего устройства, и т.д.

    Изначально я хотел показать, как сделать то же самое, используя двухпроводную JTAG, но оказалось, что эта процедура длинновата для примера. Поэтому я решил упростить ее, предположив, что в JTAG-цепочке только одно устройство, и адрес его регистратор IDCODE известен. Таким образом, читать IDCODE будет так:
    1. Записываем в Instruction Register (IR) адрес IDCODE:
      • Идем в Shift-IR
      • Находясь в Shift-IR, задвигаем в TDI адрес регистратора IDCODE
    2. Читаем данные из IDCODE:
      • Идем в Shift-DR
      • Находясь в Shift-DR, задвигаем в TDI 32 произвольных бита и одновременно получаем IDCODE через TDO

    Используя одни и те же команды.Однако без TDI и TDO, которые у 2-проводного JTAG нет, ничего из вышеперечисленного работать не будет. Как же обойтись без них? Очень просто: по TMSC будут передаваться Scan-пакеты, содержащие TMS, TDI и TDO. Вот так выглядят два идущих друг за другом пакета (nTDI означает, что передается инвертированный TDI):
    На самом деле, это только один из форматов, описанных в стандарте — он называется OScan1. Есть еще JScan, MScan, SScan, а OScan-ов аж восемь штук. Правда, обязательны для 2-проводного JTAG только JScan0-3, MScan, Oscan0 и Oscan1.

    Тут нужно заметить, что сигнал TMSC, в отличие от обычного TMS, двунаправленный, что в каждом пакете TMS и TDI передаются в одну сторону, а TDO — в другую.

    Однако если вы попробуете начать передачу OScan-пакетов, то вас ждет неприятный сюрприз. Короче говоря, ничего работать не будет. А все потому, что по умолчанию любое устройство с поддержкой IEEE 1149.7 находится в режиме совместимости со стандартом 1149.1 (так называемый «стандартный режим» — стандартный режим) и никакие такие пакеты не воспринимает.Поэтому прежде чем слать всякие OSсan-ы, необходимо такое устройство сконфигурировать для работы в нужном формате и перевести его в «продвинутый режим» (расширенный режим).

    Прежде чем рассказать, требуется небольшое лирическое отступление. Одной из главных целей при разработке IEEE 1149.7 было обеспечить совместимость с существующим «железом», которое во все времена выглядело примерно так:


    Вместо того, чтобы требовать от разработчиков микросхем переделать всю JTAG-логику, стандартный предлагает добавить адаптер, преобразующий двухпроводной интерфейс в обычный четырехпроводной интерфейс:
    Этот адаптер содержит свой собственный Test Access Port (TAP), называемый TAP.7, чтобы можно было отличить его от обычного TAP (он же TAP.1). У контроллера TAP.7 внутри точно такой же автомат, как у TAP.1, но есть и некоторые отличия, например, у него нет Instruction Register, зато есть много других регистров, которых нет у TAP.1.

    По умолчанию TAP.7 «прозрачен», т.е. сигнал TCKC просто подключен к TCK, а TMSC — к TMS. Поэтому все сигналы, посылаемые по TCKC и TMSC передаются безо всяких изменений на TCK и TMS:


    Очевидно, что при попытке выполнить попытку в таком режиме «nTDI» будет запущен контроллером TAP.1 просто как первый бит, переданный по линии TMS, «TMS» — как второй бит, и т.д. Именно поэтому перед тем, как передать пакеты, нужно перевести контроллер TAP.7 в «продвинутый режим». Это делается путем записи в один из внутренних регистров TAP.7. На время конфигурирования TCK и TMS отключаются (а TDI и TDO и раньше были отключены):
    После того, как конфигурирование закончено, TCK, TMS, TDI и TDO управляются внутренней логикой контроллера:
    Таким образом, процесс переключения в «продвинутый режим» и последующее чтение IDCODE выглядит так:
    1. Инициализировать контроллеры TAP.7 и TAP.1
    2. Отключить TCK и TMS
    3. Выбрать нужный формат передачи
    4. Если выбран формат OScan, MScan или SScan, перейти в «продвинутый режим»
    5. Подключить TCK, TMS, TDI и TDO
    6. Записать в Инструкция Зарегистрироваться адрес IDCODE
    7. Прочитать данные из IDCODE

    Инициализация TAP.7. Escape Reset

    Никогда нельзя знать, в каком состоянии находятся автоматы TAP.7 и TAP.1, то перед началом работы необходимо сбросить их. Для сброса контроллера TAP.7 применяется Escape Reset — один из видов эскейп-последовательностей, определенным стандартом. От всех остальных JTAG-команд эскейп-отличаются тем, что значения TMS считываются не по переднему фронту TCK, а асинхронно. Контроллер TAP.7 считает количество фронтов сигнала TMS, пришедших за то время, пока TCKC введен. Количество фронтов определяет вид эскейп-следовать. Для Escape Reset оно должно быть больше семи:
    Также Escape Reset переводит TAP.7 в состояние Проверить сброс логики. Вся прелесть эскейп-последовательностей в том, что они абсолютно никак не влияет на TAP.1, который просто игнорирует. TAP.1 считывает значения TMS только по переднему фронту TCK, поэтому ему абсолютно все равно, что происходит с TMS в остальное время.
    Вот так на экране осциллографа Escape Reset, который передает USB-JTAG адаптер Digilent HS2:
    Как видно, все восемь фронтов на месте, однако расстояние между шестым и седьмым выглядит подозрительно.Я уже пожаловался в Digilent — обещали исправить.
    Инициализация TAP.1

    Чтобы сбросить TAP.1 вслед за TAP.7, стандарт рекомендует послать пять модулей по TMSC: они гарантированно переводят TAP-контроллер в Test-Logic-Reset из абсолютно любого другого состояния (можете проверить сами):
    После того, как через пятью единицами будет послано сообщение «Test-Logic-Reset», мы не планируем переводить автомат в состояние Run-Test / Idle.Напомню, что контроллер показывает значения TMS в момент переднего фронта TCK и сразу же изменяет состояние автомата в соответствии с этими значениями:
    Отключение TCK и TMS

    Чтобы отключить TCM и TMS, нужно перевести контроллер TAP.7 в режим Control Mode 2. Всего контроллер поддерживает восемь разных Control Mode-ов, пронумерованных от нуля до семи. Нас интересует именно режим управления 2, так как только в нем появляется доступ к служебным регистрам контроллера, один из которых нам и нужен, чтобы изменить формат пакетов на OScan1.

    Переключение между режимом управления последовательным путем выполнения так называемого Zero-bit DR Shift (ZBS). Каждый выполненный ZBS увеличивает Control Mode на единицу. В отличие от эскейп-последовательностей, в теории ZBS может повлиять на контроллер TAP.1, однако на практике это крайне маловероятно. С точки зрения стандарта IEEE 1149.1 Zero-bit DR Shift не имеет абсолютно никакого смысла, поэтому разработчики понадеялись, что ни «железо», ни «софт», разработанные до появления 2-wire JTAG, не должны быть использовать ZBS ни для каких нужд своих нужд .На временной диаграмме ZBS выглядит так:


    Как видно, ZBS начинается и заканчивается в состоянии Run-Test / Idle, поэтому важно не забыть после Escape Reset и Test-Logic-Reset перейти в Run-Test / Idle до, как посылать первый ZBS.

    Когда выбран нужный режим, его нужно зафиксировать (LOCK), после чего последующие ZBS-ы уже не влиять на выбор режима. LOCK — это почти то же самое, что ZBS, только с заходом в Shift-DR:


    Заметьте, что состояние TAP.1, в отличие от TAP.7, уже не меняется. Это потому, что TCK и TMS отключаются сразу, как только номер Control Mode-а равен двум, даже если он еще не зафиксирован.
    Таким образом, чтобы попасть в Control Mode 2, нужно:
    1. Послать два ZBS
    2. Послать ЗАМОК

    Выбор формата

    Теперь, когда мы находимся в режиме Control Mode 2, можно писать в служебные регистры. Стандарт набора регистров, записи в которые создаются специальными командами.Команды делятся на две группы — двухсекционные (команда из двух частей) и трехсекционные (команда из трех частей), которые я рассматривать не буду.

    У двухсекционных команд в первой секции передается номер команды, а во второй — данные. Обе секции передаются одинаковым образом: из состояния Run-Test / Idle необходимо перейти в Shift-DR, после чего вернуться в Run-Test / Idle. Передаваемое значение равно количеству тактов, проведенных в Shift-DR.
    Нас интересует команда под номером три — STFMT (формат сканирования хранилища), которая записывает номер желаемого зарегистрированного формата (для OScan1 он равен девяти), передаваемый во второй секции, в SCNFMT (формат сканирования).

    Таким образом, в первой секции нам надо передать тройку, а во второй — девятку. Сначала записываем номер команды, для чего ждем три такта в состоянии Shift-DR (состояние TAP.1 не показано, так как оно не меняется):


    Потом записываем данные (девять тактов в состоянии Shift-DR):
    Запись в регистр SCNFMT сама по себе формат не меняет. Чтобы контроллер переключил формат, нужно послать специальный проверочный пакет (проверить пакет).
    Контрольный пакет

    Проверочный пакет проверяет корректность настроек, и если все в порядке, то контроллер переключает формат и при необходимости, переходит в «продвинутый режим».Как у всего остального в IEEE 1149.7, у проверочного пакета куча разных вариантов. Вам придется поверить мне на слово, что нам нужен пакет с END-директивой (и не спрашивайте, что это значит), который выглядит вот так:
    Теперь мы в «продвинутом режиме» и можем наконец-то использовать OScan1! Чтобы вернутся в «стандартный режим», перейдите в Test-Logic-Reset.
    Подключение TCK, TMS, TDI и TDO

    Итак, мы в «продвинутом режиме», но все еще в Control Mode 2, а это значит, что TAP.1 до сих пор отключен, и прочитать из него IDCODE мы не можем. Стандарт качества четыре способа выхода из Control Mode:
    1. Перейти в Test-Logic-Reset
    2. Перейти в Select-IR-Scan
    3. Записать единичку в регистр ECL (Exit Control Level), используя двухсекционную команду STMC
    4. Сделать что-то неведомое, связанное с синхронизацией TAP.7-контроллеров

    В Test-Logic-Reset нам нельзя, а то контроллер вернется в «стандартный режим».Двухсекционную команду слать долго. А вот пойти в Select-IR-Scan и вернуться в Run-Test / Idle, не пройти через Test-Logic-Reset, довольно просто — всего лишь послать последовательность 011011 по TMS (не обязательно заходить в Shift-IR). Помните, что в JTAG всегда первым передается младший бит:
    Красными точками отмечены места, которые контроллер считывает биты TMS со входа TMSC. По TDI передаются нули (т.е. во всех пакетах биты nTDI равны единице), хотя они все равно игнорируются, так как мы не заходим в состояние Shift-IR.

    Кстати, отличие от «стандартного режима», состояние TAP.7 меняется не сразу после получения нового бита TMS, а по третьему (последнему) переднему фронту TCKC в OScan1-пакете (на рисунке эти моменты показаны черными стрелочками) — это сделано для того, чтобы контроллер успел вставить в OScan1-пакет TDO и отправить его на хост (в этом конкретном случае возвращает нули по TDO).

    Чтение IDCODE

    Теперь, когда TAP.1 снова подключен к TAP.7, мы можем наконец прочитать содержимое регистра IDCODE.

    Адрес регистратора IDCODE не описан в стандарте, поэтому во всех контроллерах он разный (в моем случае он четырехбитный и равен 0xC). Чтобы упростить жизнь пользователям, Реестр инструкций инициализируется адресом IDCODE в состоянии Test-Logic-Reset. Однако в Capture-IR содержимое Регистр инструкций перезаписывается числом 0x1 (вне зависимости от длины Регистра инструкций его младший бит устанавливается в единицу, все остальные в ноль) для того, чтобы можно было состояние обрыв цепи при тестировании.Так как мы заходили в Capture-IR на предыдущем этапе, то адрес IDCODE уже затерт, поэтому сначала нужно перезаписать его.

    Для записи адреса регистрация надо войти в состояние Shift-IR и задвинуть адрес (0xC) по TDI младшим битом вперед. При этом на TDO появится значение, находившееся в Instruction Register до этого, т.е. 0x1 (опять же, младшим битом вперед). В случае обычного четырехпроводного JTAG IEEE 1149.1 это выглядело бы так:


    А вот так это выглядит при использовании пакетов OScan1:
    Красными точками отмечены места, в которые контроллер считывает биты TMS, а зелеными — биты nTDI со входа TMSC.Фиолетовыми точками отмечены места, в которых они считывают биты TDO перед тем, как вставить в OScan1-пакеты.
    Стрелочками показаны некоторые зависимости, например, сигналы TMS и TDI меняются по внутреннему фронту TCKC, а сигнал TDO меняется по заднему фронту TCK.

    Теперь остается только пойти в состояние Shift-DR, задвинуть 32 произвольных бита по TDI и прочесть 32 бита с TDO, которые и будут содержать IDCODE. С вашего позволения временную диаграмму чтения IDCODE приводить не буду.

    Заключение

    Я описал примерно 5% возможностей IEEE 1149.7. Тем не менее, я надеюсь, что у вас появилось какое-никакое понимание принципов, лежащих в его основе.

    Все схемы в этой статье проверены на использовании адаптера USB-JTAG Digilent HS2, контроллера 2-проводного JTAG, с исходным кодом которого у меня есть доступ, отладочной платы с FPGA и анализатора ChipScope от Xilinx.

    Программа для генерации последовательностей была написана с использованием API для HS2 на основе примера, который можно скачать вместе с Digilent Adept SDK и отлично работала как под Linux, так и под Windows.

    .

    Цоколевка интерфейса JTAG | рука

    Здесь представлены цоколевки попадавшихся мне интерфейсов JTAG.

    [ JTAG10 ]

    Эта версия JTAG используется для подключения микроконтроллеров AVR (например, ATmega16 ) к внутрисхемному эмулятору JTAGICE mkII . Никакие нагрузочные резисторы в плате не нужны. Резисторы, показанные на схеме необходимы для развязки, если ножки микроконтроллера с этим сигналом используются в пользовательской программе (чего избегать).Для подключения необходим минимум из 6 проводов — TCK , TDO , TDI , TMS , VTref и GND . Опциональным является сигнал nSRST , но его лучше развести. Сигнал nTRST не используется, он зарезервирован для совместимости с другими железом. Пример подключения к целевой плате и программирование см. [4, 5, 6].

    [ JTAG14 ]

    Эта версия может быть вместе с микроконтроллерами AT91SAM7 на некоторых отладочных платах, например Tahoe — AT91SAM7LIGHT, отладочная плата, OrCAD (FREE) (сайт: svn.berlios.de). Для подключения к отладчику J-LINK необходим переходник с JTAG20 на JTAG14.

    [ JTAG20 ]

    Полная, стандартная версия JTAG, использующаяся на большинстве отладочных плат — например, AT91SAM7X-EK от Atmel или sam7-ex256 от Olimex. Для подключения к эмулятору J-LINK переходник не нужен.

    [ ARM-20 JTAG ]

    Эта разводка используется на большинстве систем, основанных на микроконтроллерах ARM.

    [ ARM-14 JTAG ]

    Урезанная версия ARM-20.

    [ MIPS EJTAG ]

    JTAG на устройствах с микроконтроллерами MIPS, которые можно найти на электронике с Wi-Fi.

    [ Toshiba MIPS ]

    [ Philips MIPS ]

    [ AVR JTAG ]

    Широко используемая цоколевка, совместимая с AVR, Altera JTAG и др.

    [ Altera ByteBlaster ]

    Широко используемая цоколевка, совместимая с AVR, Altera JTAG и др.

    [ Maxim MAXQ JTAG ]

    Цоколевка, частично совместимая с AVR JTAG.

    [ Actel FlashPro3 JTAG ]

    [ PLD-JTAG ]

    [ Cypress Ultra-isr ]

    [ Решетка JTAG ispDOWNLOAD 2x5pin ]

    [ Решетка JTAG ispDOWNLOAD 9pin ]

    [ TI MSP430 ]

    Цоколевка JTAG Texas Instruments для микроконтроллеров MSP430.

    [ Xilinx JTAG ]

    Xilinx Parallel IV 14-контактный JTAG.

    [ Xilinx JTAG 9pin ]

    Xilinx Parallel III и IV 9pin JTAG.

    [ Linksys WRT54G (S) — используется как EJTAG ]

    Цоколевки интерфейсов JTAG, используемые на роутерах Linksys WRT54G / WRT54GS.

    [ ЭБУ автомобиля Bosch EDC16 / MED9 ]

    Bosch EDC16 BDM JTAG.

    [ Порт Motorola PowerPC BDM ]

    MPC BDM JTAG.

    [ Какую цоколевку JTAG выбрать? ]

    Если Вы разработали электронное устройство на основе микроконтроллера ARM или MIPS, то рекомендуется выбрать соответствующий коннектор (EJTAG или ARM JTAG), чтобы сохранить совместимость со стандартным инструментарием разработки. В других случаях рекомендуется выбрать цоколевку JTAG, рекомендованную установку вашего чипа, или выбрать AVR / Byteblaster JTAG (который используется со многими продуктами на рынке), или стандартный 8-контактный коннектор PLD JTAG.

    Если у вас в устройстве есть несколько чипов с JTAG, то нужно либо предоставить отдельный коннектор JTAG (это самое простое, но не экономное решение), либо соединить интерфейс JTAG в цепочку (в этом случае коннектор JTAG будет только один). Обычно JTAG поддерживает множество устройств в одной цепочке JTAG, но многие инструменты не включают эту возможность. Ознакомьтесь с документацией на Ваши средства разработки, перед тем как соединять устройство в цепочку JTAG.

    [ Ссылки ]

    1 . Цоколевки коннекторов ISP.
    3 . Преобразователь JTAG 20 pin -> (JTAG 10 pin + DBGU + SAM-BA).
    4 . AVR JTAGICE mkII: отладка программы ATmega16 на C.
    5 . Макетная плата AT91SAM7X.
    6 . Программировать ATMegaXX можно не только через интерфейс ISP, но и через интерфейс JTAG.
    7 . HappyJTAG: простой интерфейс JTAG для AVR.
    8 . HappyJTAG2: JTAG и ISP для AVR.

    .

    Разбираем протокол 2-проводной JTAG

    2-проводной JTAG (он же двухпроводной JTAG, он же CompactJTAG, он же cJTAG) — это новый интерфейс, являющийся стандартом IEEE 1149.7-2009. Он обеспечивает ту же и даже большую функциональность, что и обычный JTAG (IEEE 1149.1), но использует всего два сигнала.

    К сожалению, ни в русскоязычном, ни в русскоязычном сегменте рынка Интернета никакой информации об этом стандарте, кроме нескольких статей, написанных маркетологами.У вас есть уникальный шанс получить результаты моих изысканий.

    Я предполагаю, что вы знакомы с обычным JTAG-ом. Освежить память можно здесь: habrahabr.ru/post/1/

    Часто считают, что IEEE 1149.7 и двухпроводной JTAG — это синонимы. На самом деле это не так, потому что IEEE 1149.7 включает в себя режимы, использующие как два, так и четыре сигнала. Так что 2-проводный JTAG — это подмножество IEEE 1149.7.

    Официально IEEE 1149.7 называется Стандарт IEEE для сокращенного вывода и расширенной функциональности . Несмотря на то, что помимо двухпроводности IEEE 1149.7 предлагает еще стопицот новых фич, по моему опыту именно возможность сэкономить две ножки на корпусе микросхемы привлекает разработчиков больше всего.

    К сожалению, создатели IEEE 1149.7 употребляли тяжелые наркотики безо всякой меры, поэтому родили без преуменьшения чудовищный документ, который твердо занял первое место в моем личном хит-параде самых уродски написанных стандартов.Помимо того, что он вырос почти в десять раз (1037 страниц против 139 у старого JTAG-а), он еще и написан так, что абсолютно невозможно ничего понять.

    Тем не менее, вы можете использовать это через четыре JTAG-ног (TCK, TMS, TDI и TDO) всего две (TCKC и TMSC — «C» на конце «Compact»), а готового софта для работы с ней не будет, то вам придется что-то делать.

    Что обычно делает инженер, когда видит перед собой микросхему с неопознанным JTAG-портом.Конечно же выяснить, какие устройства к нему подключены. Узнать это можно, прочитав их IDCODE. Для обычного JTAG процедура проста и выглядит так, как описано по ссылке www.fpga4fun.com/JTAG3.html:

  • Сначала определяется число устройств в цепочке:

    • Переходим в Test Mode Reset

    • Переходим в Shift-IR

    • Задвигаем через TDI кучу единиц (сколько не жалко, например, 1000) во все IR-ы в цепочке. Теперь все устройства в BYPASS

    • Переходим из Shift-IR в Shift-DR

    • Задвигаем через TDI кучу нулей (сколько не жалко, например, 1000) во все DR-ы в цепочке, чтобы обнулить их

    • Начинаем задвигать через TDI единицы в DR.Как только получили единицу из TDO, прекращаем. Число устройств в цепочке равно числу задвинутых.


  • Потом для каждого устройства читаем IDCODE:

    • Переходим в Test Mode Reset — в результате во все IR-ы записывается адрес регистратора IDCODE.

    • Идем в Shift-DR

    • Читаем из TDO 32 бита для каждого устройства (кстати, для этого придется задвинуть что-нибудь в TDI). Первые 32 бита, прочитанные из TDO — IDCODE последнего устройства в цепочке, следующие 32 бита — IDCODE предпоследнего устройства, и т.д.

  • Изначально я хотел показать, как сделать то же самое, используя двухпроводной JTAG, но оказалось, что эта процедура длинновата для примера. Поэтому я решил упростить ее, предположив, что в JTAG-цепочке только одно устройство, и адрес его регистратор IDCODE известен. Таким образом

    .

    Оставить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *