Programmazione di microcontrollori: JTAG, SPI, USB oh mio !?


52

Ho notato, per quanto riguarda i microcontrollori, ci sono diversi modi per programmarli. Conosco l'USB in quanto il mio Arduino può essere programmato tramite USB.

Che cos'è un'interfaccia JTAG o SPI?

Alla fine so che queste interfacce forniscono un mezzo per far lampeggiare il chip con nuove istruzioni, ma in cosa differiscono? Ci sono dei vantaggi l'uno rispetto all'altro?

Risposte:


39

I microcontrollori ATMEGA come quello nell'arduino che arrivano direttamente dalla fabbrica possono essere programmati solo tramite l'interfaccia SPI o JTAG.

SPI è l' acronimo di Serial Peripheral Interface ed è un modo per i microcontrollori di comunicare tra loro o con il mondo esterno. A volte viene anche chiamato 3 fili perché utilizza tre fili per comunicare. Per programmare un chip, è necessario un programmatore speciale che legge i comandi da USB per guidare le linee SPI per programmare il chip. Uno popolare sembra essere USBTinyISP di Adafruit . Un'ottima introduzione alla programmazione SPI è in SparkFun. Le applicazioni più popolari per la programmazione dei chip Atmel AVR sono avrdude (cmd line), ponyprog (non funziona con i programmatori più recenti) e in alcuni casi AVR Studio (se il programmatore lo supporta). Il vantaggio della programmazione SPI è che puoi programmare qualsiasi chip Atmel direttamente dalla fabbrica in modo da non avere sempre bisogno di un Arduino nei tuoi progetti.

Laddove SPI è "solo un altro" protocollo seriale, JTAG è un protocollo appositamente progettato per programmare ed eseguire il debug di microcontrollori. Non tutti gli Atmel micro supportano JTAG, ma quelli utilizzati nell'Arduino lo fanno. Il protocollo JTAG può essere usato per cose interessanti come "nell'emulazione di circuito" e il debug, il che significa che ti consente di vedere lo stato del programma nel tuo microcontrollore mentre è effettivamente in esecuzione. Per fare ciò avrai bisogno di un programmatore speciale. Ho visto la mia risposta per un'altra domanda .

Per programmare un chip tramite USB, dovrai prima programmarlo con un "bootloader" usando SPI o JTAG. Una volta caricato con il bootloader, il sistema sarà programmabile da qualsiasi PC utilizzando un convertitore USB-seriale. Il rovescio della medaglia è che il bootloader occupa un po 'di spazio di memoria e questo metodo non consente di vedere lo stato del chip mentre è in esecuzione.


10
Sebbene accurato nell'idea che un bootloader seriale non sia disponibile su un nuovo ATMEGA (sebbene lo sia su molti altri microcontrollori), l'affermazione secondo cui SPI o JTAG deve essere utilizzato non è corretta. Gli ATMEGA supportano anche una modalità di programmazione parallela ad alta tensione, che ha la capacità di superare alcune impostazioni dei fusibili che renderebbero inattuabili i più popolari metodi di programmazione in-circuit. JTAG non è stato progettato per programmare i micro ma per testare le schede PC sincronizzando i valori dentro e fuori i registri dei pin IO. L'estensione per la programmazione o il debug delle funzioni principali è stata un hack successivo.
Chris Stratton,

SPI e In System Programming / Programmazione seriale sono diversi. Anch'io ero abituato al fatto che molti dei MCU Atmega più piccoli avevano pin di programmazione seriale sull'interfaccia SPI, ma ero morso dal fatto che su alcuni dei MCU Atmega più grandi, i pin di programmazione seriale non erano sull'interfaccia SPI.
fest

30

Mentre mi piacerebbe immergermi nei vari metodi di programmazione disponibili, qualcun altro ha già. Ecco il tutorial di Dean Camera su AVRFreaks, metodi di programmazione AVR :

Esistono molti modi per programmare i microcontrollori AVR. Dato che molte persone chiedono domande diverse una volta o l'altra, ho pensato di descriverle qui in modo che le loro domande possano essere risolte in modo rapido ed efficiente. Per favore perdonami se mi manca un metodo o commetto un errore.

METODO 1: In System Programming (ISP)

Supportato da: Vasta maggioranza di AVR (vedi sotto messaggi)
Programmatori supportati: AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, AVRISP clones, AVR910 Programmers, AVRONE

