Програмування мікроконтролерів: JTAG, SPI, USB oh my !?


52

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

Що таке інтерфейс JTAG або SPI?

Зрештою, я знаю, що ці інтерфейси забезпечують прошивку мікросхема новими інструкціями, але чим вони відрізняються? Чи є якісь переваги один над іншим?

Відповіді:


39

Мікроконтролери ATMEGA, подібні до ардуїно, що надходять прямо з заводу, можуть програмуватися лише за допомогою інтерфейсу 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-послідовного перетворювача. Мінус полягає в тому, що завантажувач займає деякий простір пам’яті, і цей метод не дозволяє вам бачити стан мікросхеми під час роботи.


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

SPI та системне програмування / послідовне програмування відрізняються. Я теж звик до того, що у багатьох менших MCU Atmega були послідовні шпильки програмування на інтерфейсі SPI, але мене покусав той факт, що на деяких великих MCU Atmega шпильки послідовного програмування не були на інтерфейсі SPI.
фест

30

Хоча я хотів би зануритися в різні доступні методи програмування, у когось ще є. Ось навчальний посібник Діна Камери щодо методів програмування AVRFreaks, AVR :

Існує багато способів програмування мікроконтролерів AVR. Оскільки багато людей запитують про різні в той чи інший час, я подумав, що я їх окресля тут, щоб відповісти на їх питання швидко та ефективно. Пробачте мене, якщо я пропускаю метод або помиляюсь.

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

Підтримується: Велика більшість AVR (див. Нижче повідомлення)
Підтримувані програмісти: AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, AVRISP-клони, програмісти AVR910, AVRONE

У системному програмуванні - це, мабуть, найпоширеніший метод програмування спалаху, EEPROM, запобіжника та блоків для всієї лінії AVR. ISP може програмувати AVR з надзвичайно високою тактовою частотою (якщо припустимо, що цільовий AVR працює з високою частотою, а програміст його підтримує) і є методом вибору для майже всіх любителів AVR. На ринку є багато, багато клонів AVRISP та програмістів AVR910, окрім простих ключів, які роблять самі, які підключаються до паралельного порту вашого комп'ютера.

Останні нові конструкції dongle можуть використовувати послідовний порт комп'ютера, однак анекдотичні докази говорять про те, що цей метод є надзвичайно повільним через технічні обмеження.

ISP вимагає, щоб цільовий AVR працював із тактовою частотою, щонайменше, у чотири рази більшою, ніж тактова частота провайдера. Це загальна помилка та джерело плутанини для багатьох нових 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-програм, що
підтримуються: N / A

Знову технічно це не метод програмування. Завантажувач - це невелика програма AVR, яка розташована у встановленому користувачем розділі звичайного спалаху. Завантажувачі використовують функції самовиправлення спалаху, доступні в новіших AVR, щоб дозволити AVR програмувати себе за допомогою програмних даних, завантажених із зовнішнього джерела. Завантажувачі можуть надсилати свої дані з будь-якого місця (наприклад, із зовнішньої флеш-пам’яті даних або SD-картки), однак найпоширеніший тип завантажувача спілкується з ПК через порт RSR-232 (серійний) AVR AVR.

Завантажувачі обмежені тим, що вони займають спалах простору (обмежуючи розмір спалаху, доступного додатку AVR), і вони не в змозі змінити запобіжники AVR.

Завантажувачі широко доступні в Інтернеті для завантаження, але вони страждають від проблеми "курка і яйця"; вам потрібен інший тип програміста, перерахований тут, щоб програмувати в завантажувачі насамперед. Зазвичай це вирішується шляхом побудови простого паралельного ключа для порту (див. Розділ ISP) або придбання AVR, який уже завантажений завантажувачем (наприклад, платою AVRButterfly).

МЕТОД 5: Паралельне програмування високої напруги (HVPP)

Підтримується: Більшість не TINY AVR (за винятком)
Підтримувані програмісти: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

