TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Menta en 26 de Abril de 2007, 23:44:19

Título: Librería para memoria 24FC1025
Publicado por: Menta en 26 de Abril de 2007, 23:44:19
He armado una librería para manejar la memoria 24FC1025 y quería compartirla con ustedes.

El motivo es que no encontré una y además como estamos hablando de 1Mb = 128 KB distribuidos en 2 bloques de 512 paginas cada uno con 128 bytes por página. Escribir byte a byte se torna muy lento por la demora de escritura cercana a los 5ms.
En sí, su funcionamiento es similar a usar 2 integrados 24FC512, pero todo en uno. (cada bloque equivaldría a una memoria de 512)
En el byte de control tenemos un bit de bloque (B0) que selecciona con cual bloque queremos trabajar.
A la vez, tenemos los bits A0 y A1 que se comparan directamente con el estado de 2 pines de selección externos al chip de memoria, lo que permite ubicar hasta 4 chips juntos con un direccionamiento estático.

Descripción de la librería:

Código: C
  1. ///////////////////////////////////////////////////////////////////////////
  2. ////                            24xx1025.C                             ////
  3. ////            Driver para memoria serial EEPROM de 1Mbit             ////
  4. ////                                                                   ////
  5. //// CHIP PINs:    1        |       A0       |  Chip select            ////
  6. //// =========     2        |       A1       |  Chip select            ////
  7. ////               3        |       A2       |  Conectar a Vcc         ////
  8. ////               4        |       Vss      |                         ////
  9. ////               5        |       Vcc      |                         ////
  10. ////               6        |       WP       |  Vcc -> write protected ////
  11. ////               7        |       SCL      |                         ////
  12. ////               8        |       SDA      |                         ////
  13. ////                                                                   ////
  14. ////   init_ext_eeprom();                                              ////
  15. ////                                                                   ////
  16. ////   write_ext_eeprom(a, d);    Escribe el byte d en la direccion a. ////
  17. ////                                                                   ////
  18. ////   d = read_ext_eeprom(a);    Lee el byte d desde la direccion a.  ////
  19. ////                                                                   ////
  20. ////   write_ext_eeprom_page(CS,address,len);                          ////
  21. ////                                                                   ////
  22. ////   read_ext_eeprom_page(CS,address,len);                           ////
  23. ////                                                                   ////
  24. ////   escribe/lee una pagina de len (1..128) bytes comenzando en la   ////
  25. ////   direccion address del bloque CS (0..7) desde/hacia el buffer    ////
  26. ////   page_data.                                                      ////
  27. ////                          CS= B,A1,A0                              ////
  28. ////             block select ____| |__|____   chip select pins        ////
  29. ////                                                                   ////
  30. ////   write_check_ext_eeprom_page(CS,address,len);                    ////
  31. ////                                                                   ////
  32. ////   El programa ppal. debe definir EEPROM_SDA y EEPROM_SCL          ////
  33. ////   de lo contrario se cargan los valores por defecto...            ////
  34. ///////////////////////////////////////////////////////////////////////////
  35. ////       This source code is free. by Menta (C) Copyright 2007       ////
  36. ///////////////////////////////////////////////////////////////////////////

Las funciones write_ext_eeprom(a, d); y read_ext_eeprom(a); funcionan igual que en cualquier otra librería

Las funciones write_ext_eeprom_page(CS,address,len); y read_ext_eeprom_page(CS,address,len); son las que escriben/leen una página entera (128 bytes) desde/hacia un buffer, por lo cual necesitamos disponer de 128 bytes de RAM para este fin al momento de ejecutar estas funciones. CS=selecciona el chip y el bloque, address indica el offset en la memoria y len es el largo, la cantidad de bytes que quiero escribir/leer (128=> la página completa)

Una última función agregada es: write_check_ext_eeprom_page(CS,address,len); Esta hace algo similar a la función de escribir una página, pero luego chequea que lo que se lee, es lo que se escribio. Esta función requiere 256 bytes de ram en forma temporal. Factor a tener en cuenta ya que generalmente no se puede usar con pics pequeños

un ejemplo del uso de esta función:

#include <24FC1025.c>

...

for(x=0;x<128;x++)
   {
   y = read_adc();
   page_data[ x ]=y;
   delay_ms(1);
   }

...

do{
    i2c_error=write_check_ext_eeprom_page(0,1152,128);
    } while(i2c_error);

lo que se hace es escribir la página nº 9 completa del primer bloque del chip 0 con lo que tenga en el buffer page_data[128]; que previamente se cargó (a modo de ejemplo) con los datos ingresados por el ADC cada 1 ms.
Si tras la escritura, lo que se lee no es lo que se envió a escribir la función devuelve un 1 a i2c_error por lo cual la operación se repide.

Espero que esta librería sea de utilidad, ya que se pueden usar varias de estas ideas en memorias similares, no sólo en esta. También se puede optimizar bastante, una cosa que se me ocurre ahora es que al encontrar una diferencia no es necesario leer toda la página en busca de errores, con 1 solo es suficiente para salir de la función e intentar la escritura de nuevo.
Habría que ver si se puede hacer sin usar tanta memoria ram...

