Programmation de microcontrôleurs: JTAG, SPI, USB oh my!!


52

J'ai remarqué qu'en ce qui concerne les microcontrôleurs, il y a plusieurs façons de les programmer. Je suis en quelque sorte familiarisé avec l'USB, car mes Arduino peuvent être programmés via USB.

Qu'est-ce qu'une interface JTAG ou SPI?

En fin de compte, je sais que ces interfaces permettent de flasher la puce avec de nouvelles instructions, mais en quoi diffèrent-elles? Y at-il des avantages de l'un sur l'autre?

Réponses:


39

Les microcontrôleurs ATMEGA, comme celui de l’arduino, qui sortent directement de l’usine, ne peuvent être programmés qu’à l’aide de l’interface SPI ou JTAG.

SPI signifie «Serial Peripheral Interface». Il s'agit d'un moyen pour les microcontrôleurs de communiquer entre eux ou avec le monde extérieur. On l'appelle aussi parfois 3 fils parce qu'il utilise trois fils pour communiquer. Pour programmer une puce, vous aurez besoin d'un programmateur spécial qui lit les commandes USB pour piloter les lignes SPI afin de programmer la puce. L’un des plus populaires semble être l’ USBTinyISP d’Adafruit . SparkFun est une très bonne introduction à la programmation SPI. Les applications les plus courantes pour la programmation des puces Atmel AVR sont avrdude (ligne cmd), ponyprog (ne fonctionne pas avec les nouveaux programmeurs) et, dans certains cas, AVR Studio (si votre programmeur le prend en charge). L'avantage de la programmation SPI est que vous pouvez programmer n'importe quelle puce Atmel directement de l'usine afin de ne pas toujours avoir besoin d'un Arduino dans vos projets.

Là où SPI est "juste un autre" protocole série, JTAG est un protocole spécialement conçu pour programmer et déboguer des microcontrôleurs. Tous les microphones d’Atmel ne prennent pas en charge JTAG, mais ceux qui sont utilisés dans l’Arduino. Le protocole JTAG peut être utilisé pour des choses intéressantes comme "l'émulation de circuit" et le débogage, ce qui signifie qu'il vous permet de voir l'état du programme dans votre microcontrôleur en cours d'exécution. Pour ce faire, vous aurez besoin d'un programmateur spécial. Vu ma réponse pour une autre question .

Pour programmer une puce via USB, vous devez d'abord la programmer avec un "bootloader" utilisant SPI ou JTAG. Une fois chargé avec le chargeur de démarrage, le système sera programmable à partir de n'importe quel PC utilisant un convertisseur USB-série. L'inconvénient est que le chargeur de démarrage prend un peu de mémoire et que cette méthode ne vous permet pas de voir l'état de la puce en cours d'exécution.


10
Bien que l’idée qu’un chargeur d’amorçage en série ne soit pas disponible sur un nouvel ATMEGA (bien qu’elle le soit sur de nombreux autres microcontrôleurs) est précise, l’affirmation selon laquelle SPI ou JTAG doit être utilisé est incorrecte. Les ATMEGA prennent également en charge un mode de programmation parallèle haute tension, qui permet de remplacer certains réglages de fusible qui rendraient impraticables les méthodes de programmation en circuit les plus populaires. JTAG n'a pas été conçu pour programmer des micros, mais pour tester des cartes PC en enregistrant et en enregistrant des valeurs dans les registres de broches IO. Son extension pour la programmation ou le débogage des fonctions principales était un hack ultérieur.
Chris Stratton

La programmation SPI et la programmation système / série sont différentes. Moi aussi, j'étais habitué au fait que beaucoup de microcontrôleurs Atmega plus petits avaient des broches de programmation série sur l'interface SPI, mais je me sentais piqué par le fait que, sur certains des plus grands MCU Atmega, les broches de programmation série n'étaient pas sur l'interface SPI.
fête

30

Bien que j'aimerais beaucoup explorer les différentes méthodes de programmation disponibles, quelqu'un d'autre l'a déjà fait. Voici le tutoriel de Dean Camera sur AVRFreaks, méthodes de programmation AVR :

