in

GeekyGeeky

Memorias EEPROM I2C 24CXX

Las memorias EEPROM que funcionan bajo el protocolo I2C  han ganando poco a poco un espacio en el hardware de los equipos electrónicos hasta transformarse en uno de los medios de almacenamiento de información más populares por su practicidad y sencillez de manejo. Tener la posibilidad de almacenar datos de diversa índole en una memoria no volátil, es una característica importante de los equipos que les permite la desconexión prolongada de cualquier suministro energético y conservar durante mucho tiempo información valiosa que de otro modo, se perdería al desconectar un sistema. También conocidas como memorias de protocolo “serie” las 24CXX son infaltables en cualquier equipo electrónico de consumo masivo y aquí te ayudaremos a comprender su funcionamiento.

Estos diminutos circuitos integrados poseen la capacidad de almacenar datos organizados, los que deben ser grabados de manera apropiada en su interior y además tienen particularidades que los hacen sobresalir y destacar dentro de su género. Algunas de las características dignas de mencionar, pueden ser las que a continuación enumeramos:

  • Pueden ser escritas y borradas de forma eléctrica = Electrically Erasable Programable Read Only Memory
  • Están garantizadas para 1 millón de ciclos de escritura/lectura.
  • Pueden llegar a retener la información sin ser alimentadas durante cientos de años.
  • Se organizan por páginas para facilitar su direccionamiento y almacenamiento de la información.
  • Utilizan para su funcionamiento una tensión única (5Volts o 3,3Volts)
  • Son compatibles con el protocolo serial I2C (Marca registrada de Philips)
  • Bajísimo costo.
  • Amplia variedad de encapsulados para adaptar el modelo necesario, de acuerdo al tamaño de la aplicación.

Los electrodomésticos utilizan este tipo de memorias en forma masiva, almacenando datos de programación muy importantes para su funcionamiento

Repasemos el Concepto I2C
El Bus I2C (Inter – Integrated Circuit) es un sistema de comunicación de dos cables, con propiedades de velocidad de transferencia de datos considerada de media a baja (400 Khz. a 100 Khz.)  y que fue desarrollado por Philips Semiconductor, a comienzos de la década del 80. Originalmente creado para reducir los costos de los equipos electrónicos, tuvo sus primeras aplicaciones en controles de contraste, brillo y volumen en aparatos de televisión pero actualmente encontramos conexiones por bus I2C en una gran variedad de computadoras, equipos industriales, entretenimiento, medicina, sistemas militares y un ilimitado abanico de aplicaciones e importantes usos potenciales.

Antes de la aparición del Bus I2C, las transferencias de datos de memorias a microprocesadores, eran realizadas en forma paralela requiriendo de esta forma encapsulados con una importante cantidades de pines (24, 28, o más pines). La asignación de funciones de los pines se repartían entre el direccionamiento de la memoria, la selección, el control y la transferencia de datos. Esta última solamente requería de 8 pines más otros ocho pines para el direccionamiento, por mencionar algunos. En contraste con este despilfarro de pines, el Bus I2C permite la comunicación “chip-to-chip” usando solo dos cables en una conexión serial, permitiendo de esta forma comunicar dispositivos con muy pocas vías.
Estos dos cables son llamados Clock (SCL) y Data (SDA) y son los encargados del direccionamiento, selección, control y transferencia de datos, de a un BIT por vez.

Una memoria 24C04 utilizada en un TV

SDA está encargado del intercambio de datos, mientras que SCL se encarga de sincronizar al transmisor y al receptor durante la transferencia de los datos mencionados desde un IC al otro. Dentro del sistema de comunicación I2C, los dispositivos están identificados como Maestro (Master) y Esclavo (Slave), por lo que al dispositivo que inicia el contacto y “abre” el bus se lo denomina Master, mientras que al que recepciona y contesta el llamado se lo denomina Slave.  Los dispositivos conectados al bus pueden ser Master solamente, Slave solamente o intercalar las funciones de Master y Slave de acuerdo como el sistema requiera, tal como es el caso que veremos de las memorias EEPROM I2C.

