terça-feira, julho 08, 2014

Programador de "Alta Voltagem" para ATtiny - Introdução

Os programadores que eu normalmente utilizo com os microcontroladores AVR, como o USBTinyISP e o USBasp, efetuam a programação enviando comandos através de um interface serial (SPI), com sinais em nível lógico normal (normalmente 5V).

Embora este tipo de programação seja de fácil implementação e atenda as necessidades mais comuns, tem a desvantagem de poder ser bloqueada (proposital ou acidentalmente) através dos fuses. A programação em "alta voltagem" (na verdade 12V) é a solução para rehabilitar a programação serial. Vamos examinar como ela é feita no caso dos modelos ATtiny.

Bloqueando a Programação SPI

Existem três maneiras de bloquear a programação SPI através dos fuses:
  • Configurar uma fonte de clock que não esteja disponível.
  • Desabilitar explicitamente a programação
  • Reconfigurar o pino de Reset para E/S normal
No caso dos modelos ATtiny que tem um número pequeno de pinos, a terceira opção acima pode ser necessária para alguns projetos.

Usando a Programação Serial de Alta Voltagem (HVSP)

A descrição da HVSP pode ser encontrada na documentação dos ATtinys (por exemplo, nos itens 20.6 e 20.7 do manual completo do ATtinyx5).

Devido ao número limitado de pinos, a programação de alta  voltagem no ATtiny também é serial (nos modelos ATmega ela é paralela). Entretanto, ela utiliza três pinos de entrada (SII e SDI - entrada serial de instrução e entrada serial de dados - e SCI - entrada serial de clock), além de um pino de saída (SDO). O pino de Reset é utilizado para colocar o microcontrolador no modo HVSP. O ATtiny precisa estar alimentado com 5V, mas não precisa de clock externo.

O procedimento para entrar neste modo de programação é o seguinte:
  • Com a tensão de alimentação em 0V, colocar os pinos SII, SDI, SDO e Reset em 0V
  • Colocar 5V na alimentação. Ela precisa atingir pelo menos 1.8V em 20 uS.
  • Esperar um tempo entre 20 e 50 uS e colocar 12V (a "alta voltagem") no pino de Reset.
  • Manter em 0V os pinos SII, SDI e SDO por pelo menos 10uS
  • Deixar o pino SDO flutuar (durante a programação ele é uma saída)
  • Aguardar pelo menos 300uS antes de enviar comandos
Para sair do modo HVSP basta retornar o Reset ou a Alimentação a 0V.

Os Comandos no HVSP

O HVSP é um pouco esquisito pelo fato de termos dois valores sendo enviados serial e simultaneamente do programador para o microcontrolador. Cada transferência consiste em enviar serialmente 11 bits, pulsando SCI a cada bit. O primeiro e os dois últimos bits são sempre zero. Antes de fazer uma transferência deve-se aguardar que SDO esteja em nível alto. Ao mesmo tempo que são transferidos dois valores do programador para o microcontrolador, um valor é transferido no sentido contrário.

Existem comandos para apagar a flash, ler a identificação do microcontrolador e para ler e escrever fuses, flash e eeprom. Vejamos alguns detalhes dos comandos necessários para recuperar um ATtiny que esteja com a programação SPI desligada. Uma vez que 3 bits das transferências são sempre zero, podemos considerar que em cada transferência são escritos um byte de dado (SDI) e um byte de instrução (SII).

Chip Erase

O chip erase é um comando importante, pois é a única forma de limpar os bits de lock (que podem impedir a leitura e escrita da Flash). Além de limpar o lock, este comando irá sempre apagar a Flash. Dependendo de um fuse, pode ou não apagar também a EEProm.

 São necessárias três transferências para comandar um Chip Erase:
  • SDI = 0x80, SII = 0x4C
  • SDI = 0x00, SII = 0x64
  • SDI = 0x00, SII = 0x6C
Após a última transferência aguardar SDO retornar a nível alto para indicar o fim do apagamento.

Leitura da Identificação

A identificação são três bytes que informam qual o modelo do microcontrolador. Isto permite conferir que estamos com o chip correto e determinar os valores corretos para os fuse.

A sequência para obter os três bytes de identificação (numerados de 0 a 2) é o seguinte:
  • SDI = 0x08, SII = 0x4C
  • Para cada byte:
    • SDI = número do byte, SII = 0x0C
    • SDI = 0x00, SII = 0x68
    • SDI = 0x80, SII = 0x6C, SDO = byte da identificação
Leitura dos Lock Bits

Os lock bits são dois bits que controlam a escrita (bit 1) e leitura (bit 0) da Flash e EEprom por programadores externos. Quando qualquer um dos locks for ativado a programação dos fuses é inibida.A proibição da leitura proíbe também a escrita. Como nos fuses, o valor 0 indica ativado e 1 desativado.

Uma vez ativado um lock bit, a única forma de desativá-lo é através do Chip Erase, que primeiro apaga a memória. A proteção contra escrita pode ser usada para se proteger contra alterações acidentais. Já a proteção contra leitura tem a finalidade de esconder o programa.

A sequência de leitura é:
  • SDI = 0x04, SII = 0x4C
  • SDI = 0x00, SII = 0x78
  • SDI = 0x00, SII = 0x7C, SDO são os bits de lock (nos dois bits menos significativos)

Escrita dos Lock Bits

A escrita segue a seguinte sequência:
  • SDI = 0x20, SII = 0x4C
  • SDI = lock, SII = 0x2C
  • SDI = 0x00, SII = 0x64
  • SDI = 0x00, SII = 0x6C
Lembrar que 0 protege e que uma vez ligada uma proteção os bits não podem mais ser alterados.

Leitura dos Fuses

A leitura dos fuses é semelhante à leitura dos bits de lock, porém os valores para SII no segundo e terceiro passo são diferentes:
  • LFUSE: 0x68, 0x6C
  • HFUSE: 0x7A, 0x7E
  • EFUSE: 0x6A, 0x6E
O significado dos fuses pode ser visto nos datasheets ou em http://www.engbedded.com/fusecalc/.

Escrita dos Fuses

A escrita dos fuses também é semelhante à leitura do lock. Os valor para DI no primeiro passo é 0x40 e os valores para SII nos dois passos finais mudam conforme o fuse a escrever:
  • LFUSE: 0x64, 0x6C
  • HFUSE: 0x74, 0x7C
  • EFUSE: 0x66, 0x6E


No próximo post veremos o hardware necessário para realizar a programação a partir de um Arduino.

09/07/14: Corrigida a escrita dos fuses.

Nenhum comentário: