Detectar tamanho da memória EEPROM


Recentemente me deparei com o problema de identificar qual o tamanho da memória EEPROM que estava montada no circuito. Estas memórias trabalham com o protocolo I2C em formato master/slave, onde você informa para a memória qual endereço você quer escrever ou ler, e ela te retorna o conteúdo do endereço ou um ACK (acknowledge) ou um NAK (not acknowledge) informado o se houve a gravação realizada com sucesso ou não.
Durante a minha pesquisa, pude ver que identificar qual memória está montada no circuito é um problema comum de muitos desenvolvedores. E estas memórias não tem um registrador que informe as configurações da memória, pelo menos não encontrei. 
A Microchip disponibilizou um application note em 2002 informando como fazer um auto-detect de suas memórias. Este é o link do documento.

Conceito do procedimento

Quando você está trabalhando com uma variável. Se tomarmos uma variável de 8 bits, esta tem 256 posições, porém ela vai de 0 a 255, então se você escrever o valor 256 nesta variável, haverá overflow e o que será salvo na variável será 0 e não 256 como esperado. Pense que o contador de endereços da memória irá funcionar da mesma forma.
Pegando uma memória de tamanho N, quando é feita a escrita em um endereço maior que N-1 há o overflow do contador de endereço da memória, e ela começa a gravar a partir do endereço novamente. Então o que deve ser feito? Você deverá gravar um valor conhecido no endereço N, se houver overflow na memória você verá o valor escolhido no endereço 0. Então assim você já conhece que a memória montada é a de tamanho N bytes. Caso você confira no endereço N, e o valor conhecido está em N e não em 0, significa que a memória é maior que N. Lembre-se de começar da menor memória para a maior, pois isso evita que você cause overflow em outros endereços da memória e não no endereço 0.

Não é um processo simples, mas é funcional.
Neste link está a implementação desta função. Para entender melhor, verifique a função EE_SizeDetect.


Caso você tenha alguma experiência com este tópico, compartilhe.


Referências
http://www.t-es-t.hu/download/microchip/an690a.pdf
http://www.learningaboutelectronics.com/images/24LC256-EEPROM-pinout.png
https://github.com/ulyssesfonseca/EEPROM_SIZE_DETECT

Postar um comentário

0 Comentários