Este sistema puede interconectar a muchos IC sobre el bus (hasta 255 dispositivos) y todos conectados a los mismos dos cables SDA y SCL. Cada dispositivo esclavo posee una única dirección y cuando el Master transmita el llamado todos los ICs conectados al bus lo escucharán, pero solo le contestará aquel que posea la dirección que el transmisor incluyó en su llamada y será con este único Slave, con quien iniciará la transferencia de datos hasta que decida “cerrarla”.

Comenzando a comunicar
La condición de START o Inicio ocurre únicamente en la transición de un estado ALTO a un estado BAJO en la línea SDA mientras la línea SCL se encuentre en un nivel ALTO. En cambio, la transición de un estado BAJO a un estado ALTO en la línea SDA, mientras la línea SCL se encuentre en un nivel ALTO, indicará una condición de STOP o Parada. Las condiciones de START y STOP son siempre generadas por el dispositivo que asuma la condición de Master dentro del bus.

El bus se considerará ocupado después de una situación de START y pasará a estar nuevamente libre cierto tiempo después de la transmisión de la condición de STOP. Este “cierto tiempo” será determinado por el Master y vendrá especificado en la hoja de datos del mismo.

Transición de SDA (H a L y viceversa) para generar las condiciones de START y STOP

En Proton debemos indicarle al programa y/o al microcontrolador cuáles son los pines que cumplirán las funciones de SDA y SCL, porque pueden existir desarrollos en que estemos trabajando con un dispositivo que no posea un módulo SSP nativo (Synchronous Serial Port). En este caso, no tendremos pines dedicados (por hardware) a tal fin en el microcontrolador y debemos indicarle al sistema mediante instrucciones de programa, que pines cumplirán la función de interconexión al Bus I2C. Esto se realiza al comienzo del programa antes de la declaración de variables y se formaliza mediante un comando llamado DECLARE, quedándonos la secuencia de la siguiente forma:

DECLARE SDA_PIN PORTB.0
DECLARE SCL_PIN PORTB.1  
 

En el ejemplo propuesto, hemos ordenado que SDA sea el pin 0 del puerto B, mientras que SCL sea el pin 1 del mismo puerto. Esta aplicación es válida para cualquier puerto del microcontrolador mientras esté configurado en modo digital y se debe tener en cuenta que si no se incluyen estas directivas al inicio del programa, por defecto se asignarán los pines PORTA.0 para SDA y PORTA.1 para SCL.

Otra de las cosas que debemos indicarle a nuestro sistema durante el desarrollo es la velocidad a la que intercambiará datos el bus ya que la mayoría de los dispositivos actuales puede realizarlo a 400Khz o a 100Khz. Si bien ya existen circuitos integrados capaces de trabajar a 1Mhz también nos encontramos en la actualidad con el contraste de memorias EEPROM que no pueden intercambiar datos a más de 100Khz. Por lo tanto, si optamos por utilizar la frecuencia mínima, incluiremos el siguiente comando: DECLARE SLOW_BUS=ON

Luego de esto, ya estamos listos para “abrir” el diálogo dentro del bus y lo haremos con el sencillo comando: BSTART 

De esta forma, el bus ya habrá sido abierto por nuestro microcontrolador asignándose éste la función de Master y pasando a estar todo listo para la transferencia de datos hacia el Slave que el microcontrolador decida, transmitiendo al bus la dirección pertinente. Para leer datos, en nuestro caso alojados en una memoria, lo haremos de la siguiente forma: BUSIN Control, Dirección, [Variable]

La sintaxis expresada nos indica que el Master (nuestro microcontrolador) recibirá (BUSIN) un dato, el que colocará dentro de una Variable luego de haberlo sacado de uno de los dispositivos “colgados” del Bus I2C. El circuito a quién desea extraer el dato le transmite a través de la palabra de Control que va a extraer datos de él, y que dicho dato se encuentra en la Dirección apuntada. La palabra Control posee dos informaciones importantes a destacar que son el nombre que posee nuestro dispositivo remoto dentro del Bus y la instrucción acerca de que vamos a leer en él. Si por el contrario lo que desea hacer el sistema es escribir un dato en el dispositivo Slave seleccionado, lo hará mediante la siguiente forma: BUSOUT Control, Dirección, [Variable]