Il existe de nombreuses façons de programmer les microcontrôleurs AVR. Étant donné que de nombreuses personnes posent des questions différentes à un moment ou à un autre, je pensais les décrire ici afin que leurs questions puissent recevoir une réponse rapide et efficace. S'il vous plaît pardonnez-moi si je manque une méthode ou faire une erreur.

MÉTHODE 1: Programmation système (ISP)

Pris en charge par: La grande majorité des AVR (voir les messages ci-dessous)
Programmeurs pris en charge: AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, clones AVRISP, programmeurs AVR910, AVRONE

La programmation système est peut-être la méthode la plus courante pour programmer le flash, l’EEPROM, le fusible et les octets de verrouillage de l’ensemble de la ligne de l’AVR. Le FAI peut programmer les AVR à une fréquence d'horloge extrêmement élevée (en supposant que l'AVR cible fonctionne à une fréquence élevée et que le programmeur la supporte) et constitue la méthode de choix pour presque tous les amateurs d'AVR. Il existe de très nombreux clones AVRISP et programmeurs AVR910 sur le marché, en plus de simples dongles de bricolage qui se connectent au port parallèle de votre ordinateur.

Les nouvelles conceptions récentes de dongle peuvent utiliser le port série de l'ordinateur. Toutefois, selon des preuves anecdotiques, cette méthode est extrêmement lente en raison de limitations techniques.

Le FAI exige que l’AVR cible fonctionne à une fréquence d’au moins quatre fois celle de son horloge. C’est un piège courant et une source de confusion pour de nombreuses personnes novices en AVR.

MÉTHODE 2: JTAG

Pris en charge par: Consultez l'aide d'AVRStudio Tools pour la prise en
charge des appareils MKI et MKII. Programmeurs pris en charge: JTAG-ICE, MKT JTAG-ICE, Dragon, clones JTAG-ICE, AVRONE, STK600 (programmation uniquement).

Techniquement, JTAG est un système de débogage, pas une méthode de programmation. Néanmoins, l’interface JTAG permet de programmer un AVR qui le supporte.

JTAG est un outil de débogage intégré au système qui vous permet de manipuler et d'examiner l'état d'un AVR pris en charge lorsqu'il est exécuté dans un circuit. JTAG permet à l'utilisateur d'arrêter l'exécution à tout moment, la manipulation des registres internes de l'AVR et bien plus encore.

Les unités officielles JTAG-ICE de ATMEL ont été remplacées par le JTAG-ICE MKII, qui prend en charge le protocole de débogage DebugWire plus récent et plus largement pris en charge de la gamme AVR, ainsi que la programmation via la méthode ISP (voir ci-dessus).

Les clones JTAG-ICE sont disponibles à bas prix, mais leur compatibilité limitée avec seulement quelques AVR limite leur utilité. Indépendamment de cela, si votre AVR prend en charge l'interface JTAG, JTAG-ICE reste une méthode et un programmeur de débogage très agréables et efficaces.

MÉTHODE 3: DebugWire

Pris en charge par: De nombreux plus petits AVR
Programmeurs pris en charge: JTAG-ICE MKII, Dragon, AVRONE

Encore une fois, DebugWire est un débogage plutôt qu'une interface de programmation, mais peut être utilisé pour charger des programmes dans des AVR pris en charge. L’interface dW utilise une seule broche AVR (la ligne / RESET) pour toutes les communications, ce qui la rend idéale pour les appareils AVR à faible nombre de broches.

MÉTHODE 4: chargeur de démarrage

Pris en charge par: La plupart des AVR les plus récents
Programmeurs pris en charge: N / A

Encore une fois techniquement pas une méthode de programmation. Un chargeur de démarrage est un petit programme AVR qui se trouve dans une section réservée réglable par l'utilisateur du flash régulier. Les bootloaders utilisent les fonctions de modification automatique de la mémoire flash disponibles dans les nouveaux AVR pour permettre à l’AVR de se programmer par le biais de données de programme chargées à partir d’une source externe. Les Bootloaders peuvent importer leurs données depuis n’importe quel emplacement (par exemple, une carte de données externe ou une carte SD). Cependant, le type le plus courant de Bootloader communique avec un PC via le port RS-232 (série) de l’AVR.

