O comando para limpar a Flash é o Chip Erase. Alguns detalhes importantes:
- Dependendo do bit EESAVE dos fuses, a EEProm poderá ser apagada junto com a Flash.
- Após o apagamento da memória os "Lock bits" são limpos. Estes bits podem impedir a leitura e escrita da Flash, uma vez ligados a única forma de desligá-los é fazendo Chip Erase.
- O Chip Erase não altera os fuses
- Setar XA1=1 e XA0=0, para indicar que vamos enviar um comando
- Setar BS1=0 para indicar que vamos transferir um byte menos significativo
- Colocar o código do comando (0x80) nos pinos de dados
- Pulsar o sinal XTAL1 para carregar o comando no ATmega
- Colocar o sinal WR em nível baixo e retorná-lo ao nível alto, para iniciar o apagamento.
- O sinal RDY vai para o nível baixo, indicando que o ATmega está ocupado processando o comando.
- Aguardar o sinal RDY retornar ao nível alto, indicando o fim do apagamento.
Como ainda não estudamos a leitura da Flash por enquanto não vamos conferir o resultado do apagamento.
Para completar a "limpeza" do ATmega vamos gravar os valores padrões nos fuses. A gravação dos fuses requer os seguintes passos:
- Setar XA1=1 e XA0=0, para indicar que vamos enviar um comando
- Setar BS1=0 para indicar que vamos transferir um byte menos significativo
- Colocar o código do comando (0x40) nos pinos de dados
- Pulsar o sinal XTAL1 para carregar o comando no ATmega
- Setar XA1=0 e XA0=1, para indicar que vamos enviar um dado
- Setar BS1=0 para indicar que vamos transferir um byte menos significativo
- Colocar o novo valor do fuse nos pinos de dados
- Pulsar o sinal XTAL1 para carregar o comando no ATmega
- Selecionar o fuse através do sinais BS1 e BS2 (ver abaixo)
- Colocar o sinal WR em nível baixo e retorná-lo ao nível alto, para iniciar a gravação.
- O sinal RDY vai para o nível baixo, indicando que o ATmega está ocupado processando o comando.
- Aguardar o sinal RDY retornar ao nível alto, indicando o fim da gravação.
- Retornar os sinais BS1 e BS2 para o nível baixo
O código completo (Apaga) está no meu github. Abaixo as rotinas que implementam os passos listados acima e mais a leitura do fuse.
// Dispara o apagamento da Flash
void ATmega_Erase() {
// Envia o comando
ATmega_SendCmd(CMD_APAGA);
// Dispara o apagamento
digitalWrite (pinWR, LOW);
delayMicroseconds(1);
digitalWrite (pinWR, HIGH);
delayMicroseconds(1);
// Aguarda o fim da gravação
while (digitalRead(pinRdy) == LOW) {
delay(10);
}
}
// Grava um fuse do ATmega
void ATmega_WriteFuse (int bs1, int bs2, byte valor) {
// Envia o comando
ATmega_SendCmd(CMD_GRAVAFUSES);
// indica que vai enviar um dado
digitalWrite (pinXA0, HIGH);
digitalWrite (pinXA1, LOW);
// Seleciona low byte
digitalWrite (pinBS1, LOW);
// Coloca o dado na via de dados
PCF8574_Write(valor);
// Pulsa XTAL1 para registrar o dado
pulsaXTAL1();
// Seleciona o fuse
digitalWrite (pinBS1, bs1);
digitalWrite (pinBS2, bs2);
// Dispara a gravação
digitalWrite (pinWR, LOW);
delayMicroseconds(1);
digitalWrite (pinWR, HIGH);
delayMicroseconds(1);
// Aguarda o fim da gravação
while (digitalRead(pinRdy) == LOW) {
delay(10);
}
// Volta os sinais para o default
digitalWrite (pinBS1, LOW);
digitalWrite (pinBS2, LOW);
}


Nenhum comentário:
Postar um comentário