Программирование микроконтроллеров: JTAG, SPI, USB ой мой !?


52

Я заметил, что в отношении микроконтроллеров существует несколько способов их программирования. Я немного знаком с USB, так как мои Arduino можно программировать через USB.

Что такое интерфейс JTAG или SPI?

В конечном счете, я знаю, что эти интерфейсы дают возможность прошивать чип новыми инструкциями, но чем они отличаются? Есть ли преимущества одного над другим?

Ответы:


39

Микроконтроллеры ATMEGA, такие как в Arduino, которые поставляются прямо с завода, могут быть запрограммированы только с использованием интерфейса SPI или JTAG.

SPI означает последовательный периферийный интерфейс и позволяет микроконтроллерам взаимодействовать друг с другом или с внешним миром. Иногда его также называют 3-х проводным, потому что для связи используются три провода. Чтобы запрограммировать микросхему, вам понадобится специальный программатор, который считывает команды с USB для управления линиями SPI для программирования микросхемы. Популярным кажется USBTinyISP от Adafruit . Очень хорошее введение в программирование SPI в SparkFun, Наиболее популярными приложениями для программирования микросхем Atmel AVR являются avrdude (cmd line), ponyprog (не работает с новыми программистами) и в некоторых случаях AVR Studio (если ваш программист поддерживает это). Преимущество программирования SPI заключается в том, что вы можете программировать любой чип Atmel прямо с завода, поэтому вам не всегда понадобится Arduino в ваших проектах.

Если SPI - это «просто еще один» последовательный протокол, JTAG - это протокол, специально разработанный для программирования и отладки микроконтроллеров. Не все Atmel micro поддерживают JTAG, но те, что используются в Arduino. Протокол JTAG может использоваться для таких интересных вещей, как «эмуляция схемы» и отладка, что означает, что он позволяет вам видеть состояние программы в вашем микроконтроллере, пока он действительно работает. Для этого вам понадобится специальный программист. Видел мой ответ на другой вопрос .

Чтобы запрограммировать микросхему с помощью USB, вам сначала нужно запрограммировать ее с помощью «загрузчика» с использованием SPI или JTAG. После загрузки с загрузчиком система будет программироваться с любого ПК с использованием USB-последовательного преобразователя. Недостатком является то, что загрузчик занимает некоторое пространство памяти, и этот метод не позволяет вам видеть состояние чипа во время его работы.


10
Будучи точным в идее, что последовательный загрузчик недоступен на новом ATMEGA (хотя он есть на многих других микроконтроллерах), утверждение о том, что SPI или JTAG должны использоваться, неверно. ATMEGA также поддерживает режим параллельного программирования высокого напряжения, который имеет возможность переопределить некоторые настройки предохранителей, что сделает более популярными методы внутрисхемного программирования неработоспособными. JTAG был разработан не для программирования микросхем, а для тестирования плат ПК путем синхронизации значений в и из выводных регистров ввода-вывода. Расширение его для программирования или отладки основных функций было более поздним взломом.
Крис Страттон

SPI и In System Programming / Serial программирование различны. Я также привык к тому, что многие из меньших микроконтроллеров Atmega имели последовательные выводы программирования на интерфейсе SPI, но меня поразил тот факт, что на некоторых более крупных микроконтроллерах Atmega последовательные контакты программирования не были на интерфейсе SPI.
праздник

30

В то время как я хотел бы погрузиться в различные доступные методы программирования, кто-то еще уже есть. Вот руководство Дина Камера по AVRFreaks, AVR Методы программирования :

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

МЕТОД 1: В системном программировании (ISP)

Поддерживается: подавляющим большинством AVR (см. Сообщения ниже).
Поддерживаемые программисты: AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, клоны AVRISP, программаторы AVR910, AVRONE