Паралельне програмування високої напруги - це метод програмування, який рідко застосовується через клопоту, який він потребує налаштування. Незважаючи на це, програмування HVPP зазвичай використовується для "воскресіння" AVR, запобіжники яких неправильно налаштовані за допомогою іншого методу програмування.

І STK500, і Dragon підтримують HVPP. Під час HVPP штифт цілі / RESET піднімається до незвичайно високого значення 12V, яке залучає внутрішню схему паралельного програмування. Штифт / RESET - єдиний штифт AVR (на AVR, підтримуваних HVPP), який можна безпечно підняти до цього рівня.

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

МЕТОД 6: Постійне програмування високої напруги (HVSP)

Підтримується: Багато TINY AVR (за винятком)
Підтримувані програмісти: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

HVSP схожий на HVPP, за винятком того, що передача даних здійснюється послідовно, а не паралельно. Це альтернативний метод програмування, який застосовується для багатьох відеореєстраторів серії TINY, яким не вистачає шпильок для HVPP.

МЕТОД 7: ІПП

Підтримуються: XMEGA AVRs
Підтримувані програмісти: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI - це новий інтерфейс програмування, заснований на протоколі debugWire, для лінії AVR з XMEGA. Наразі він не використовується на будь-яких інших 8-бітових мікроконтролерах AVR.

МЕТОД 8: ТПІ

Підтримуються: 6-контактні TINY AVR (ATTINY10 та ін.)
Підтримувані програмісти: STK600, Dragon, AVRISP MKII

TPI - це дуже крихітний інтерфейс програмування для новішої лінійки відеореєстраторів TINY з обмеженими контактами, як 6-контактний ATTINY10. Як і dW, TPI використовує лінію пристрою / RESET як частину комунікаційного інтерфейсу, але на цьому схожість закінчується. Оскільки у TINY AVR розмірів пінта відсутня схема налагодження на мікросхемі, протокол TPI використовує новий інтерфейс програмування з трьох контактів, у напівдуплексному протоколі. Оскільки лінію програму / RESET потрібно підняти до + 12 В для програмування, коли встановлений штифт RSTDSB пристрою, це наразі підтримується лише новішою платою програмування STK600.

Розділ про бонусні запитання!

  1. Який найкращий метод?
    Не існує універсального «найкращого» методу. Програмування ISP є простим і надзвичайно популярним, однак всі вищеперелічені методи будуть працювати. Два режими програмування високої напруги (що стосується вашого пристрою) є найбільш багатими функціями, оскільки вони дозволяють ремонтувати 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 під час використання провайдера! Найпоширенішою помилкою є зміна запобіжників вибору годинника на недійсну установку. Спробуйте поставити зовнішній годинник на контакт XRAL1 AVR і подивіться, чи це допомагає.
    Якщо цього не можливо, скористайтеся одним із методів високої напруги. Вони виправлять будь-які неправильні конфігурації, включаючи ті, що включають джерело тактових годин, оскільки високонапружені методи надають AVR власний годинник для програмування.

  7. Як я взаємодію зі своїм програмістом?
    Яке програмне забезпечення ви використовуєте для взаємодії зі своїм програмістом, залежить від типу програми, який ви використовуєте.
    Прості "німі" ключі потребують програмного забезпечення сторонніх виробників, наприклад, PonyProg або AVRDude. Це може бути командний рядок або інструменти графічного інтерфейсу - огляньте в Інтернеті, і ви вподобаєте його відповідно до ваших потреб.
    Програмісти та завантажувачі, засновані на протоколі AVR910, можуть використовуватися в межах AVRStudio. У меню Інструменти виберіть параметр "AVRProg", щоб відкрити екран GUI для взаємодії з вашим програмістом. Як альтернатива, сторонні інструменти, такі як AVRDude, також сумісні з AVR910.
    Офіційні інструменти тісно інтегровані в AVRStudio, особливо у випадку варіантів налагодження (JTAG / Dragon / тощо). У меню інструментів AVRStudio виберіть підменю «Програму 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 надають вам прямий доступ до цього замість накладних jtag. до тих пір, поки цей інтерфейс працює, коли програмне забезпечення у спалаху розвішує ядро, то це був би ідеальний інтерфейс для цієї родини. Протокол публікується та відносно простий, вбудований у апаратне забезпечення. у нього є недолік двонаправленої шини даних, як i2c.