Con una sintaxis muy similar al caso anterior, el Master transmitirá (BUSOUT) un dato, el que tomará de una Variable, y lo grabará en uno de los dispositivos conectados al bus y seleccionado con la palabra de Control. En esta palabra se indicará a cuál de todos los dispositivos le hablará, indicándole que grabará en él y que a este proceso lo hará en una Dirección definida dentro del programa principal. Cabe agregar en este punto que Proton y la mayoría de los fabricantes de memorias recomiendan efectuar una rutina de demora o espera luego de haber grabado un dato a través de BUSOUT, para asegurar la grabación del dato, la que se efectiviza mediante la expresión: DELAYMS 10 , indicándonos con esto que efectuará un retardo o demora (Delay) de 10 milisegundos. Luego, sólo nos queda “cerrar” el bus y lo haremos con la instrucción: BUSTOP

Eso es todo. Ya tenemos la forma de abrir el bus, de leer o de grabar en un dispositivo Slave y de cerrar nuevamente el bus. Es momento de saber cómo manejar la palabra de Control y la Dirección de lectura/escritura.

Organización Interna de las Memorias
No todas las memorias EEPROM I2C se direccionan y controlan de la misma forma. Por lo tanto, haremos un breve resumen de los datos más relevantes a tener en cuenta al momento de emplear la palabra Control dentro de los comandos BUSIN y BUSOUT.

Palabra o Byte de Control
La palabra o Byte de Control, nos indicará la dirección que posee la memoria dentro del bus y si vamos a leer o a escribir en ella.

24C00 = 1|0|1|0|X|X|X|R/W
R/W significa Read o Write, que en español equivale a Leer o Escribir respectivamente según lo que decidamos hacer con  la memoria. Si vamos a leer la memoria (Read) este bit adoptará el valor 1. En cambio, al grabar un dato en la misma (Write), el valor será 0. Por su parte X, significa que el valor que adopte en estas posiciones no tiene relevancia, por lo que podemos adoptar para este lugar, un cero o un uno que el resultado será el mismo. Como dato adicional podemos mencionar que la memoria 24C00 posee una capacidad de 128 bits, organizada en una sola página con 16 Bytes de 8 bits

24C01/24C02/24C04 = 1|0|1|0|A2|A1|A0|R/W
Para este grupo de memorias tenemos la misma dirección en los cuatro bits iniciales (1010) que en el caso anterior, lo mismo para el bit final de R/W, pero encontramos un significativo cambio en las posiciones A0, A1 y A2 que coinciden con los pines uno, dos y tres respectivamente, según las hojas de datos de las memorias.

Los pines A2, A1 y A0 se utilizan para seleccionar el chip al que direccionaremos la transferencia de datos

Con estos tres bits, podemos direccionar hasta ocho memorias conectadas al mismo bus, trabajo que puede realizar cómodamente el microcontrolador. La única que se diferencia de este grupo es la 24C04 que debe tener siempre conectado A0 a GND o a VCC, pudiendo por lo tanto, direccionarse sólo cuatro unidades de la misma a través de A1 y A2. A0, en este caso, servirá para direccionar el “puntero” de escritura o lectura, hacia la primer página de 256 Bytes o hacia la segunda.
Aquí empezaremos a ver ya, cómo la estructura interna de estas memorias está organizada en “páginas”. Por último, destacamos que en este grupo de memorias encontramos la siguiente característica: sumarse a otras iguales para incrementar la capacidad de almacenamiento.

Por su parte la memoria 24C02 posee una página de 256 Bytes y la 24C04 ya posee dos páginas de 256 Bytes cada una, sumando así 512 Bytes de capacidad. Vemos entonces, que las 24C01 y 24C02 poseen una sola página, por lo que la palabra de control para ellas será igual a 1010000X, siendo X el bit que defina la lectura o escritura en la memoria, mientras que la 24C04 tendrá dos palabras de control, según la página donde decidamos trabajar. Esto es, 1010000X para la primer página y 1010001X para la segunda.

24C08/24C16 = 1|01|0|B2|B1|B0|R/W
En el caso de estos modelos, repetimos los primeros cuatro bits iniciales que identifican a las memorias EEPROM seriales (1010) y el último bit R/W, mientras que nos encontramos con la terminología B2, B1 y B0 dentro de la palabra de control en estos modelos.