В системном программировании это, пожалуй, самый распространенный метод программирования флэш-памяти, EEPROM, предохранителя и блокировочных байтов всей линии AVR. Интернет-провайдер может программировать AVR с чрезвычайно высокой тактовой частотой (при условии, что целевой AVR работает на высокой частоте, а программист поддерживает его) и является методом выбора почти для всех любителей AVR. На рынке имеется множество клонов AVRISP и программистов AVR910 в дополнение к простым самостоятельным ключам, которые подключаются к параллельному порту вашего компьютера.

Недавние новые конструкции ключей могут использовать последовательный порт компьютера, однако, как показывают отдельные примеры, этот метод чрезвычайно медленный из-за технических ограничений.

ISP требует, чтобы целевой AVR работал с тактовой частотой, по крайней мере, в четыре раза превышающей тактовую частоту ISP. Это распространенная ошибка и источник путаницы для многих новичков в AVR.

МЕТОД 2: JTAG

Поддерживается: см. Справку AVRStudio Tools для поддержки устройств MKI и MKII.
Поддерживаемые программисты: JTAG-ICE, JTAG-ICE MKII, Dragon, JTAG-ICE клоны, AVRONE, STK600 (только программирование)

Технически JTAG - это система отладки, а не метод программирования. Тем не менее, интерфейс JTAG позволяет программировать AVR, который его поддерживает.

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

Официальные устройства JTAG-ICE от ATMEL были заменены JTAG-ICE MKII, который поддерживает более новые и более широко поддерживаемые протоколы отладки DebugWire в диапазоне AVR, а также программирование с помощью метода ISP (см. Выше).

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

МЕТОД 3: DebugWire

Поддерживается: многими меньшими AVR
Поддерживаемые программисты: JTAG-ICE MKII, Dragon, AVRONE

Опять же, DebugWire - это скорее отладочная, нежели программный интерфейс, но ее можно использовать для загрузки программ в поддерживаемые AVR. Интерфейс dW использует один вывод AVR (линия / RESET) для всех коммуникаций, что делает его идеальным для устройств AVR с низким числом выводов.

СПОСОБ 4: Загрузчик

Поддерживается: большинство новых AVR
Поддерживаемые программисты: н / д

Опять же технически не метод программирования. Загрузчик - это небольшая программа AVR, которая находится в настраиваемом пользователем зарезервированном разделе обычной флэш-памяти. Загрузчики используют функции автоматической модификации флэш-памяти, доступные в более новых AVR, чтобы позволить AVR программировать себя через программные данные, загруженные из внешнего источника. Загрузчики могут получать свои данные из любого места (например, с внешней флэш-памяти или SD-карты), однако наиболее распространенный тип загрузчика взаимодействует с ПК через последовательный порт RS-232 AVR.

Загрузчики ограничены в том, что они занимают место на флэш-памяти (ограничивая размер флэш-памяти, доступной для приложения AVR), и они не могут изменять плавкие вставки AVR.

Загрузчики широко доступны в Интернете для скачивания, но они страдают от проблемы «курица и яйцо»; вам нужен другой тип программатора, перечисленного здесь, для программирования в загрузчике. Обычно это решается созданием простого ключа параллельного порта (см. Раздел ISP) или покупкой AVR, уже предварительно загруженного загрузчиком (например, платой AVRButterfly).

МЕТОД 5: Высоковольтное параллельное программирование (HVPP)

Поддерживается большинством не-TINY AVR (с исключениями).
Поддерживаемые программисты: STK500, STK600, Dragon, доморощенные ключи, AVRONE

Параллельное программирование высокого напряжения - это метод программирования, который редко используется из-за хлопот, которые он требует для настройки. Несмотря на это, программирование HVPP обычно используется для «воскрешения» AVR, чьи плавкие сращения были неправильно сконфигурированы с помощью другого метода программирования.

И STK500, и Dragon поддерживают HVPP. Во время HVPP вывод мишени / RESET повышается до необычно высокого значения 12 В, которое задействует внутреннюю схему параллельного программирования. Вывод / RESET - это единственный вывод AVR (на AVR, поддерживаемых HVPP), который можно безопасно поднять до этого уровня.

