Microcontroladores de programação: JTAG, SPI, USB oh my !?

52

Eu notei que, no que diz respeito aos microcontroladores, existem várias maneiras de programá-los. Estou meio familiarizado com USB, pois meu Arduino pode ser programado via USB.

O que é uma interface JTAG ou SPI?

Por fim, sei que essas interfaces fornecem um meio de atualizar o chip com novas instruções, mas como elas diferem? Existem vantagens de um sobre o outro?

jdiaz
fonte

Respostas:

39

Os microcontroladores ATMEGA, como o do arduino que vem diretamente da fábrica, só podem ser programados usando a interface SPI ou JTAG.

SPI significa Interface Periférica Serial e é uma maneira de os microcontroladores se comunicarem entre si ou com o mundo exterior. Às vezes, também é chamado de 3 fios porque usa três fios para se comunicar. Para programar um chip, você precisará de um programador especial que leia comandos do USB para conduzir as linhas SPI para programar o chip. Um popular parece ser o USBTinyISP da Adafruit . Uma introdução muito boa à programação SPI está no SparkFun. Os aplicativos mais populares para programar os chips Atmel AVR são avrdude (linha cmd), ponyprog (não funciona com programadores mais recentes) e, em alguns casos, AVR Studio (se o seu programador suportar). A vantagem da programação SPI é que você pode programar qualquer chip Atmel diretamente da fábrica para não precisar sempre de um Arduino em seus projetos.

Onde o SPI é "apenas mais um protocolo serial", o JTAG é um protocolo especialmente projetado para programar e depurar microcontroladores. Nem todos os micro Atmel suportam JTAG, mas os que são usados ​​no Arduino fazem. O protocolo JTAG pode ser usado para coisas interessantes, como "emulação de circuito" e depuração, o que significa que permite ver o estado do programa no seu microcontrolador enquanto ele estiver em execução. Para fazer isso, você precisará de um programador especial. Vi minha resposta para outra pergunta .

Para programar um chip usando USB, você terá que programá-lo primeiro com um "gerenciador de inicialização" usando SPI ou JTAG. Uma vez carregado com o carregador de inicialização, o sistema será programável em qualquer PC usando um conversor USB-Serial. A desvantagem é que o carregador de inicialização ocupa algum espaço de memória e esse método não permite que você veja o estado do chip enquanto está em execução.

bpijls
fonte
10
Embora exacta na ideia de que um carregador de inicialização serial não esteja disponível em um novo ATMEGA (embora esteja em muitos outros microcontroladores), a alegação de que SPI ou JTAG deve ser usado está incorreta. Os ATMEGAs também suportam um modo de programação paralela de alta tensão, que tem a capacidade de substituir algumas configurações de fusíveis que tornariam impraticáveis ​​os métodos de programação em circuito mais populares. O JTAG não foi projetado para programar micros, mas para testar placas de PC, registrando valores dentro e fora dos registros de pinos de E / S. Estendê-lo para programar ou depurar as principais funções foi um hack posterior.
Chris Stratton
SPI e In System Programming / Serial são diferentes. Eu também estava acostumado ao fato de que muitos dos MCUs Atmega menores tinham pinos de programação serial na interface SPI, mas fui mordido pelo fato de que em alguns dos MCUs Atmega maiores, os pinos de programação serial não estavam na interface SPI.
fest
30

Embora eu adorasse mergulhar nos vários métodos de programação disponíveis, alguém já o fez. Aqui está o tutorial de Dean Camera sobre AVRFreaks, métodos de programação AVR :

Existem várias maneiras de programar microcontroladores AVR. Como muitas pessoas perguntam sobre diferentes de uma vez ou outra, pensei em descrevê-las aqui para que suas perguntas possam ser respondidas rápida e eficientemente. Por favor, perdoe-me se eu perder um método ou cometer um erro.

MÉTODO 1: Na Programação do Sistema (ISP)

Compatível com: Grande maioria dos AVRs (veja as postagens abaixo)
Programadores suportados: AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, clones AVRISP, Programadores AVR910, AVRONE

Na programação do sistema, talvez seja o método mais comum de programação do flash, EEPROM, fusível e bloqueio de bytes de toda a linha do AVR. O ISP pode programar AVRs com taxas de clock extremamente altas (assumindo que o AVR alvo esteja sendo executado em alta frequência e o programador o suporte) e é o método de escolha para quase todos os entusiastas do AVR. Existem muitos clones AVRISP e programadores AVR910 no mercado, além de dongles simples do tipo faça você mesmo que se conectam à porta paralela do computador.