Les chargeurs de démarrage sont limités en ce qu'ils consomment de l'espace flash (ce qui limite la taille du flash disponible pour l'application de l'AVR) et ne peuvent pas modifier les bits de fusible de l'AVR.

Les bootloaders sont largement disponibles sur Internet pour le téléchargement, mais ils souffrent d'un problème de "poule et d'oeuf"; vous avez besoin d'un autre type de programmateur répertorié ici pour pouvoir commencer par programmer le chargeur de démarrage. Ceci est généralement résolu par la construction d'un simple dongle à port parallèle (voir la section FAI) ou par l'achat d'un AVR déjà préchargé avec un chargeur de démarrage (par exemple, la carte AVRButterfly).

MÉTHODE 5: Programmation parallèle haute tension (HVPP)

Pris en charge par: La plupart des AVR non-TINY (avec des exceptions)
Programmeurs pris en charge: STK500, STK600, Dragon, dongles Homebrew, AVRONE

La programmation parallèle haute tension est une méthode de programmation rarement utilisée, en raison des problèmes liés à la configuration. Malgré cela, la programmation HVPP est couramment utilisée pour "ressusciter" les AVR dont les fusibles ont été mal configurés via une autre méthode de programmation.

Le STK500 et le Dragon prennent en charge HVPP. Pendant le protocole HVPP, la broche / RESET de la cible est élevée à la valeur exceptionnellement élevée de 12 V qui engage le circuit de programmation parallèle interne. La broche / RESET est la seule broche de l’AVR (sur les AVR pris en charge par HVPP) pouvant être élevée en toute sécurité à ce niveau.

Vous pouvez créer votre propre clé HVPP en utilisant des forfaits en ligne tels que celui-ci.

MÉTHODE 6: Programmation série haute tension (HVSP)

Prise en charge par: Nombreux AVR TINY (avec des exceptions)
Programmeurs pris en charge: STK500, STK600, Dragon, dongles Homebrew, AVRONE

HVSP est similaire à HVPP, sauf que le transfert de données est effectué en série plutôt qu'en parallèle. Il s'agit de la méthode de programmation alternative utilisée par de nombreux AVR de la série TINY pour lesquels il manque suffisamment de broches pour HVPP.

MÉTHODE 7: PDI

Pris en charge par: XMEGA AVR
Programmeurs pris en charge: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI est la nouvelle interface de programmation basée sur le protocole debugWire, pour la gamme d’AVR XMEGA. Il n'est actuellement pas utilisé sur d'autres microcontrôleurs AVR 8 bits.

MÉTHODE 8: TPI

Pris en charge par: 6-pin TINY AVR (ATTINY10, etc.)
Programmeurs pris en charge: STK600, Dragon, AVRISP MKII

TPI est une toute petite interface de programmation pour la nouvelle gamme d’AVR TINY à broches limitées, comme la ATTINY10 à 6 broches. Comme dW, TPI utilise la ligne / RESET du périphérique dans le cadre de l'interface de communication, mais la similitude s'arrête là. Étant donné que les TINY AVR de taille réduite ne disposent pas d'un circuit de débogage sur puce, le protocole TPI utilise une nouvelle interface de programmation à trois broches, dans un protocole semi-duplex. Étant donné que la ligne / RESET doit être augmentée à + 12V pour la programmation lorsque la broche RSTDSB du périphérique est définie, cette option est actuellement prise en charge par la carte de programmation STK600 plus récente.