Вы можете создать свой собственный ключ HVPP, используя такие онлайн-планы, как этот.

МЕТОД 6: Последовательное программирование высокого напряжения (HVSP)

Поддерживается: многими TINY AVR (с исключениями).
Поддерживаемые программисты: STK500, STK600, Dragon, доморощенные ключи, AVRONE

HVSP аналогичен HVPP, за исключением того, что передача данных выполняется последовательно, а не параллельно. Это альтернативный метод программирования, используемый на многих AVR серии TINY, у которых недостаточно контактов для HVPP.

МЕТОД 7: PDI

Поддерживается: XMEGA AVR
Поддерживаемые программисты: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI - это новый интерфейс программирования, основанный на протоколе debugWire, для линейки AVR XMEGA. В настоящее время он не используется ни на каких других 8-битных микроконтроллерах AVR.

МЕТОД 8: ТПИ

Поддерживается: 6-контактный TINY AVR (ATTINY10 и т. Д.)
Поддерживаемые программаторы: STK600, Dragon, AVRISP MKII

TPI - это очень крошечный программный интерфейс для новой линейки AVR TINY с ограниченными выводами, например, 6-контактный ATTINY10. Как и dW, TPI использует линию устройства / RESET как часть интерфейса связи, но на этом сходство заканчивается. Поскольку TINY AVR размером с пинту не имеют встроенной схемы отладки, протокол TPI использует новый программный интерфейс из трех контактов в полудуплексном протоколе. Поскольку линия / RESET должна быть поднята до + 12 В для программирования, когда установлен вывод RSTDSB устройства, это в настоящее время поддерживается только более новой платой программирования STK600.

Бонус FAQ раздел!

  1. Какой метод самый лучший?
    Универсального «лучшего» метода не существует. Программирование ISP простое и чрезвычайно популярное, однако все вышеперечисленные методы будут работать. Два режима программирования высокого напряжения (в зависимости от того, что применимо к вашему устройству) являются наиболее многофункциональными, поскольку они позволяют ремонтировать AVR, у которого неправильно настроены предохранители. Тем не менее, эти методы очень сложно настроить, поэтому большинство пользователей используют ISP.

  2. Я сделал ключ параллельного порта. Могу ли я использовать его с AVRStudio?
    Боюсь, что нет. AVRStudio не может взаимодействовать с какими-либо «тупыми» ключами - для этого требуется интеллектуальное программирующее устройство, содержащее сам микроконтроллер, для расшифровки передаваемого протокола связи. Простые ключи без микроконтроллера должны быть «разбиты на биты» (т. Е. Соответствующие сигналы, смоделированные через ключ через компьютер).

  3. Так мой ключ бесполезен тогда?
    Нет. Вы все еще можете программировать с помощью самодельного ключа с помощью программного обеспечения стороннего разработчика. AVRDude - это хорошая, известная бесплатная утилита командной строки, которая входит в пакет WinAVR.

  4. Какие есть варианты, если я хочу, чтобы мой программист работал с AVRStudio?
    Выберите программиста, который использует протокол, поддерживаемый AVRStudio. Это может быть простой протокол «AVR910» (устарел) или пользовательская реализация протокола, используемого STK500 / AVRISP. Обратите внимание, что этим программистам требуется микроконтроллер, что приводит к ситуации «ловушка-22». Эту проблему можно решить, предварительно запрограммировав AVR программиста на момент приобретения с помощью соответствующей прошивки, или запрограммировав AVR с помощью загрузчика.

  5. Хорошо, я хочу использовать загрузчик. Как я могу получить это там в первую очередь ?!
    Чтобы использовать загрузчик в AVR, сначала необходимо запрограммировать загрузчик. Если у вас нет существующего программиста (даже простого немого ключа будет достаточно для начального программирования), вы можете альтернативно приобрести AVR, предварительно запрограммированные с помощью загрузчик от нескольких поставщиков.
    Atmel также производит демонстрационную плату Butterfly, в которой MEGA169 AVR поставляется с загрузчиком, совместимым с AVR-Studio.

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

  7. Как мне взаимодействовать с моим программистом?
    Какое программное обеспечение вы используете для взаимодействия с вашим программистом, зависит от типа программиста, который вы используете.
    Простые «тупые» ключи требуют стороннего программного обеспечения, такого как PonyProg или AVRDude. Это могут быть инструменты командной строки или графического интерфейса - посмотрите в Интернете, и вы подберете тот, который соответствует вашим потребностям.
    Программисты и загрузчики на основе протокола AVR910 могут использоваться в AVRStudio. В меню «Инструменты» выберите опцию «AVRProg», чтобы открыть экран графического интерфейса для взаимодействия с вашим программистом. В качестве альтернативы сторонние инструменты, такие как AVRDude, также совместимы с AVR910.
    Официальные инструменты тесно интегрированы в AVRStudio, особенно в случае вариантов отладки (JTAG / Dragon / etc). В меню «Инструменты AVRStudio» выберите подменю «Program AVR ...» и нажмите «Подключить». В новом окне выберите ваш инструмент и его интерфейс подключения и нажмите кнопку ОК.
    Как и в случае с немыми ключами и программистами AVR910, официальные инструменты могут также использоваться со сторонним программным обеспечением.