Un saludo.

24xx1025 datasheet (http://ww1.microchip.com/downloads/en/DeviceDoc/21941E.pdf)

Título: Re: Librería para memoria 24FC1025
Publicado por: NANO1985 en 24 de Septiembre de 2009, 15:21:24
UUUpss... que buen hilo éste y nadie pero nadie agradeció!!.... pero muchos descargaron jeje  :D fea actitud...
muy bueno! Menta!!...
saludos
Título: Re: Librería para memoria 24FC1025
Publicado por: fabianjsm en 25 de Septiembre de 2009, 00:34:36
Muy lindo codigo Menta!

También se puede optimizar bastante, una cosa que se me ocurre ahora es que al encontrar una diferencia no es necesario leer toda la página en busca de errores, con 1 solo es suficiente para salir de la función e intentar la escritura de nuevo.

Si utilizas el codigo desde 2007 debe estar muy provado y debe funcionar de manera exelente.

Podrias hacer esto:

En todos los lugares donde aparece este codigo
Código: C
  1. i2c_start();
  2.     status=i2c_write(comando);
  3.     while(status==1) {
  4.         i2c_start();
  5.         status=i2c_write(comando);
  6.     }
Podrias poner este que es equivalente pero más chico para ahorrar un poco de espacio:
Código: C
  1. do
  2.         i2c_start();
  3.     while(i2c_write(comando) == 1);

Para salir al encontrar la primer diferencia, y ademas evitar la duplicación del buffer.

Código: C
  1. --len;
  2.    for(x=0; x<len; x++)
  3.       if(page_data[x] != i2c_read())
  4.          break;
  5.    i2c_stop();
  6.    return x != len;

Las lineas con las que seteas la direccion podrias separarlas en una función para que no se repita tantas veces.

La linea for(x=0; x<(len-1); x++) conviene reemplazarla por --len; for(x=0; x<len; x++), ya que el codigo generado para esta ultima es mas rapido si esta desactivada la optimizacion (se debe a que el compilador genera codigo para decrementar len todas las veces que lo compara con x, suponiendo que puede variar dentro del for).

Subire el codigo con las modificaciones que realice, al final el codigo es tuyo.
Espero tu opinion.
Título: Re: Librería para memoria 24FC1025
Publicado por: Cryn en 26 de Septiembre de 2009, 00:36:40
nose desde que versión pero el CCS ya tiene incluido el driver 241025.c, y funciona al pelo

saludos
Título: Re: Librería para memoria 24FC1025
Publicado por: NANO1985 en 26 de Septiembre de 2009, 08:00:19
nose desde que versión pero el CCS ya tiene incluido el driver 241025.c, y funciona al pelo

saludos

muuuy buenaaa cryn!... gracias por el dato...
acá les dejo la funcion principal para los que la necesiten...

void write_ext_eeprom(int32 address, BYTE data)
{
   int1 status;
   int  command;

   if (address>65535)command=0xa8; // Check if address is located in Block 0/1
   else command=0xa0;

   i2c_start();
   i2c_write(command);
   i2c_write(address>>8 );
   i2c_write(address);
   i2c_write(data);

   i2c_stop();
   i2c_start();
   status=i2c_write(command);
   while(status==1)
   {
      i2c_start();
      status=i2c_write(command);
   }
}

BYTE read_ext_eeprom(int32 address)
{
   BYTE data;
   int   command;

   if (address>65535)command=0xa8;
   else command=0xa0;

   i2c_start();
   i2c_write(command);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_start();
   i2c_write(command+1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}

lo que voy a hacer es migrar éste código al mikroC y despues se los paso...
saludosss 8)
Título: Re: Librería para memoria 24FC1025
Publicado por: Suky en 26 de Septiembre de 2009, 10:24:29
Creo que así funcionaria para MikroC, haber si te ayuda Nano:

Código: C
  1. void write_ext_eeprom(unsigned long address, unsigned char data){
  2. unsigned char command, status;
  3. if (address>65535)command=0xa8; // Check if address is located in Block 0/1
  4.    else command=0xa0;
  5.    
  6.    I2C_Start();
  7.    I2C_Wr(command);
  8.    I2C_Wr(address>>8);
  9.    I2C_Wr(address);
  10.    I2C_Wr(data);
  11.    I2C_Stop();
  12.    
  13.    I2C_Start();
  14.    status=I2C_Wr(command);
  15.    while(status==1){
  16.       I2C_Start();
  17.       status=I2C_Wr(command);
  18.    }
  19. }
  20.  
  21. unsigned char read_ext_eeprom(unsigned long address){
  22.    unsigned char data, command;
  23.  
  24.    if (address>65535)command=0xa8;
  25.    else command=0xa0;
  26.  
  27.    I2C_Start();
  28.    I2C_Wr(command);
  29.    I2C_Wr(address>>8);
  30.    I2C_Wr(address);
  31.    I2C_Repeated_Start();
  32.    I2C_Wr(command+1);
  33.    data=I2C_Rd(0u);
  34.    I2C_Stop();
  35.    return data;
  36. }

Saludos!
Título: Re: Librería para memoria 24FC1025
Publicado por: Cryn en 26 de Septiembre de 2009, 10:38:27
grande Suky multilenguaje :mrgreen:

de nada nano, agradecerle a ccs que lo desarrolló
Título: Re: Librería para memoria 24FC1025
Publicado por: Menta en 26 de Septiembre de 2009, 20:06:23
Bueno, Gracias NANO!!! Ese código efectivamente me ha funcionado muy bien siempre que trabajé en el primer banco, tuve problemas con el segundo, aún no sé por qué, además al verlo ahora es verdad que se puede mejorar mucho en su desempeño y en su escritura un poco también, estoy deacuerdo con todas las sugerencias de Fabian! Gracias por opinar...
Cryn, nunca más usé esta memoria aunque tengo una que me ha sobrado, no sabía que ya venía en las nuevas versiones del compilador... gracias por el dato, este código mío quedó obsoleto, pero espero que a alguien le haya servido aunque sea un poco durante todo este tiempo... a mí me sirvió...  :D
Gracias a todos...
Título: Re: Librería para memoria 24FC1025
Publicado por: Cryn en 26 de Septiembre de 2009, 23:04:14
Claro que sirvió menta, muchas gracias por haberlo colgado aquella vez, yo lo usé para grabar unos cuantos datos en esa memoria, y me fue muy bien. Se me olvidó darte las gracias porque está bien preocupado por el programa aquella vez, y seguramente con prisa, se me pasó, espero que no sea tan tarde, gracias por la lib menta!

saludos. :-/
Título: Re: Librería para memoria 24FC1025
Publicado por: NANO1985 en 27 de Septiembre de 2009, 19:29:01
aprovechando éste hilo,... alguien sabe adonde conseguir ésta memoria (24FC1025) acá en argentina?...ya consulté en cika y  dicomse, electrocomponentes,.... y nada.... algun otro contaco?
saludos  8)
Título: Re: Librería para memoria 24FC1025
Publicado por: Suky en 27 de Septiembre de 2009, 19:38:46
Por aquí (http://www.ucontrol.com.ar/forosmf/off-topic/componentes-con-descuento-para-usuarios-de-ucontrol!/msg12151/#msg12151) tienen  ;-)

Saludos!
Título: Re: Librería para memoria 24FC1025
Publicado por: NANO1985 en 28 de Septiembre de 2009, 01:17:14
Por aquí (http://www.ucontrol.com.ar/forosmf/off-topic/componentes-con-descuento-para-usuarios-de-ucontrol!/msg12151/#msg12151) tienen  ;-)

Saludos!

muchas gracias suky!....
ya pedí cotizacion a la gente de MCelectrónics....
saludos
Título: Re: Librería para memoria 24FC1025
Publicado por: migsantiago en 20 de Mayo de 2010, 15:44:28
Hola, estoy leyendo la datasheet de la 24XX1025 y menciona que el tiempo típico de escritura es de 3ms para un byte y para una página. Esto no me suena bien ya que grabar 128 bytes debería tomar más tiempo que guardar 1 sólo byte.

¿Me pueden confirmar que puedo guardar 128 bytes cada 3ms?  :huh:
Título: Re: Librería para memoria 24FC1025
Publicado por: Menta en 20 de Mayo de 2010, 22:32:41
si mal no recuerdo, el tiempo de grabación eran como 5ms supongo que en el datasheet específico te dirá el valor de cada modelo y sí demora lo mismo 1 o 128... pero claro, vas a demorar más tiempo en pasar 128 bytes en forma serial por i2c que 1 solo byte...
Creo que la memoria almacena la página en un buffer y luego la graba toda junta.

Asi que, en rigor, graba 128 bytes en unos milisegundos, pero no graba 128 bytes cada ese tiempo porque entre página y página está el tiempo de envío de datos.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=17014.0;attach=12094)

Título: Re: Librería para memoria 24FC1025
Publicado por: migsantiago en 20 de Mayo de 2010, 22:36:25
OK Menta. Entonces lo ideal es mandar el buffer de 128 bytes a 1MHz para evitar retrasos. Gracias.
Título: Re: Librería para memoria 24FC1025
Publicado por: Menta en 20 de Mayo de 2010, 22:55:31
Entiendo que cuanto más rápido envíes la página mejor, siempre que te mantengas dentro de los límites de velocidad de bus que la memoria pueda soportar (y seguro también influye la distancia de las líneas de bus)
serían como 1180 ciclos de bus por página y me parece que representa un tiempo importante.
y entre página y página agregar un retardo de x milisegundos para asegurar la grabación.
Título: Re: Librería para memoria 24FC1025
Publicado por: AKENAFAB en 20 de Mayo de 2010, 23:18:34
Mig. si ejecuta menos tiempo en modo burst ^^
Lo he probado con 24lc256
Título: Re: Librería para memoria 24FC1025
Publicado por: migsantiago en 20 de Mayo de 2010, 23:29:13
Bueno, cuando me lleguen las 24AA1025 haré las pruebas a 400kHz que vagamente recuerdo puede tolerar.