Projetos recentes de novos dongles podem usar a porta serial do computador, no entanto, evidências anedóticas dizem que esse método é extremamente lento devido a limitações técnicas.

O ISP exige que o AVR de destino esteja sendo executado a uma taxa de clock de pelo menos quatro vezes a do clock do ISP. Esta é uma armadilha comum e uma fonte de confusão para muitos novos nos AVRs.

MÉTODO 2: JTAG

Compatível com: Consulte a ajuda do AVRStudio Tools para suporte a dispositivos MKI e MKII
Programadores suportados: JTAG-ICE, JTAG-ICE MKII, Dragon, clones JTAG-ICE, AVRONE, STK600 (somente programação)

Tecnicamente, o JTAG é um sistema de depuração, não um método de programação. Ainda assim, a interface JTAG permite a programação de um AVR que o suporta.

O JTAG é uma ferramenta de depuração no sistema que permite manipular e examinar o status de um AVR suportado enquanto ele está sendo executado em um circuito. O JTAG permite ao usuário interromper a execução a qualquer momento, a manipulação dos registros internos do AVR e muito mais.

As unidades oficiais JTAG-ICE da ATMEL foram substituídas pelo JTAG-ICE MKII, que suporta o mais novo e mais amplamente suportado no protocolo de depuração DebugWire da faixa AVR, bem como a programação pelo método ISP (veja acima).

Os clones JTAG-ICE estão disponíveis a preços baixos, no entanto, sua compatibilidade limitada com apenas alguns AVRs limita sua utilidade. Independentemente disso, se o seu AVR suportar a interface JTAG, o JTAG-ICE continuará sendo um método e programador de depuração e programa muito agradáveis ​​e eficazes.

MÉTODO 3: DebugWire

Suportado por: Muitos AVRs menores
Programadores suportados: JTAG-ICE MKII, Dragon, AVRONE

Novamente, o DebugWire é uma interface de depuração em vez de uma interface de programação, mas pode ser usado para carregar programas em AVRs suportados. A interface dW usa um único pino AVR (a linha / RESET) para todas as comunicações, tornando-o ideal para os dispositivos AVR de baixa contagem de pinos.

MÉTODO 4: Carregador de Inicialização

Compatível com: AVRs mais recentes
Programadores suportados: N / A

Novamente, tecnicamente, não é um método de programação. Um carregador de inicialização é um pequeno programa AVR que fica em uma seção reservada e configurável pelo usuário do flash comum. Os gerenciadores de inicialização usam os recursos de autod Modificação do flash disponíveis nos AVRs mais recentes para permitir que o AVR se programe por meio de dados do programa carregados de uma fonte externa. Os gerenciadores de inicialização podem obter seus dados de qualquer local (por exemplo, flash de dados externo ou cartão SD); no entanto, o tipo mais comum de gerenciador de inicialização se comunica com um PC através da porta RS-232 (serial) do AVR.

Os gerenciadores de inicialização são limitados, pois consomem espaço em flash (limitando o tamanho do flash disponível para o aplicativo do AVR) e não conseguem alterar os fusebits dos AVRs.

Os gerenciadores de inicialização estão amplamente disponíveis na Internet para download, mas sofrem de um problema de "galinha e ovo"; você precisa de outro tipo de programador listado aqui para programar no gerenciador de inicialização em primeiro lugar. Isso geralmente é resolvido pela construção de um dongle de porta paralela simples (consulte a seção ISP) ou pela compra de um AVR já pré-carregado com um gerenciador de inicialização (por exemplo, a placa AVRButterfly).

MÉTODO 5: Programação Paralela em Alta Tensão (HVPP)

Compatível com: A maioria dos AVRs não-TINY (com exceções)
Programadores suportados: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

A programação paralela de alta tensão é um método de programação raramente usado, devido ao aborrecimento necessário para a instalação. Apesar disso, a programação HVPP é comumente usada para "ressuscitar" AVRs cujos fusebits foram configurados incorretamente por outro método de programação.

Tanto o STK500 quanto o Dragon suportam HVPP. Durante o HVPP, o pino / RESET do alvo é elevado para um valor incomumente alto de 12V, que aciona o circuito interno de programação paralela. O pino / RESET é o único pino do AVR (em AVRs compatíveis com HVPP) que pode ser elevado com segurança até esse nível.

