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

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

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

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

Ответы (5)

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

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

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

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

Хотя идея о том, что последовательный загрузчик недоступен на новой ATMEGA (хотя он есть на многих других микроконтроллерах), верна, утверждение, что необходимо использовать SPI или JTAG, неверно. ATMEGA также поддерживает режим параллельного программирования высокого напряжения, который имеет возможность переопределить некоторые настройки предохранителей, которые сделали бы более популярные методы внутрисхемного программирования неработоспособными. JTAG был разработан не для программирования микроконтроллеров, а для тестирования печатных плат путем синхронизации значений в регистрах выводов ввода-вывода и из них. Расширение его для программирования или отладки основных функций было более поздним хаком.
SPI и системное программирование/последовательное программирование отличаются. Я тоже привык к тому, что многие меньшие микроконтроллеры Atmega имели выводы для последовательного программирования на интерфейсе SPI, но меня укусил тот факт, что на некоторых более крупных микроконтроллерах Atmega контакты для последовательного программирования не были на интерфейсе SPI.

Хотя я хотел бы погрузиться в различные доступные методы программирования, кто-то уже сделал это. Вот учебник Dean Camera по 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, который поддерживает более новый и более широко поддерживаемый в линейке AVR протокол отладки DebugWire, а также программирование с помощью метода ISP (см. выше).

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

МЕТОД 3: Отладка провода

Поддерживается: Многие небольшие 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, Homebrew Dongles, AVRONE

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

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

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

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

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

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

МЕТОД 7: ПДИ

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

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

МЕТОД 8: ТПИ

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

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

Бонусный раздел часто задаваемых вопросов!

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

  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! Наиболее распространенной ошибкой является изменение предохранителей выбора часов на недопустимую настройку. Попробуйте подключить внешние часы к выводу XTAL1 AVR и посмотрите, поможет ли это.
    В противном случае, если это возможно, используйте один из высоковольтных методов. Это исправит любую неправильную конфигурацию, в том числе связанную с источником тактового сигнала, поскольку высоковольтные методы предоставляют AVR собственные часы для программирования.

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

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

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

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

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

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

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

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

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

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

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

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

Как вы упомянули, используются серийный номер, spi (2 провода, 3 провода?), usb, jtag, swd и т. д.

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

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

У Arm есть 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 есть платы USB-to-serial на основе ftdi, а части ftdi могут быть перепрофилированы в big bangers, вы можете использовать их для spi, i2c, pdi, jtag или других интерфейсов. В идеале получить платы, сделанные для интересующей вас шины/детали, и использовать бесплатное программное обеспечение с открытым исходным кодом, которое идет с ним. Также используйте эти последовательные платы, в идеале имеющие питание 3,3 В и 5 В (около 15 долларов США за каждую, которую вы используете для lillypads и arduino mini и т. д.) для подключения к последовательным портам для различных микроконтроллеров, которые имеют какой-то последовательный протокол. Мне проще написать свой собственный загрузчик на основе этих протоколов, например, как у разработчиков arduino/avr, где опубликован исходный код загрузчика, и он значительно отличается от предполагаемого стандарта, который они поддерживают. YMMV.

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