Autor Tema: Librería para memoria 24FC1025  (Leído 6125 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Librería para memoria 24FC1025
« 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

     

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Librería para memoria 24FC1025
« Respuesta #1 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
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Librería para memoria 24FC1025
« Respuesta #2 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.
« Última modificación: 25 de Septiembre de 2009, 00:39:27 por fabianjm »
@fabianjsm is on twitter

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Librería para memoria 24FC1025
« Respuesta #3 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
.

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Librería para memoria 24FC1025
« Respuesta #4 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)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Librería para memoria 24FC1025
« Respuesta #5 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Librería para memoria 24FC1025
« Respuesta #6 en: 26 de Septiembre de 2009, 10:38:27 »
grande Suky multilenguaje :mrgreen:

de nada nano, agradecerle a ccs que lo desarrolló
.

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Librería para memoria 24FC1025
« Respuesta #7 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...
« Última modificación: 26 de Septiembre de 2009, 20:47:31 por Menta »
     

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Librería para memoria 24FC1025
« Respuesta #8 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. :-/
.

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Librería para memoria 24FC1025
« Respuesta #9 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)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Librería para memoria 24FC1025
« Respuesta #10 en: 27 de Septiembre de 2009, 19:38:46 »
Por aquí tienen  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Librería para memoria 24FC1025
« Respuesta #11 en: 28 de Septiembre de 2009, 01:17:14 »
Por aquí tienen  ;-)

Saludos!

muchas gracias suky!....
ya pedí cotizacion a la gente de MCelectrónics....
saludos
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Librería para memoria 24FC1025
« Respuesta #12 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:

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Librería para memoria 24FC1025
« Respuesta #13 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.



« Última modificación: 20 de Mayo de 2010, 22:47:08 por Menta »
     

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Librería para memoria 24FC1025
« Respuesta #14 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.


 

anything