Tabla que nos muestra como seleccionar las páginas en memorias 24C08 y 24C16

En el caso de estas dos memorias, no podremos colocar en el bus múltiple cantidad de ellas sino que sólo tendremos posibilidad de colocar una sola, a diferencia de las anteriores vistas hasta aquí. Esto es debido a que a pesar de poseer la misma disposición de pines que los modelos anteriores, A2, A1 y A0 no poseen conexión interna colocándose generalmente estos a GND.

Por su parte, B2, B1 y B0 sirven para identificar por software la página (o bloque) dentro de la memoria. Es decir, que para la 24C08 que posee una disposición de cuatro páginas de 256 Bytes (4 X 256 X 8 bits = 1 KByte = 8 Kbit); mientras que la 24C16, dispondrá de 8 páginas de 256 Bytes de 8 bits lo que equivale a un total de 2KByte que es lo mismo que 16Kbit. Por lo tanto, razonando lo mencionado y analizando el cuadro superior, vemos que tendremos 4 palabras de control para la 24C08 y 8 Palabras de control para la 24C16: una por cada página de 256 Bytes.

24C08 y 24C16 son tamaños de memoria altamente utilizadas en los equipos de TV y DVD para almacenar información

La palabra Dirección
Habiendo llegado hasta aquí, nos queda resolver solamente la forma en que estará compuesta esta palabra, la que será usada para decidir el casillero que ocuparemos con información dentro de la página que habremos seleccionado con anterioridad. En el caso de la 24C00 teníamos una página de tan sólo 16 Bytes, por lo que tendremos apenas 16 “filas” para ubicar Bytes de información. Protón Lite acepta cualquiera de las tres notaciones para las palabras de Control y de Dirección, es decir: Binaria, Decimal o Hexadecimal, por lo que podemos escribir para facilitar el trabajo, un comando de la siguiente forma:
BUSIN 161, 8, [Dato]

En el ejemplo mostrado tenemos la palabra de control 161, lo que equivale a 10100001 en binario y que nos indica que accederemos a la primer página (página cero) de cualquier memoria de las vistas y que la citada memoria será leída.
Luego viene el valor 8, que sería 00000100 en binario, lo que nos indica que se leerá la octava de todas las filas de Bytes que tenga esta página. Mientras que por último, el dato extraído será volcado en una variable de tamaño BYTE a la que hemos denominado “Dato

Escribir en esta misma dirección sería:

BUSOUT 160, 8, [Otro_Dato]

El último bit de la palabra de control a pasado a ser cero (antes teníamos 161 y ahora tenemos 160), y el valor a grabar será el que exista en ese momento dentro de la variable “Otro_Dato”, también de tamaño BYTE y declarada al inicio del listado del programa.

Programa ejemplo para leer una EEPROM I2C con Proton

Con este sencillo programa de ejemplo podemos leer la primer página de una memoria EEPROM I2C y colocar en un display LCD cada uno de los valores leídos durante medio segundo antes de  pasar al próximo valor, hasta leerlos a todos. Para otras páginas, variaremos la palabra de control según nuestras necesidades de uso. El ejemplo muestra la utilización de un PIC16F84A y la declaración de los pines que se utilizarán como SDA y SCL. También cabe destacar que se utilizará una baja velocidad de bus y que el LCD se conecta al puerto por defecto para tal fin, que en este caso es el B.

De esta forma se pueden guardar una multitud de datos en una memoria EEPROM I2C y tenerlos siempre listos para su utilización durante el desarrollo del programa. Además, funciones extras dentro del programa del microcontrolador nos pueden permitir detectar el corte de la tensión de alimentación y, mediante el uso de una batería de respaldo o Back-Up, grabar inmediatamente todas las variables dentro de la memoria para luego proceder a apagar el sistema de forma automática hasta que se reponga la energía. Un ejemplo de esta aplicación son los contadores de fichas de los videojuegos de salón, los flippers y la mayoría de las máquinas recreativas que trabajan con fichas o monedas. Mientras la máquina funciona normalmente, la batería de respaldo se mantiene cargada y al momento de un apagón o de la desconexión para su traslado, la información se guarda de manera automática para su posterior control. ¿Lo sabías?