Você pode criar seu próprio dongle HVPP usando planos on-line como este.

MÉTODO 6: Programação serial de alta tensão (HVSP)

Suportado por: Muitos TINY AVRs (com exceções)
Programadores suportados: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

O HVSP é semelhante ao HVPP, exceto que a transferência de dados é realizada em série e não em paralelo. Este é o método de programação alternativo usado em muitos AVRs da série TINY que não possuem pinos suficientes para HVPP.

MÉTODO 7: PDI

Compatível com: XMEGA AVRs
Programadores suportados: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI é a nova interface de programação baseada no protocolo debugWire, para a linha de AVRs XMEGA. Atualmente, não é usado em nenhum outro microcontrolador AVR de 8 bits.

MÉTODO 8: TPI

Compatível com: AVRs TINY de 6 pinos (ATTINY10, etc.)
Programadores suportados: STK600, Dragon, AVRISP MKII

O TPI é uma interface de programação muito pequena para a nova linha de AVRs TINY com pinos limitados, como o ATTINY10 de 6 pinos. Como o dW, o TPI usa a linha / RESET do dispositivo como parte da interface de comunicação, mas a semelhança termina. Como os TINY AVRs de tamanho pequeno não possuem um circuito de depuração no chip, o protocolo TPI usa uma nova interface de programação de três pinos, em um protocolo half-duplex. Como a linha / RESET precisa ser aumentada para + 12V para programação quando o pino RSTDSB do dispositivo estiver definido, atualmente isso é suportado apenas pela placa de programação STK600 mais recente.

Seção de Perguntas frequentes sobre bônus!

  1. Qual é o melhor método?
    Não existe um método "melhor" universal. A programação do ISP é simples e extremamente popular, no entanto, todos os métodos acima funcionarão. Os dois modos de programação de alta tensão (o que for aplicável ao seu dispositivo) são os mais ricos em recursos, pois permitem o reparo de um AVR que teve seus fusíveis configurados incorretamente. No entanto, esses métodos são difíceis de configurar, daí o motivo pelo qual a maioria dos usuários acompanha o ISP.

  2. Eu fiz um dongle de porta paralela. Posso usá-lo com o AVRStudio?
    Receio que não. O AVRStudio não pode interagir com nenhum dongles "burro" - requer um dispositivo de programação inteligente - contendo um microcontrolador - para decifrar o protocolo de comunicação que ele envia. Os dongles simples sem um microcontrolador devem ser "bit-banged" (ou seja, os sinais apropriados simulados através do dongle através do computador).

  3. Então meu dongle é inútil, então?
    Não. Você ainda pode programar através de um dongle caseiro com uma ferramenta de software de programação de terceiros. O AVRDude é um utilitário de linha de comando bom, conhecido e gratuito - e vem incluído no pacote WinAVR.

  4. Quais são minhas opções se eu quiser que meu programador trabalhe com o AVRStudio?
    Escolha um programador que use um protocolo suportado pelo AVRStudio. Pode ser o protocolo "AVR910" simples (descontinuado) ou uma implementação personalizada do protocolo usado pelo STK500 / AVRISP. Observe que esses programadores exigem um microcontrolador, levando a uma situação de confusão. Isso pode ser resolvido com o AVR do programador pré-programado no momento da compra com o firmware apropriado ou com o AVR pré-programado com um gerenciador de inicialização.

  5. Ok, eu quero usar um gerenciador de inicialização. Como faço para chegar lá em primeiro lugar ?!
    Para usar um gerenciador de inicialização em um AVR, primeiro é necessário programar o gerenciador de inicialização. Se você não possui um programador (mesmo um simples dongle burro será suficiente para a programação inicial), você pode comprar AVRs pré-programados com um programa alternativo. gerenciador de inicialização de vários fornecedores.
    A Atmel também fabrica a placa de demonstração Butterfly, cujo MEGA169 AVR vem pré-carregado com um carregador de inicialização compatível com o AVR-Studio.

  6. Socorro! Eu estraguei os fusíveis e destruí meu AVR enquanto usava o ISP! O erro mais comum é alterar os fusíveis de seleção do relógio para uma configuração inválida. Tente colocar um relógio externo no pino XTAL1 do AVR e veja se isso ajuda.
    Se isso não for possível, use um dos métodos de alta tensão. Isso corrigirá qualquer configuração incorreta, incluindo as que envolvem a fonte do relógio, pois os métodos de alta tensão fornecem seu próprio relógio ao AVR para programação.

  7. Como faço para interagir com meu programador?
    O software que você usa para interagir com o programador depende do tipo de programa que você está usando.
    Os dongles "burros" simples requerem software de terceiros, como PonyProg ou AVRDude. Essas podem ser ferramentas de linha de comando ou GUI - procure na Web e você irá multá-lo para atender às suas necessidades.
    Programadores e gerenciadores de inicialização baseados no protocolo AVR910 podem ser usados ​​no AVRStudio. No menu Ferramentas, selecione a opção "AVRProg" para abrir uma tela de interface gráfica com o seu programador. Como alternativa, ferramentas de terceiros como o AVRDude também são compatíveis com o AVR910.
    As ferramentas oficiais estão totalmente integradas ao AVRStudio, especialmente no caso das variantes de depuração (JTAG / Dragon / etc). No menu Ferramentas do AVRStudio, selecione o submenu "Programa AVR ..." e clique no item "Conectar". Na nova janela, selecione sua ferramenta e sua interface de conexão e clique em ok.
    Como é o caso dos dongles burros e dos programadores AVR910, as ferramentas oficiais também podem ser usadas com software de programação de terceiros.

