quinta-feira, fevereiro 16, 2017

28C64 Programming Blues

Aviso: este é um relato frustrante. É comum eu me deparar com problemas inesperados durante os meus projetos, mas normalmente uma boa dose de insistência e estudo leva a uma explicação e solução satisfatória. No caso das minhas experiências com as memórias EEProm do tipo 28C64 eu consegui achar uma forma de programá-las mas não tenho uma explicação melhor que "software buggado".

As vítimas dos meus experimentos

O kit RC2014 vem com o firmware gravado em uma memória 27C512R, que é uma memória que pode ser gravada apenas uma vez (para sermos mais precisos, é uma EPROM que não possui a janela para realizar o apagamento, impedindo retornar para "1" os bits gravados em "0"). Obviamente isto dificulta e encarece experiências com novos firmwares.

Uma primeira opção é uma 27C512 normal, com a janela para apagamento por exposição à luz ultravioleta. Eu comprei algumas e o Garoa tem um apagador, mas ainda é um processo desajeitado. Em breve falo um pouco sobre isto, para fechar uma série interrompida de posts sobre EProms.

Analisando outras opções eu encontrei a "família" de memórias 28C. Estas memórias são do tipo EEProm, "memória programável eletricamente apagável", uma variação das memórias flash com a possibilidade de apagar trechos pequenos. Os modelos que achei com mais frequência são os do tipo 28C64, com capacidade de 8KBytes (o que corresponde ao bloco endereçável da memória Rom no RC2014). As diversas memórias 27xxx e 28xxx seguem um mesmo posicionamento dos pinos de endereço e dados, simplificando o suporte a vários modelos na mesma placa.

Na loja onde eu fiz a compra tinha dois modelos de 28C64. Um deles era o X28HC64 da Xicor, que foi o fabricante da primeira memória EEProm que eu conheci (no começo dos anos 80, quando a memória se chamava NVRAM e tinha alguns poucos bytes, mas permitiu implementar a configuração de terminais por menus em tela ao invés dos desajeitados jumpers e dipswitches). Na minha ingenuidade, neste momento eu achava que todas as 28C64 eram iguais (exceto por tempos de acesso).

A leitura do datasheet da X28HC64 foi muito animadora. Tempo de leitura baixo, sinais de controle simples, leitura e gravação com alimentação de 5V, gravação direta byte a byte (a memória cuida de tudo internamente). A única complicação era um esquema de proteção da memória contra escrita, que num primeiro momento me pareceu poder ignorar.



Com a memória em mãos, era hora de experimentar ler e gravar. Inicialmente eu tentei um gravador antigo, com conexão a PC via porta paralela e software feito para o Windows 98, que rodava em um micro com Windows XP mas não rodava em outro. O software tinha duas opções, 28(H)(C)64 e 28(H)(C)64B, O teste de memória "vazia" (preenchida com FF) funcionou, mas a programação não.



Testes com este gravador com a 27C512 também não tiveram bom resultado e acabei decidindo por investir em um gravador mais moderno, com interface USB. O modelo que eu comprei é um bastante usado por hobbistas, o TL866, que tem a X28C64 na lista de memórias suportadas.



Com o novo gravador eu tinha certeza que tudo ia dar certo... mas não deu. Meio em desespero eu tentei as várias opções de 28C64 disponíveis no TL866. No final dos testes, uma das minhas memórias estava funcionando e duas não (e eu não lembrava o que eu tinha feito!). Olhando com mais atenção, reparei que algumas opções na tela dependiam do modelo escolhido: apagamento e proteção/desproteção da memória.

X28C64: Proteção, mas sem apagamento

AM28C64B: Não tem opções de apagamento nem proteção

Foi aí que resolvi procurar mais alguns datasheets e ver as diferenças entre modelos:
  •  A X28HC64 da Xicor não possui nenhuma operação especial de apagamento (se desejado deve ser feita uma gravação de FF em todas as posições). Mas possui um mecanismo de proteção/desproteção através de uma sequência mágica de escrita de determinados valores em determinados endereços. Ela possui também um modo de escrita por página, que permite gravar mais rapidamente uma sequência de até 64 bytes. O fim de uma operação de escrita pode ser determinado de duas formas: enquanto a escrita não é concluída uma leitura da posição retorna no bit 7 o contrário do que foi escrito e o bit 6 alterna de valor a cada leitura.
  • A AT28C64 da Atmel não possui a proteção/desproteção nem a escrita por página. A determinação do fim da escrita só pode ser determinado pelo bit 7. E ela tem uma opção de apagamento da memória que envolve colocar 12V em um dos pinos.
  • A AT28C64B da Atmel é semelhante à X28HC64 da Xicor, mas tem o apagamento com o uso de 12V (ligeiramente escondido no datasheet).

Neste ponto eu percebi que poderia ter acidentalmente torrado as minhas memórias, caso o gravador tenha colocado os tais 12V em um dos pinos. As memória foram para a caixa de "suspeitos" (uma caixa onde entra muita coisa mas quase nada sai) e eu resolvi comprar umas AT28C64B para mais testes.


Novamente a gravação não funcionou! O resultado foi esquisito: blocos de 32 bytes não gravados se alternando com blocos de 32 bytes gravados corretamente .

Resultado da verificação, reparar que para a AT28C64B tem a opção de apagamento

Depois de algumas tentativas, achei um quebra galho. Seleciono a Atmel AT28C64B e mando gravar FF, para desligar a proteção contra escrital. Depois disso consigo gravar selecionado a AMD AM28C64B, que não apresenta na tela nem proteção nem apagamento (não achei o datasheet deste modelo). Selecionando a AM28C64B eu também consigo programar a X28HC64 desprotegida que sobrou.

Minha melhor explicação é que o software do gravador TL866 está com os parâmetros errados para a gravação da X28HC64 e  da AT28C64B. Talvez esteja tentando usar erradamente a gravação por página (para gravar 64 bytes de forma rápida). Talvez esteja com alguma temporização errada. Como disse, é frustrante.

Um comentário:

Professor Valfredo Curso de Eletrônica disse...

Confirmo a experiência do colega. No meu caso precisei gravar 6 EEPROMs M28C64 da ST Microeletrônics. Selecionando o Device corretamente no TL866 a opção Errase Before não habilita. Selecionei o device AT28PC64B da Atmel e a opção Errase Before fica habilitada. (no meu caso selecionando o device AT28C64B não funcionou, fui testando até acertar como descrevi.) www.professorvalfredo.com.br