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
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
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
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
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
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
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:
Postar um comentário