(C) Dean Camera, 2009. Todos os direitos reservados. Não para reprodução em qualquer site que não seja o AVRFreaks.net sem permissão prévia e explícita.

Reproduzido com permissão explícita prévia, é claro!

tyblu
fonte
5

Eu gostaria de acrescentar mais uma coisa à discussão.

SPI é uma interface muito comum para chips. A alusão a 3 fios é o modo de SPI em que você não usa o pino de seleção do chip.

O I2C é o principal concurso de interface, pois usa apenas 2 fios, independentemente do número de chips, enquanto o SPI exige outro fio por interface, mas é mais lento.

Ao ensinar, considero o ensino de interfaces uma das tarefas mais importantes.

Wiki da comunidade disponível para aqueles que desejam expandir minhas informações.

Kortuk
fonte
2
Eu nunca ouvi falar de I2C sendo usado como uma interface de programação de flash nativo em um microcontrolador, embora não há nenhuma razão que não poderia ser o ponto de entrada para um bootloader suponho ...
vicatcu
@ Vicatcu, eu estava apenas adicionando-o como uma interface muito comum.
Kortuk
3

Do ponto de vista geral, essas interfaces diferem apenas em quais programadores e quais microcontroladores os suportam. Contanto que você tenha uma correspondência entre o programador e o microcontrolador, não me preocuparia.

À medida que você avança mais, você descobrirá que são os pinos que a interface usa no microcontrolador que importam mais - se você estiver usando esses pinos para sensores, os sinais poderão interferir quando você estiver programando o dispositivo. A solução mais simples, caso isso ocorra, é desconectar os sensores durante a programação.

Algumas interfaces (incluindo JTAG) permitem a depuração do dispositivo - mas você precisa de um programador (e software para controlá-lo) que também suporte isso. Em uma pergunta anterior, fui apontado para o Dragon por depurar dispositivos AVR - pretendo obter um e jogar quando minha rodada de projetos atual estiver quase concluída.

JohnC
fonte
2

Como você menciona serial, spi (2 fios, 3 fios?), Usb, jtag, swd, etc, são todos usados.

Sim, existem prós e contras. O Jtag, por exemplo, é para todos os casos que conheço sobre o hardware, originalmente usado principalmente para algo que não seja a depuração do processador, mas eles também o usam para isso. se jtag estiver disponível, geralmente é a melhor interface por esse motivo, mas há exceções. Por exemplo, se os pinos não forem dedicados ao jtag, você poderá ter um erro no código e / ou usar intencionalmente um desses pinos para outra coisa, tornando impossível acessar o chip usando o jtag (se ele inicializar o software em flash que redireciona esses pinos). Outra exceção é se o núcleo do processador puder ser travado por um bug no software no flash e um núcleo travado não puder ser depurado via jtag. Eu chamaria isso de bug no design do hardware, mas recentemente lidei com isso em uma parte comercial.