Bonus FAQ section!

  1. Quelle est la meilleure méthode?
    Il n'y a pas de "meilleure" méthode universelle. La programmation ISP est simple et extrêmement populaire, mais toutes les méthodes ci-dessus fonctionneront. Les deux modes de programmation haute tension (celui qui convient à votre appareil) sont les plus riches en fonctionnalités, car ils permettent de réparer un AVR dont les fusibles ont été mal configurés. Cependant, ces méthodes sont difficiles à configurer, d’où la plupart des utilisateurs optent pour le fournisseur de services Internet.

  2. J'ai fabriqué un dongle à port parallèle. Puis-je l'utiliser avec AVRStudio?
    J'ai bien peur que non. AVRStudio ne peut s’interfacer avec des dongles "dumb" - il nécessite un périphérique de programmation intelligent (contenant un microcontrôleur lui-même) pour déchiffrer le protocole de communication qu’il envoie. Les dongles simples sans microcontrôleur doivent être «bitbangés» (c'est-à-dire les signaux appropriés simulés via le dongle via l'ordinateur) lui-même.

  3. Donc, mon dongle est inutile alors?
    Non. Vous pouvez toujours programmer via un dongle fait maison avec un logiciel de programmation tiers. AVRDude est un bon utilitaire en ligne de commande gratuit, connu et compris dans le package WinAVR.

  4. Quelles sont mes options si je veux que mon programmeur fonctionne avec AVRStudio?
    Choisissez un programmeur utilisant un protocole pris en charge par AVRStudio. Cela peut être le simple protocole "AVR910" (obsolète) ou une implémentation personnalisée du protocole utilisé par le STK500 / AVRISP. Notez que ces programmeurs nécessitent un micro-contrôleur, ce qui conduit à une situation de piège. Cela peut être résolu en pré-programmant l'AVR du programmateur au moment de l'achat avec le micrologiciel approprié ou en pré-programmant l'AVR avec un chargeur de démarrage.

  5. Ok, je veux utiliser un chargeur de démarrage. Comment puis-je l'obtenir là-bas en premier lieu?!
    Pour utiliser un chargeur de démarrage dans un AVR, vous devez d’abord le programmer. Si vous n’avez pas de programmateur existant (même un simple dongle idiot suffira pour la programmation initiale), vous pouvez également acheter des AVR préprogrammés avec un chargeur de démarrage de plusieurs fournisseurs.
    Atmel fabrique également la carte de démonstration Butterfly, dont le MEGA169 AVR est préchargé avec un chargeur de démarrage compatible AVR-Studio.

  6. Aidez-moi! J'ai joué avec les fusibles et cassé mon AVR tout en utilisant ISP! L'erreur la plus courante consiste à remplacer les fusibles de sélection d'horloge par un réglage non valide. Essayez de placer une horloge externe sur la broche XTAL1 de l'AVR et voyez si cela vous aide.
    À défaut, utilisez si possible l'une des méthodes haute tension. Cela corrigera toute mauvaise configuration, y compris celles impliquant la source d'horloge car les méthodes haute tension fournissent sa propre horloge à l'AVR pour la programmation.

  7. Comment je m'interface avec mon programmeur?
    Le logiciel que vous utilisez pour interfacer avec votre programmeur dépend du type de programmeur que vous utilisez.
    Les dongles "dumb" simples nécessitent des logiciels tiers, tels que PonyProg ou AVRDude. Il peut s’agir d’outils de ligne de commande ou d’interface graphique - regardez sur le Web et vous en trouverez un adapté à vos besoins.
    Les programmeurs et les chargeurs de démarrage basés sur le protocole AVR910 peuvent être utilisés dans AVRStudio. Dans le menu Outils, sélectionnez l’option "AVRProg" pour ouvrir un écran graphique permettant une interface avec votre programmeur. Comme alternative, des outils tiers tels que AVRDude sont également compatibles AVR910.
    Les outils officiels sont étroitement intégrés à AVRStudio, en particulier dans le cas des variantes de débogage (JTAG / Dragon / etc). Dans le menu Outils d'AVRStudio, sélectionnez le sous-menu "Programme AVR ..." et cliquez sur l'élément "Connecter". Dans la nouvelle fenêtre, sélectionnez votre outil et son interface de connexion, puis cliquez sur OK.
    Comme c'est le cas avec les dongles dumbles et les programmeurs AVR910, les outils officiels peuvent également être utilisés avec un logiciel de programmation tiers.

(C) Dean Camera, 2009. Tous droits réservés. Ne peut pas être reproduit sur un site Web autre qu'AVRFreaks.net sans autorisation expresse et préalable.