Arm має jtag з меншою кількістю проводів, званих swd, які вони не обов'язково бажають відкрито публікувати. інструменти з відкритим кодом впроваджують його. теоретично це послідовний jtag, різні сигнали jtag надсилаються послідовно по одному дроту якось замість паралельно на багатьох провідниках. всередині частини я припускаю, що вона знову паралелізується та подає нормальну логіку jtag. Це є недоліком ARM, який хоче зберегти це як напівсекретний, а відладчики jtag ARMs - це королівський біль, який потрібно використовувати. Так що це велика робота. Якщо / коли openocd змушує його працювати, то це може бути інша історія. Ви також повинні все ще турбуватися про перестановлені штифти і те, що відбувається з підвішеною серцевиною.

Кілька постачальників використовують рішення, де вони мають одну або більше областей спалаху завантажувального пристрою, залежно від того, з якого способу витягується шпилька або два-три, залежить від того, з якого спалаху ви завантажуєтесь. Таким чином, ви можете завантажуватись із користувацького спалаху, або ви можете завантажуватись із спалаху, що принаймні з фабрики має завантажувач на основі послідовного порту, або той, який має завантажувач на основі usb. Для кожного постачальника ці програмні рішення можуть і відрізняються, послідовний протокол змінюється на тонкий або більш ніж тонкий спосіб, usb-рішення може змінитися зовсім небагато. Добре і погано в тому, що деякі з цих спалахів ви можете отримати, тому ви можете змінити серійний завантажувач, це і добре, і погано, добре тим, що ви можете вибрати, щоб налаштувати його під свій продукт, погано, що це можливо щоб випадково стерти його і заштрихувати частину, принаймні цеглити її для цього інтерфейсу.

Інструменти Jtag, які раніше коштували тисячі доларів, зараз вони не роблять, приблизно за 15 доларів ви можете отримати плату для розбиття ftdi та змінити її за допомогою openocd. За 50 доларів плюс або мінус деякі ви можете отримати рішення на основі ftdi, що працює з коробкою openocd. Ви можете отримати некомерційне j-посилання на суму від 75 до 80 доларів. А потім є тисячі доларів, які швидко, точно, але взагалі не коштують. Ви купуєте ті, коли ви величезна корпорація з великою кількістю грошових коштів, і хочете платити за підтримку. Коли ви платите ці ціни, ви отримуєте потрібний товар, і ви відразу отримуєте відповіді на питання технічної підтримки. Як, наприклад, безкоштовні Linux та Windows або RHEL, наприклад, підтримка Linux безкоштовна, але ви отримуєте те, що отримуєте. У будь-якому випадку це робить jtag набагато привабливішим,

Ви повинні мати у своєму арсеналі інструменти jtag для налагодження та розробки, коли та де це доступно. У sparkfun є USB-сервер, заснований на ftdi, на серійні дошки, і частини ftdi можуть бути перекомпоновані у великі гаджети, ви можете використовувати їх для spi або i2c або pdi, jtag або інших інтерфейсів. Ідеально отримуйте дошки, виготовлені для цікавої шини / деталі, і використовувати вільне / відкрите програмне забезпечення, яке йде разом з нею. Крім того, використовуючи ці послідовні плати, в ідеалі - 3,3 В та 5 В (приблизно 15 доларів за кожну, яку ви використовуєте для лілліпадів та ардуїно міні, тощо) для підключення до послідовних портів для різних мікросхем, які мають певний послідовний протокол. Мені легше писати власний завантажувач на основі цих протоколів, особливо як ардуїно / авр фолк, де публікується джерело завантажувача, і це значна група з передбачуваного стандарту, який вони підтримують. YMMV.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.