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