(C) Дин Камер, 2009. Все права защищены. Не для воспроизведения на любом сайте, кроме AVRFreaks.net, без предварительного явного разрешения.

Воспроизведено с предварительного явного разрешения, конечно!


5

Я хотел бы добавить еще одну вещь к обсуждению.

SPI - очень распространенный интерфейс для чипов. Подсказка к 3-х проводному - это режим SPI, в котором вы не используете вывод выбора микросхемы.

I2C является основным конкурентом за интерфейс, так как он использует только 2-проводные соединения независимо от количества микросхем, в то время как SPI требует еще один провод для интерфейса, но медленнее.

При обучении я считаю преподавание интерфейсов одной из самых важных задач.

Сообщество вики доступно для тех, кто хочет расширить мою информацию.


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

@vicatcu, я просто добавил его как очень распространенный интерфейс.
Кортук

3

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

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

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


2

Как вы упомянули последовательный, SPI (2 провода, 3 провода?), USB, JTAG, SWD и т. Д. Все используются.

Да, есть свои плюсы и минусы. Jtag, например, для всех известных мне случаев встроенного в аппаратное обеспечение, изначально использовался для чего-то другого, кроме отладки процессора, но они используют его и для этого. если доступен jtag, то это, как правило, лучший интерфейс по этой причине, но есть исключения. Например, если контакты не предназначены для jtag, вы можете иметь ошибку в коде и / или преднамеренно использовать один из этих контактов для чего-то другого, что делает невозможным доступ к чипу с помощью jtag (если он загружает программное обеспечение во флэш-памяти, которое перепрофилирует эти булавки). Другое исключение - если ядро ​​процессора может зависнуть из-за ошибки в программном обеспечении во флэш-памяти, а зависшее ядро ​​не может быть отлажено с помощью jtag. Я бы назвал это ошибкой в ​​дизайне аппаратного обеспечения, но недавно я занимался этим с коммерческой стороны.

На AVR, например, PDI, который, я думаю, здесь могут называть spi, а может и нет. по крайней мере на xmega появляется, что pdi и внешний jtag внутренне подают в общий интерфейс pdi. Таким образом, pdi pins дает вам прямой доступ к этому вместо заголовка jtag. до тех пор, пока этот интерфейс работает, когда программное обеспечение во флэш-памяти повесило ядро, это будет идеальный интерфейс для этого семейства. Протокол опубликован и относительно прост, и встроен в аппаратное обеспечение. у него есть недостаток двунаправленной шины данных, такой как i2c.