Reportar

¿Qué te pareció?

Escrito por Mario

44 Comments

Leave a Reply
  1. Nuevamente muhcas gracias por la explicacion clara sbre un tema por ahi tan jodido de abordar como las memorias. Bah jodido para gente como yo que recien esta adentrandose en el tema.

  2. ¡Larga vida a Sacco! buenisimos estos temas, siempre preocupandose por sacar de la ignorancia y ayudar en lo posible al lector por interesarse en temas de UTILIDAD.

    Me facinaria saber mas sobre lectores opticos y como repararlos, espero tomen en cuenta mi peticion.

    ¡Saludos!

    • Hola a todos !

      Gracias por las palabras de aliento y de apoyo que nos brindan siempre. Un saludo muy cordial y afectuoso a todos !

      @conkering: ¿Te refieres a lectores ópticos de CD y DVD?

      @garg0: Proton Lite es GRATIS y puedes descargarlo desde aquí http://www.picbasic.org/proton_lite.php Es el que utilizamos en todos los ejemplos que proponemos en NeoTeo.

      Saludos a todos !

  3. Buen dia Mario:
    Muy buen articulo de enseñanza y practica, lo voy a emplear de una vez en un lcd que tengo y en el cual estoy trabajando, ademas hacerlo con una memoria de la que mencionas para evaluar diferencias. Me gusta mucho el articulo porque nos enseñas la teoria muy bien, pero la practica no la dejas tan molida o al menos no como en articulos anteriores; y pues bueno asi es como aprendemos.
    Ha GARGO le cuento que hasta la semana pasada empece a trabajar con Proton y pues nos es facil de manejar cuando te inicias, pero cuando vas aprendiendo es una herramienta excelente, y pues si el costo es bastante alto, pero creo que si quieres dedicarte a esto de los microcontroladores es un precio razonable para una herramienta tan poderosa. Por ahora como dice Mario, lo puedes descargar de la pagina, ademas hay bastante informacion en la red y tambien te dan soporte en la pagina de Proton.

    Este tema de las memorias es importantisimo para muchisimas cosas y pues bueno hay muchas aplicaciones que ya tengo en mente para realizar, muchas gracias Mario y pues algun dia te devolveremos tanta informacion y enseñanza que nos has entregado, no se como pero creo que tienes amigos en muchas partes del mundo, o por lo menos en Colombia tienes uno fijo.

    Una abrazo Mario, y no dejes estos articulos, que son espectaculares.

  4. Exactamente Mario, pues me he dado cuenta que es algo muy frecuente, me refiero a que a cada rato me aparecen amigos y familiares; que no me lee tal cosa el lector de la pc y antes si, que me hace un ruido extraño el DVD, y otro monton de problemas recurrentes respecto a los lectores, y pues no me queda mas que decir que es algun virus, asi que te agradeceria, Mario, que talvez alguna vez pusieras un tutorial o informacion al respecto.

    Por lo pronto estoy rebuscandome por conseguir ciertas cosas como un tester para comenzar unas cositas por alli que he visto en tus articulos.

  5. uuuuuuuu… que lento soy, si ese ya lo lei antes, pero como bien supusiste Mario, solo me lei la primer pagina, que pena, el segundo link es el que necesitaba, asi que tengo pa escudriñar un rato. Muchisimas gracias!

    • Hola Ciul !

      Por supuesto.
      En el caso de los PIC tradicionales (que no traen conectividad USB) se le puede colocar una placa adaptadora que se vende libremente y sirve para convertir datos desde RS232 a USB. Son muy populares esos cables y seguramente los conoces.

      Existen también algunos modelos de PIC de la serie 18F (18F2550, 18F4550 por citar dos ejemplos) que traen conectividad USB integrada y con ellos puedes realizar fácilmente lo que propones.

      En nuestro caso no podemos hacerlo porque la versión FREE de Proton (el compilador que utilizamos), no permite el uso de dichos PICs. Tal vez en breve dispongamos de la versión completa y podamos hacer artículos que permitan el uso de USB, Ethernet, varios canales de PWM, etc.
      Todo depende del entusiasmo que Uds. demuestren por los artículos que realizamos. Cuanto más grande sea el grupo que formemos, más posibilidades de acceder al programa completo tendremos.

      Por supuesto que existen otros programas que permiten el uso de las características mencionadas, pero el detalle es que yo no sé programar en ellos.

      Saludos Cordiales Ciul !

  6. Perfecto! justamente lo que andaba buscando. He leidos tus posts y me parecen de lo mejor, por lo menos para mi que voy empezando con esto de los PICS.

    Muchas gracias, y coincido, estos posts hacen la diferencia con otros blogs copy paste.

  7. Como siempre Mario un excelente articulo, un poco tarde el comentario pero aqui estamo al tanto de esta pagina neoteo y sobre todo en lo personal de tus articulos¡¡¡……muchas gracias por este articulo que me hacia bastante falta…..un saludo y abrazo desde Mexico.

  8. hola quise progrmar una memoria de esta con un aduc 702x perono pude hacer andar el puerto i2c si tenes algun idea.

    yo me volvi loco pero no funciono

  9. Tengo armado un circuito de cekit de un secuenciador de luces en proteus vsm bueno soy nuevo en esto la memoria es la 2732 podrias indicarme como programarla para simular en el vsm gracias de ante mano.

  10. Buenas noches… Tengo una pregunta con la que creo me podrías ayudar…

    Necesito leer de una memoria eeprom i2c de 8k bytes (64kbits). Que tiene un addressing the 2 bytes.

    Pero tengo un lector de smartcards alcor 9528 (una &"%$#(!) no trabaja con protocolo i2c extended y por lo tanto solo funciona hasta memorias de 2k… Por lo tanto, dentro de los comandos que uno le manda al alcor, de lectura… solo envia un byte de address… Existirá alguna forma de igualmente lograr que me lee correctamente la memoria de 8kbytes? Ya logré que escribiera pero la lectura es mucho más difícil cortesía del protocolo…

  11. amigo una preguntita
    si tu estas usando el BUSIN , BUSOUT ,BSTAR,BSTOP
    entonces para que sirven HBUSIN , HBUSOUT ,HBSTAR,HBSTOP
    y los I2CIN y el I2COUT

    porque todos creo que son para el I2C no?

    porfavor contestame o mandame la respuesta al :
    najadaga@hotmail.com

    garcias de antemano!

  12. Hola..soy nuevo en nuevo en neoteo, quisiera saber si existe alguna forma de imprimir los temas…me gusto mucho
    la forma de explicar ..ahh simplemente esplendida!!
    recien estoy que me inicio en esto de eeproms
    ..cuando copio el documento sale negro no se ve el contenido que hago??

  13. buenas, he actualizado el firmware de un monitor samsung led, el problema es que la actualizacion falló y luego de reiniciar ya no enciende nada el monitor ni la luz de prendido, es acaso la memoria de la que hablan en este articulo la que se debe reparar??

  14. me gustaría que me ayudaran en lo siguiente; tengo una impresora xerox phaser 3100 mfp y los toner originales traen un chip, como puedo evitar lo del ingreso de la tarjeta y solo poder recargar el toner y me lo reconozca automáticamente

  15. hola bendiciones a todos, exelente y clarificador el tema sobre eeprom estupenda explicacion, me gustaria saber donde y como puedo conseguir las escrituras de datos para las memorias eeprom, ya que he conseguido el programa ponyprog, y ya hice el circuito programador, ya que tengo la idea de programar las eeprom de los tv que me llevan, y muchos son con problemas de eeprom, si alguien puede ayudarme desde ya gracias.. este es mi correo abisai1208vasquez@hotmail.com…… muchas gracias Dios les bendiga…..

  16. interesante el artículo…pero el verbo "recepciona" no existe..debe ser reemplazado por el verbo "recibir" en la persona y tiempo adecuado…

  17. Mario Sacco, te agradezco enorme mente por sacarme de la ignorancia de
    este tema la verdad que yo creía que era mas complicado el bus i2c y las memorias eeprom, y en un solo blog!!! mil gracias me veras por aquí a diario jejeje

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Frankencamera: La cámara digital de código abierto

El cerebro humano sería emulado en 10 años