Reproduit avec la permission explicite préalable, bien sûr!


5

J'aimerais ajouter quelque chose à la discussion.

SPI est une interface très commune pour les puces. L'allusion à 3 fils est le mode SPI dans lequel vous n'utilisez pas la broche de sélection de la puce.

I2C est le principal concours d’interface car il n’utilise que deux fils, quel que soit le nombre de puces, alors que le SPI requiert un autre fil par interface, mais qu’il est plus lent.

En enseignant, je considère l’enseignement des interfaces comme l’une des tâches les plus importantes.

Wiki de la communauté disponible pour ceux qui veulent développer mes informations.


2
Je n'ai jamais entendu parler de l'utilisation d'I2C en tant qu'interface de programmation Flash native sur un microcontrôleur, bien qu'il n'y ait aucune raison pour que ce ne soit pas le point d'entrée d'un chargeur de démarrage, je suppose ...
vicatcu

@vicatcu, je venais de l'ajouter en tant qu'interface très commune.
Kortuk

3

D'un point de vue général, ces interfaces ne diffèrent que par les programmeurs et les micro-contrôleurs qui les prennent en charge. Tant que vous avez une correspondance entre le programmeur et le micro-contrôleur, je ne m'inquiète pas.

Au fur et à mesure que vous approfondissez, vous constaterez que ce sont les broches utilisées par l'interface sur le micro-contrôleur qui importent le plus - si vous utilisez ces broches pour les capteurs, les signaux peuvent interférer lors de la programmation du dispositif. La solution la plus simple en cas de problème est de déconnecter les capteurs lors de la programmation.

Certaines interfaces (y compris JTAG) permettent de déboguer le périphérique - mais vous avez besoin d'un programmeur (et d'un logiciel pour le piloter) prenant également en charge cette fonctionnalité. Dans une question précédente, on m'avait dirigé vers le Dragon pour le débogage des périphériques AVR. J'ai l'intention d'en obtenir un et de le jouer lorsque mes projets actuels seront presque terminés.


2

Comme vous le mentionnez, série, spi (2 fils, 3 fils?), Usb, jtag, swd, etc. sont tous utilisés.

Oui, il y a des avantages et des inconvénients. Jtag, par exemple, est pour tous les cas que je connais intégré au matériel, initialement et principalement utilisé pour autre chose que le débogage du processeur, mais il arrive qu'ils l'utilisent aussi pour cela. Si jtag est disponible, il s'agit généralement de la meilleure interface pour cette raison, à quelques exceptions près. Par exemple, si les broches ne sont pas dédiées à jtag, vous pourriez avoir un bogue dans le code et / ou utiliser intentionnellement une de ces broches pour un autre élément rendant l’accès à la puce impossible à l’aide de jtag (s’il démarre le logiciel en repositionne ces épingles). Une autre exception est si le noyau du processeur peut être bloqué par un bogue dans le logiciel en flash et qu'un noyau bloqué n'est pas débogué via jtag. J'appellerais cela un bug dans la conception du matériel, mais j'ai récemment traité cela d'une partie commerciale.

Sur l'AVR, par exemple, le PDI, que je pense que les gens pourraient appeler spi ici, peut-être pas. il apparaît au moins sur le xmega que le pdi et le jtag externe alimentent une interface pdi commune en interne. Ainsi, les broches pdi vous donnent un accès direct à cela au lieu de la surcharge jtag. tant que cette interface fonctionne quand un logiciel en flash a accroché le noyau, ce serait l'interface idéale pour cette famille. Le protocole est publié et relativement simple, et intégré au matériel. il présente toutefois l’inconvénient d’un bus de données bidirectionnel, comme i2c.

Arm a un jtag avec moins de fils appelé swd qu’ils ne veulent pas forcément publier. les outils open source l'implémentent cependant. Il s’agit en théorie d’un jtag en série, les différents signaux jtag sont envoyés séquentiellement sur un fil plutôt que parallèlement sur de nombreux fils. je suppose qu’à l’intérieur de la partie, il est à nouveau parallélisé et alimente la logique Jtag normale. Cela a le désavantage d’ARM de vouloir le garder semi-secret, et les débogueurs jtag d’ARM étant une douleur royale à utiliser de toute façon. Donc, cela représente beaucoup de travail. Si / quand openocd le fait fonctionner, alors l'histoire peut être différente. Vous devez également vous préoccuper des épingles réutilisées et de ce qui se passe avec un noyau bloqué.