Рука имеет JTAG с меньшим количеством проводов, называемых SWD, которые они не обязательно хотят открыто опубликовать. инструменты с открытым исходным кодом реализуют его, хотя. в теории это последовательный jtag, различные сигналы jtag отправляются последовательно по одному проводу, а не параллельно по многим проводам. внутри части я предполагаю, что она снова распараллеливается и передает нормальную логику jtag. Это имеет недостаток в том, что ARM хочет сохранить это в полсекрете, а отладчики ARM jtag - это непростая задача. Так что это много работы. Если / когда openocd работает, то это может быть другая история. Вы также должны все еще беспокоиться о перепрофилированных выводах и о том, что происходит с зависшим ядром.

Ряд поставщиков используют решение, в котором они имеют одну или несколько областей загрузочной флэш-памяти, в зависимости от того, каким образом извлекается один или два или три булавки, зависит от того, с какой флэш-памяти вы загружаетесь. Таким образом, вы можете загружаться с флэш-памяти пользователя, или вы можете загружаться с флэш-памяти, которая, по крайней мере, на заводе-изготовителе имеет загрузчик на основе последовательного порта, или той, которая имеет загрузчик на основе USB. Для каждого поставщика эти программные решения могут различаться, последовательный протокол меняется неуловимым или более чем неуловимым образом, USB-решение может меняться совсем немного. Хорошо и плохо, что некоторые из этих вспышек вы можете получить, поэтому вы можете изменить серийный загрузчик, это хорошо и плохо, хорошо, что вы можете настроить его под свой продукт, плохо, что это возможно чтобы случайно стереть его и кирпичную часть, по крайней мере, кирпич для этого интерфейса.

Раньше инструменты Jtag стоили тысячи долларов, теперь их нет, примерно за 15 долларов вы можете получить разделительную доску ftdi и переназначить ее с помощью openocd. За $ 50 плюс или минус некоторые вы можете получить USB-решение на основе ftdi, которое работает из коробки с openocd. Вы можете получить некоммерческую j-ссылку примерно за 75-80 долларов. И затем есть многомиллионные, которые быстры, конечно, но не стоят денег вообще. Вы покупаете их, когда вы огромная корпорация, у которой много денег, и вы хотите платить за поддержку. Когда вы платите по этим ценам, вы получаете нужный продукт и сразу получаете ответы на вопросы технической поддержки. Как и в случае с linux vs windows или RHEL, поддержка linux бесплатна, но вы получаете то, что получаете. В любом случае, это делает JTAG намного привлекательнее,

Вы должны иметь в своем арсенале средства отладки и разработки jtag, когда и где это возможно. У sparkfun есть основанные на ftdi usb для последовательных плат, и части ftdi могут быть преобразованы в большие устройства, вы можете использовать их для spi или i2c, pdi или jtag или других интерфейсов. Идеально получить доски, которые сделаны для интересующей вас шины / детали, и использовать бесплатное программное обеспечение с открытым исходным кодом, которое идет вместе с ним. Кроме того, используются эти последовательные платы, в идеале имеющие напряжение 3,3 В и 5 В (около $ 15 каждая, которую вы используете для lillypads и arduino minis, и т. Д.) Для подключения к последовательным портам для различных микросхем, которые имеют своего рода последовательный протокол. Я считаю, что проще написать свой собственный загрузчик на основе этих протоколов, особенно как люди из arduino / avr, где опубликован исходный код загрузчика, и это значительное подмножество от предполагаемого стандарта, который они поддерживают. YMMV.

Одним словом, хорошего решения нет, у всех есть свои плюсы и минусы. Будьте готовы поддержать как минимум двух из них. usb и serial или usb и jtag или jtag и serial и т. д. Просто сложите колодки или отверстия для булавок на плате и не обязательно заполнять их. Для вашей личной или лабораторной разработки имейте полный набор инструментов и будьте готовы переключаться с одного на другой, когда вы кирпичите чипы и должны восстанавливать платы или когда вы разрабатываете свой собственный загрузчик, прошивку USB и т. Д.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.