No AVR, por exemplo, o PDI, que eu acho que as pessoas podem chamar de spi aqui, talvez não. parece pelo menos no xmega que o pdi e o jtag externo alimentam internamente uma interface comum do pdi. Portanto, os pinos do pdi fornecem acesso direto a isso, em vez da sobrecarga jtag. contanto que essa interface funcione quando o software em flash tiver pendurado o núcleo, essa seria a interface ideal para essa família. O protocolo é publicado e relativamente simples e integrado ao hardware. ele tem a desvantagem de um barramento de dados bidirecional, como o i2c.

Arm tem um jtag com menos fios chamados swd, que eles não necessariamente desejam publicamente. as ferramentas de código aberto estão implementando isso. isto é, em teoria, um jtag serial, os diferentes sinais jtag são enviados seqüencialmente em um fio de alguma forma, em vez de em paralelo em muitos fios. dentro da parte, presumo que ele fica paralelizado novamente e alimenta a lógica jtag normal. Isso tem a desvantagem de o ARM querer mantê-lo semi-secreto, e os ARMs jtag debuggers são uma dor real de usar de qualquer maneira. Então, isso é muito trabalho. Se / quando o openocd fizer funcionar, pode ser uma história diferente. Você também precisa se preocupar com pinos reajustados e o que acontece com um núcleo pendurado.

Vários fornecedores usam uma solução em que têm uma ou mais áreas de flash de inicialização, dependendo de como um pino ou dois ou três são puxados, dependendo de qual flash você inicializa. Portanto, você pode inicializar a partir do flash do usuário ou a partir de um flash que tenha pelo menos de fábrica um carregador de inicialização baseado em porta serial ou um que tenha um carregador de inicialização baseado em USB. Para cada fornecedor, essas soluções de software podem variar e variam, o protocolo serial muda de maneira sutil ou mais que sutil, a solução usb pode mudar um pouco. O bom e o ruim é que alguns desses flashes podem ser encontrados, portanto, você pode optar por alterar o carregador de inicialização serial, isso é bom e ruim, bom porque você pode optar por personalizá-lo para o seu produto, ruim que seja possível para apagá-lo acidentalmente e moldar a peça, pelo menos para a interface.

As ferramentas Jtag costumavam custar milhares de dólares, agora não custam, por cerca de US $ 15, você pode obter um quadro de ftdi e adaptá-lo novamente com o openocd. Por US $ 50 mais ou menos alguns, você pode obter uma solução usb baseada em ftdi que funciona imediatamente com o openocd. Você pode obter um j-link não comercial por US $ 75 a US $ 80. E existem os multi-mil dólares que são rápidos, com certeza, mas não valem o dinheiro em geral. Você as compra quando você é uma grande corporação com muito dinheiro para gastar e quer pagar por suporte. Quando você paga esses preços, obtém o produto desejado e obtém respostas para as perguntas de suporte técnico imediatamente. Como linux grátis vs windows ou RHEL, por exemplo, o suporte ao linux é gratuito, mas você obtém o que recebe. De qualquer forma, isso torna a jtag muito mais atraente,

Você deve ter nas ferramentas jtag do arsenal de depuração e desenvolvimento, quando e onde acessível. O sparkfun possui usb para placas seriais baseadas em ftdi e as peças de ftdi podem ser reutilizadas em big bangers, você pode usá-las para spi ou i2c ou pdi ou jtag ou outras interfaces. Idealmente, obtendo placas feitas para o barramento / peça em que você está interessado e usando o software de código aberto / gratuito que a acompanha. Também usando essas placas seriais, idealmente, com um suprimento de 3,3V e 5V (cerca de US $ 15 cada um que você usa para lillypads e arduino minis, etc.) para conectar-se às portas seriais dos vários micros que possuem algum tipo de protocolo serial. Acho mais fácil escrever meu próprio carregador com base nesses protocolos, especialmente no pessoal do arduino / avr onde a fonte do carregador de inicialização é publicada e é um subconjunto considerável do suposto padrão que eles suportam. YMMV.

Em suma, não existe uma boa solução, todos eles têm prós e contras. Esteja preparado para apoiar pelo menos dois deles. usb e serial ou usb e jtag ou jtag e serial, etc. Basta colocar almofadas ou furos na placa e não necessariamente preencher. Para o seu desenvolvimento pessoal ou de laboratório, tenha um conjunto completo de ferramentas e esteja preparado para mudar de um para outro à medida que trabalha com chips e precisa recuperar placas ou enquanto desenvolve seu próprio gerenciador de inicialização, firmware USB, etc.

old_timer
fonte