Un certain nombre de fournisseurs utilisent une solution dans laquelle ils ont une ou plusieurs zones de mémoire flash de démarrage, en fonction de la manière dont une broche, deux ou trois sont tirées, dépend de la mémoire flash à partir de laquelle vous démarrez. Vous pouvez donc démarrer à partir de la mémoire flash de l'utilisateur ou à partir d'une mémoire flash disposant au moins d'un chargeur de démarrage basé sur un port série ou d'un chargeur de démarrage basé sur usb. Pour chaque fournisseur, ces solutions logicielles peuvent varier et varient, les modifications du protocole série de manière subtile ou plus que subtile, la solution usb peut changer un peu. Le bon et le mauvais, c’est que certains de ces flashs peuvent être lus, vous pouvez donc choisir de changer le chargeur de démarrage série, c’est à la fois bon et mauvais, bon en ce sens que vous pouvez choisir de le personnaliser pour votre produit, dommage que ce soit possible. pour effacer accidentellement et brique la partie, au moins la brique pour cette interface.

Les outils Jtag coutaient des milliers de dollars, mais maintenant ils ne l’ont plus, pour environ 15 $, vous pouvez obtenir un panneau de discussion ftdi et le réutiliser avec openocd. Pour 50 $ plus ou moins, vous pouvez obtenir une solution usb basée sur ftdi qui fonctionne immédiatement avec openocd. Vous pouvez obtenir un lien J non commercial pour un montant compris entre 75 et 80 dollars. Et puis il y a ceux de plusieurs milliers de dollars qui sont rapides, sûrs mais ne valent pas l'argent en général. Vous les achetez quand vous êtes une énorme société avec beaucoup d’argent à dépenser et que vous voulez payer une pension alimentaire. Lorsque vous payez ces prix, vous obtenez le produit que vous souhaitez et vous obtenez immédiatement des réponses aux questions du support technique. Comme Linux gratuit vs Windows ou RHEL par exemple, le support linux est gratuit mais vous obtenez ce que vous obtenez. Quoi qu’il en soit, jtag est beaucoup plus attrayant,

Vous devriez avoir dans votre arsenal de débogage et de développement des outils jtag quand et où vous le souhaitez. sparkfun a une base usb basée sur ftdi sur des cartes série et les parties ftdi peuvent être réutilisées dans des gros bangers, vous pouvez les utiliser pour spi ou i2c ou pdi ou jtag ou d’autres interfaces. Obtenir idéalement des cartes conçues pour le bus / la pièce qui vous intéresse et utiliser le logiciel libre / open source qui va avec. Également en utilisant ces cartes série, disposant idéalement d’une alimentation de 3,3 V et de 5 V (environ 15 $ chacune que vous utilisez pour les lillypads et les arduino minis, etc.) pour la connexion à des ports série pour les différents micros dotés d’un protocole série. Je trouve plus facile d’écrire mon propre chargeur sur la base de ces protocoles, en particulier les personnes arduino / avr où la source du chargeur de démarrage est publiée et constitue un sous-ensemble considérable du standard supposé qu’elles prennent en charge. YMMV.

En bref, il n’existe pas de bonne solution, ils ont tous des avantages et des inconvénients. Soyez prêt à soutenir au moins deux d'entre eux. usb et serial ou usb et jtag ou jtag et serial, etc. Il suffit de poser des pastilles ou des trous pour les broches sur le tableau et de ne pas nécessairement les peupler. Pour votre développement personnel ou en laboratoire, disposez d'une suite complète d'outils et soyez prêt à passer de l'un à l'autre lorsque vous briquez des puces et devez récupérer des cartes ou pour développer votre propre chargeur de démarrage, micrologiciel USB, etc.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.