EEPROM: todo lo que tienes que saber sobre esta memoria

EEPROM

Si eres maker y estás haciendo algunos proyecto DIY en los que tienes que trabajar con memoria, seguro que ya conoces cómo trabajan las diferentes memorias que integra Arduino, como la flash (no volátil donde se almacena el sketch y el bootloader), la SRAM (una memoria rápida y volátil donde permanecen las variables del programa durante el procesamiento), y la EEPROM (no volátil y que se puee usar para almacenar información de reinicios).

Pues bien, además de la EEPROM incluida en Arduino, también podrás usar chips externos de este tipo de memoria, como un componente más. No son nada complicados de entender, ni tampoco de interactuar con ellos para generar accesos (escritura y lectura) o actualizaciones de la información almacenada. Aquí encontrarás todo lo que necesitas saber para comenzar a trabajar con este tipo de memorias…

¿Qué es EEPROM?

STMicroelectronics EEPROM

STMicroelectronics EEPROM

La EEPROM (Electrically Erasable Programmable Red-Only Memory) es un tipo de memoria ROM, es decir, de memoria no volátil en la que los datos se almacenarán de forma permanente, incluso si se retira el suministro de energía. Eso las sitúa en el otro lado de las RAM (Random Access Memory), que pierden todos sus datos cuando no se alimentan de energía.

En el caso de la EEPROM, no es una memoria como la ROM, en la que se graban los datos y ya no pueden ser alterados. La EEPROM, al igual que la flash, admite ser alterada cuando se necesite. Es decir, se pueden almacenar unos datos y borrarlos para almacenar otros diferentes.

De hecho, como bien indican sus siglas, es una memoria borrable eléctricamente (electrically erasable) para su reprogramación. Esto difiere con otros tipos de ROM, que también son borrables como las EPROM, pero que en este caso no se usa electricidad para borrar las células de memoria, sino que tenían una «ventanita» de cuarzo en el chip para poder proyectar una luz UV con la que se borraba.

Esa característica de las EPROM las hacía algo incómodas, al tener que tener que proyectar esos rayos para borrarlas. Y, lo peor, podían ser borradas de forma accidental si se exponían a este tipo de radiación. En las EEPROM se permite hacerlo mediante voltajes, de una forma más cómoda y segura.

Estructura interna

diagrama EEPROM

Fuente: Researchgate.net

Para que la EEPROM pueda funcionar, se necesitan unas celdas de memoria muy particulares. Están construidas usando transistores tipo MOS, pero que tienen una puerta flotante frente a los MOSFET tradicionales. Estos nuevos transistores siguen una estructura conocida como SAMOS, y su estado normal es cortado y la salida siempre proporcionará un 1 lógico.

Estas celdas EEPROM pueden ser leídas un número ilimitado de veces, pero tiene un límite en la cantidad de veces que se pueden borrar y reprogramar, como le ocurre a otras muchas. Esto también le ocurre a las flash, por eso se ha hablado tanto de la durabilidad de los discos duros SSD, pendrives, etc.

En el caso de SAMOS, ese límite está entre las 100.000 y 1.000.000 de veces. Tras eso, fallarán. Por cierto, unas estructuras que fueron creadas por un viejo conocido, uno de los grandes: el Dr. Fujio Masuoka de Toshiba (1984), que también ha creado otras importantes memorias y estructuras semiconductoras… No obstante, el primer chip lanzado al mercado fue el de Intel de 1988, una EEPROM tipo NOR.

Además, tienes que saber que este tipo de memorias suelen estar ligadas a CPUs o controladores mediante bus con protocolos como SPI, I2C, etc. En el caso de las MCUs (microcontroladores) se suele integrar dentro, al igual que ocurre en algunos DSPs, para conseguir mayor rapidez.

Como se puede apreciar en la imagen superior, los transistores SAMOS que forman las celdas de memoria, se agrupan en ese caso en pares. Una de las líneas unida a las puertas de unos transistores actúa como línea de elección, para marcar o señalar esa línea para los accesos (lectura y escritura), y el otro será el que almacene el bit de información (0 o 1).

Los transistores se alinean para formar las longitudes de palabras (word) requeridas (4-bit, 8-bit, 16-bit,…) y se agrupan tantas palabras como capacidad se quiera que tenga la EEPROM (p.e.: puede haber longitudes de palabras de 64-bit y con 16 líneas = 1024 bits, es decir, 1kb).

¿Cómo funciona una EERPOM?