Nella programmazione del sistema è forse il metodo più comune per programmare flash, EEPROM, fusibili e lockbyte dell'intera linea AVR. L'ISP può programmare AVR a frequenze di clock estremamente elevate (supponendo che l'AVR di destinazione funzioni ad alta frequenza e che il programmatore lo supporti) ed è il metodo di scelta per quasi tutti gli appassionati di AVR. Ci sono molti, molti cloni AVRISP e programmatori AVR910 sul mercato oltre a semplici dongle fai-da-te che si collegano alla porta parallela del tuo computer.

I recenti nuovi design della chiave hardware possono utilizzare la porta seriale del computer, tuttavia prove aneddotiche hanno affermato che questo metodo è estremamente lento a causa di limitazioni tecniche.

L'ISP richiede che l'AVR di destinazione funzioni a una frequenza di clock almeno pari a quattro volte quella dell'orologio ISP. Questa è una trappola comune e una fonte di confusione per molti nuovi AVR.

METODO 2: JTAG

Supportato da: vedere la guida di AVRStudio Tools per il supporto dei dispositivi MKI e MKII
Programmatori supportati: JTAG-ICE, JTAG-ICE MKII, Dragon, cloni JTAG-ICE, AVRONE, STK600 (solo programmazione)

Tecnicamente JTAG è un sistema di debug, non un metodo di programmazione. Tuttavia, l'interfaccia JTAG consente la programmazione di un AVR che lo supporta.

JTAG è uno strumento di debug nel sistema che consente di manipolare ed esaminare lo stato di un AVR supportato mentre è in esecuzione in un circuito. JTAG consente all'utente di interrompere l'esecuzione in qualsiasi momento, la manipolazione dei registri interni dell'AVR e molto altro.

Le unità JTAG-ICE ufficiali di ATMEL sono state sostituite dal JTAG-ICE MKII, che supporta il protocollo di debug DebugWire più recente e ampiamente supportato oltre alla programmazione tramite il metodo ISP (vedere sopra).

I cloni JTAG-ICE sono disponibili a prezzi bassi, tuttavia la loro compatibilità limitata con solo una manciata di AVR limita la loro utilità. Indipendentemente da ciò, se il tuo AVR supporta l'interfaccia JTAG, JTAG-ICE rimane un metodo di programmazione e un programmatore di debug molto efficace ed efficace.

METODO 3: DebugWire

Supportato da: Molti AVR più piccoli
Programmatori supportati: JTAG-ICE MKII, Dragon, AVRONE

Ancora una volta DebugWire è un debug piuttosto che un'interfaccia di programmazione, ma può essere utilizzato per caricare programmi in AVR supportati. L'interfaccia dW utilizza un singolo pin AVR (la linea / RESET) per tutte le comunicazioni, rendendolo ideale per i dispositivi AVR a basso numero di pin.

METODO 4: Bootloader

Supportato da: AVR più recenti
Programmatori supportati: N / D

Ancora una volta tecnicamente non è un metodo di programmazione. Un bootloader è un piccolo programma AVR che si trova in una sezione riservata impostabile dall'utente del normale flash. I bootloader utilizzano le funzionalità di auto-modifica flash disponibili nei nuovi AVR per consentire all'AVR di programmare se stesso tramite i dati di programma caricati da una fonte esterna. I bootloader possono estrarre i loro dati da qualsiasi posizione (ad esempio flash esterno o scheda SD), tuttavia il tipo più comune di Bootloader comunica con un PC tramite la porta RS-232 (seriale) dell'AVR.

I bootloader sono limitati in quanto consumano spazio flash (limitando la dimensione del flash disponibile per l'applicazione dell'AVR) e non sono in grado di modificare le fusebit dell'AVR.

I bootloader sono ampiamente disponibili su Internet per il download, ma soffrono di un problema "pollo e uova"; è necessario un altro tipo di programmatore elencato qui per programmare in primo luogo nel bootloader. Questo di solito è risolto dalla costruzione di un semplice dongle a porta parallela (vedere la sezione ISP) o dall'acquisto di un AVR già precaricato con un bootloader (ad esempio la scheda AVRButterfly).

METODO 5: Programmazione parallela ad alta tensione (HVPP)

Supportato da: La maggior parte degli AVR non TINY (con eccezioni)
Programmatori supportati: STK500, STK600, Dragon, Dongle Homebrew, AVRONE

La programmazione parallela ad alta tensione è un metodo di programmazione che viene utilizzato raramente, a causa della seccatura che richiede di impostare. Nonostante ciò, la programmazione HVPP è comunemente usata per "resuscitare" AVR le cui micce sono state configurate in modo errato tramite un altro metodo di programmazione.

Sia STK500 che Dragon supportano HVPP. Durante l'HVPP, il pin / RESET del target viene elevato al valore insolitamente alto di 12V che impegna i circuiti di programmazione parallela interna. Il pin / RESET è l'unico pin dell'AVR (sugli AVR supportati da HVPP) che può essere portato in sicurezza a questo livello.

Puoi creare il tuo dongle HVPP usando piani online come questo.

METODO 6: Programmazione seriale ad alta tensione (HVSP)

Supportato da: Molti AVR TINY (con eccezioni)
Programmatori supportati: STK500, STK600, Dragon, Dongle Homebrew, AVRONE

HVSP è simile a HVPP, tranne per il fatto che il trasferimento dei dati viene eseguito in serie anziché in parallelo. Questo è il metodo di programmazione alternativo utilizzato su molti AVR della serie TINY che non dispongono di pin sufficienti per HVPP.

METODO 7: PDI

Supportato da: XMEGA AVR
Programmatori supportati: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI è la nuova interfaccia di programmazione basata sul protocollo debugWire, per la linea di AVR XMEGA. Al momento non è utilizzato su nessun altro microcontrollore AVR a 8 bit.

METODO 8: TPI

Supportato da: AVR TINY a 6 pin (ATTINY10, ecc.)
Programmatori supportati: STK600, Dragon, AVRISP MKII

TPI è un'interfaccia di programmazione molto piccola per la nuova linea TINY di AVR con pin limitati, come ATTINY10 a 6 pin. Come dW, TPI utilizza la linea / RESET del dispositivo come parte dell'interfaccia di comunicazione, ma lì finisce la somiglianza. Poiché gli AVR TINY di dimensioni ridotte non dispongono di un circuito di debug su chip, il protocollo TPI utilizza una nuova interfaccia di programmazione a tre pin, in un protocollo half-duplex. Poiché la linea / RESET deve essere aumentata a + 12V per la programmazione quando è impostato il pin RSTDSB del dispositivo, questo è attualmente supportato solo dalla più recente scheda di programmazione STK600.

Sezione FAQ Bonus!

  1. Qual è il metodo migliore?
    Non esiste un metodo "migliore" universale. La programmazione ISP è semplice ed estremamente popolare, tuttavia tutti i metodi sopra indicati funzioneranno. Le due modalità di programmazione ad alta tensione (a seconda di quale è applicabile al tuo dispositivo) sono le più ricche di funzionalità, in quanto consentono la riparazione di un AVR che non ha configurato correttamente i suoi fusibili. Tuttavia, questi metodi sono un problema da configurare, quindi il motivo per cui la maggior parte degli utenti utilizza ISP.

  2. Ho creato un dongle con porta parallela. Posso usarlo con AVRStudio?
    Temo di no. AVRStudio non può interfacciarsi con nessun dongle "stupido" - richiede un dispositivo di programmazione intelligente - contenente un microcontrollore stesso - per decifrare il protocollo di comunicazione che invia. I dongle semplici senza un microcontrollore devono essere "sbattuti" (ovvero i segnali appropriati simulati attraverso il dongle tramite il computer) stesso.

  3. Quindi il mio dongle è inutile allora?
    No. Puoi comunque programmare tramite un dongle fatto in casa con uno strumento software di programmazione di terze parti. AVRDude è un'utilità della riga di comando valida, conosciuta e gratuita, inclusa nel pacchetto WinAVR.

  4. Quali sono le mie opzioni se voglio che il mio programmatore funzioni con AVRStudio?
    Scegli un programmatore che utilizza un protocollo supportato da AVRStudio. Questo può essere il semplice protocollo "AVR910" (obsoleto) o un'implementazione personalizzata del protocollo utilizzato da STK500 / AVRISP. Si noti che questi programmatori richiedono un microcontrollore, determinando una situazione di cattura 22. Ciò può essere risolto avendo l'AVR del programmatore preprogrammato al momento dell'acquisto con il firmware appropriato, o avendo l'AVR preprogrammato con un bootloader.

  5. Ok, voglio usare un bootloader. Come posso ottenerlo lì in primo luogo ?!
    Per utilizzare un bootloader in un AVR, devi prima aver programmato il bootloader. Se non hai un programmatore esistente (anche un semplice dongle stupido sarà sufficiente per la programmazione iniziale), puoi in alternativa acquistare AVR pre-programmati con un bootloader da diversi fornitori.
    Atmel produce anche la scheda demo Butterfly, il cui MEGA169 AVR è precaricato con un bootloader compatibile con AVR-Studio.

  6. Aiuto! Ho rovinato le micce e ho distrutto il mio AVR mentre usavo l'ISP! L'errore più comune è cambiare i fusibili di selezione dell'orologio in un'impostazione non valida. Prova a mettere un orologio esterno sul pin XTAL1 dell'AVR e vedi se questo aiuta.
    In caso contrario, se possibile utilizzare uno dei metodi ad alta tensione. Questi risolveranno eventuali errori di configurazione, compresi quelli che coinvolgono la sorgente di clock poiché i metodi ad alta tensione forniscono il proprio clock all'AVR per la programmazione.

  7. Come si interfaccia con il mio programmatore?
    Il software utilizzato per l'interfaccia con il programmatore dipende dal tipo di programmatore in uso.
    I dongle semplici "stupidi" richiedono software di terze parti, come PonyProg o AVRDude. Questi possono essere strumenti da riga di comando o GUI: guardati intorno sul Web e ne troverai uno adatto alle tue esigenze.
    Programmatori e bootloader basati sul protocollo AVR910 possono essere utilizzati all'interno di AVRStudio. Dal menu Strumenti, selezionare l'opzione "AVRProg" per aprire una schermata della GUI per l'interfaccia con il programmatore. In alternativa, anche strumenti di terze parti come AVRDude sono compatibili con AVR910.
    Gli strumenti ufficiali sono strettamente integrati in AVRStudio, specialmente nel caso delle varianti di debug (JTAG / Dragon / etc). Dal menu Strumenti AVRStudio, selezionare il sottomenu "Programma AVR ..." e fare clic sulla voce "Connetti". Dalla nuova finestra, selezionare lo strumento e la sua interfaccia di connessione e fare clic su OK.
    Come nel caso delle chiavi hardware e dei programmatori AVR910, gli strumenti ufficiali possono essere utilizzati anche con software di programmazione di terze parti.

(C) Dean Camera, 2009. Tutti i diritti riservati. Non per la riproduzione su siti Web diversi da AVRFreaks.net senza previa autorizzazione esplicita.

Riprodotto con previa autorizzazione esplicita, ovviamente!


5

Vorrei aggiungere un'altra cosa alla discussione.

SPI è un'interfaccia molto comune per i chip. L'allusione a 3 fili è la modalità di SPI in cui non si utilizza il pin di selezione del chip.

I2C è il principale contest per l'interfaccia in quanto utilizza solo 2 fili, indipendentemente dal numero di chip, mentre l'SPI richiede un altro filo per interfaccia, ma è più lento.

Quando insegno considero l'insegnamento delle interfacce uno dei compiti più importanti.

Wiki della comunità disponibile per coloro che vogliono espandere le mie informazioni.


2
Non ho mai sentito parlare di I2C utilizzato come interfaccia di programmazione flash nativa su un microcontrollore, anche se non c'è motivo per cui non possa essere il punto di accesso a un bootloader suppongo ...
vicatcu,

@vicatcu, l'ho appena aggiunto come interfaccia molto comune.
Kortuk,

3

Da un punto di vista generale queste interfacce differiscono solo in quali programmatori e quali microcontrollori le supportano. Fintanto che avrai una corrispondenza tra il programmatore e il microcontrollore non mi preoccuperò.

Man mano che approfondisci, scoprirai che sono i pin utilizzati dall'interfaccia sul microcontrollore che contano di più: se si utilizzano questi pin per i sensori, i segnali possono interferire durante la programmazione del dispositivo. La soluzione più semplice in questo caso è quella di disconnettere i sensori durante la programmazione.

Alcune interfacce (incluso JTAG) consentono il debug del dispositivo, ma è necessario un programmatore (e un software per guidarlo) che supporti anche questo. In una domanda precedente ero stato indirizzato a Dragon per il debug dei dispositivi AVR: ho intenzione di prenderne uno e giocare quando il mio attuale ciclo di progetti sta per concludersi.


2

Come menzionate seriale, vengono usate tutte le spi (2 fili, 3 fili?), Usb, jtag, swd, ecc.

Sì, ci sono pro e contro. Jtag, ad esempio, è per tutti i casi che conosco integrati nell'hardware, originariamente e principalmente utilizzati per qualcosa di diverso dal debug del processore, ma a loro volta lo usano anche per quello. se jtag è disponibile è generalmente la migliore interfaccia per quel motivo, ma ci sono eccezioni. Ad esempio se i pin non sono dedicati a jtag, potresti avere un bug nel codice e / o usare intenzionalmente uno di quei pin per qualcos'altro rendendo impossibile accedere al chip usando jtag (se avvia il software in flash che ripropone quei pin). Un'altra eccezione è se il core del processore può essere bloccato da un bug nel software nel flash e un core bloccato non è debuggabile tramite jtag. Lo definirei un bug nella progettazione hardware, ma di recente ho affrontato questo aspetto da un punto di vista commerciale.

Sull'AVR per esempio il PDI, che penso che la gente potrebbe chiamare spi qui, forse no. sembra almeno su xmega che il pdi e il jtag esterno inseriscano internamente un'interfaccia pdi comune. Quindi i pin PDI ti danno accesso diretto a questo anziché al sovraccarico di jtag. fintanto che questa interfaccia funziona quando il software in flash ha appeso il core, questa sarebbe l'interfaccia ideale per questa famiglia. Il protocollo è pubblicato e relativamente semplice e integrato nell'hardware. ha lo svantaggio di un bus dati bidirezionale, come i2c.

Arm ha un jtag con meno fili chiamati swd che non vogliono necessariamente essere pubblicati apertamente. gli strumenti open source lo stanno implementando però. questo è in teoria un jtag seriale, i diversi segnali jtag vengono inviati in sequenza su un filo in qualche modo anziché in parallelo su molti fili. all'interno della parte suppongo che venga di nuovo parallelizzato e alimenta la normale logica jtag. Questo ha lo svantaggio di ARM che vuole mantenerlo semi-segreto e che i debugger di jtag ARM sono un dolore reale da usare comunque. Quindi questo è molto lavoro. Se / quando openocd lo fa funzionare, potrebbe essere una storia diversa. Devi anche preoccuparti ancora dei perni riproposti e di ciò che accade con un nucleo sospeso.

Alcuni fornitori utilizzano una soluzione in cui hanno una o più aree flash di avvio, a seconda della modalità di estrazione di uno o due pin, a seconda del flash da cui si avvia. Quindi potresti avviarlo dal flash dell'utente, oppure potresti avviarlo da un flash che almeno dalla fabbrica ha un bootloader basato su porta seriale o uno che ha un bootloader basato su usb. Per ciascun fornitore, queste soluzioni software possono variare e variano, il protocollo seriale cambia in modo sottile o più che sottile, la soluzione USB può cambiare abbastanza. Il bello e il cattivo è che alcuni di questi flash si possono ottenere, quindi puoi scegliere di cambiare il bootloader seriale, questo è sia buono che cattivo, buono in quanto potresti scegliere di personalizzarlo per il tuo prodotto, male che sia possibile per cancellarlo accidentalmente e lateralmente la parte, almeno per quell'interfaccia.

Gli strumenti di Jtag costavano migliaia di dollari, ora non lo fanno, per circa $ 15 puoi ottenere una scheda breakout ftdi e riutilizzarla con openocd. Per $ 50 più o meno alcuni è possibile ottenere una soluzione USB basata su ftdi che funziona immediatamente con openocd. È possibile ottenere un j-link non commerciale per $ 75- $ 80. E poi ci sono quelli da mille dollari che sono veloci, sicuri ma non vale la pena in generale. Li acquisti quando sei una grande azienda con un sacco di soldi da spendere e vuoi pagare per il supporto. Quando paghi quei prezzi ottieni il prodotto che desideri e ottieni immediatamente risposte alle domande sul supporto tecnico. Come per esempio linux gratuito contro windows o RHEL, il supporto linux è gratuito ma ottieni quello che ottieni. Comunque questo rende jtag molto più attraente,

Dovresti avere nel tuo debug e sviluppo strumenti jtag di arsenale quando e dove abbordabile. sparkfun ha USB basato su ftdi su schede seriali e le parti ftdi possono essere riproposte in big banger, puoi usarle per spi o i2c o pdi o jtag o altre interfacce. Idealmente ottenere schede create per il bus / parte a cui si è interessati e utilizzare il software gratuito / open source che lo accompagna. Usando anche queste schede seriali, idealmente con una fornitura di 3,3 V e 5 V (circa $ 15 ciascuna quella utilizzata per lillypad e mini arduino, ecc.) Per il collegamento alle porte seriali per i vari micro che hanno una sorta di protocollo seriale. Trovo più facile scrivere il mio caricatore basato su quei protocolli, specialmente come le persone arduino / avr in cui è pubblicata la fonte bootloader ed è un sottoinsieme considerevole rispetto allo standard supposto che supportano. YMMV.

In breve, non esiste una buona soluzione, hanno tutti pro e contro. Preparati a supportarne almeno due. usb e serial o usb e jtag o jtag e serial, ecc. Basta appoggiare pad o fori sulla scheda e non necessariamente popolare. Per il tuo sviluppo personale o di laboratorio disponi di una suite completa di strumenti e preparati a passare da uno all'altro come chip di mattoni e devi recuperare schede o mentre sviluppi il tuo bootloader, il firmware USB, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.