Como puedes ver en el lateral, para realizar las distintas tareas, el voltaje de su puerta, fuente y drenador debe ser una concreta:

  • Puerta a 20v y Drenador a 20v = programación (escritura) de la celda de memoria para almacenar el bit que se quiera.
  • Puerta a 0v y Drenador a 20v = borrar el bit almacenado para que pueda ser reprogramado con otro valor.
  • Puerta a 5v y Drenador a 5v = lectura del bit almacenado. Al ser un voltaje de puerta inferior al de la escritura, no se alterará el valor almacenado. Igual ocurre con el voltaje del drenador, al ser más bajo, no se borrará el bit almacenado.

Conclusión, las EEPROM usan unos voltajes «elevados» para el borrado y la grabación, mientras que usan voltajes más bajos para la lectura…

Comprar EEPROM y trabajar con ella

STMicroelectronics, el fabricante francés de microelectrónica, es el número uno en este tipo de chips EEPROM, aunque existen otros muchos fabricantes, como Microchip. Estos chips suelen ser bastante baratos.

Si te decides a usar uno de estos chips, debes ver el fabricante y modelo y buscar su datasheet para ver todas las recomendaciones del fabricante, ya que pueden variar de uno a otro. Por ejemplo, te van a especificar los voltajes con los que trabaja, el pinout, etc. Así podrás configurar tu proyecto adecuadamente.

En función del tamaño y del modelo, puede tener más o menos pines. Pero para que te hagas una idea, un chip típico de EEPROM 24LC512 EEPROM IC, se podría componer de:

  • Pines 1 (A0), 2 (A1), y 3 (A3) usados en la configuración, son los pines de selección.
  • Pin 4 (Vss/GND) conectado a tierra.
  • Pin 5 (SDA), para datos en serie para comunicación I2C.
  • Pin 6 (SCL), para el reloj para I2C.
  • Pin 7 (WP), write-protect o protección contra escritura. Si está conectado a GND, la escritura estará habilitada. Si se conecta a Vcc está deshabilitada.
  • Pin 8 (Vcc), conectado a la alimentación.

En cuanto a las especificaciones técnicas de este chip:

  • 512K (64×8)
  • 128-byte de buffer para escritura
  • Voltaje operacional: 1.8v a 5.5v
  • Corriente de lectura: 40uA
  • Bus de comunicación: I2C
  • Ciclo de escritura: 5ms
  • Compatibilidad de reloj: 100-400Khz
  • Durabilidad: 10.000.000 ciclos
  • Se puede conectar en cascada hasta 8 dispositivos
  • Empaquetado: 8-pin DIP, SOIJ, SOIC y TSSOP.

Dónde comprar

Para comprar chips EEPROM, puedes echarle un vistazo a estas recomendaciones:

Usar la EEPROM de Arduino

Captura de pantalla de Arduino IDE

Si quieres comenzar a trabajar con la EEPROM, puedes también probar la de tu placa Arduino. Se puede programar de forma sencilla para entender a nivel lógico y de programación cómo puede trabajar.

Ejemplo para grabar una variable


//Almacenar un valor en la EEPROM
#include <EEPROM.h>
 
float sensorValue;
int eepromaddress = 0;
 
//Función para simular lectura de un sensor o pin
float ReadSensor()
{
  return 10.0f;
}
 
void setup()
{
}
 
void loop()
{
  sensorValue = ReadSensor(); //Lectura simulada del valor
  EEPROM.put( eepromaddress, sensorValue );  //Escritura del valor en la EEPROM
  eepromaddress += sizeof(float);  //Apuntar a la siguiente posición a escribir
  if(eepromaddress >= EEPROM.length()) eepromaddress = 0;  //Comprueba que no existe desbordamiento 
 
  delay(30000); //Espera 30s
}

Ejemplo para leer un dato de la EEPROM


//Leer una variable de coma flotante
#include <EEPROM.h>
 
struct MyStruct{
  float field1;
  byte field2;
  char name[10];
};
 
void setup(){
  
  float f;
  int eepromaddress = 0; //La lectura comienza desde la dirección 0 de la EEPROM    
  EEPROM.get( eepromaddress, f );
  Serial.print( "Dato leído: " );
  Serial.println( f, 3 );  
 
  eepromaddress += sizeof(float);
}
 
void loop()
{
}

Ejemplo para actualizar valores, reprogramar


//Actualizar valor de la EEPROM escribiendo el dato entrante por la A0
#include <EEPROM.h>
 
int eepromaddress = 0;
 
void setup()
{
}
 
void loop()
{
   int val = analogRead(0) / 4;
   EEPROM.update(eepromaddress, val);
  
  eepromaddress += sizeof(int);
  if(address == EEPROM.length()) eepromaddress = 0;
 
  delay(10000);  //Espera de 10 segundos
}

Más información – Curso Arduino gratis


Sé el primero en comentar

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.