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:///////////////////////////////////////////////////////////////////////////
//// 24xx1025.C ////
//// Driver para memoria serial EEPROM de 1Mbit ////
//// ////
//// CHIP PINs: 1 | A0 | Chip select ////
//// ========= 2 | A1 | Chip select ////
//// 3 | A2 | Conectar a Vcc ////
//// 4 | Vss | ////
//// 5 | Vcc | ////
//// 6 | WP | Vcc -> write protected ////
//// 7 | SCL | ////
//// 8 | SDA | ////
//// ////
//// init_ext_eeprom(); ////
//// ////
//// write_ext_eeprom(a, d); Escribe el byte d en la direccion a. ////
//// ////
//// d = read_ext_eeprom(a); Lee el byte d desde la direccion a. ////
//// ////
//// write_ext_eeprom_page(CS,address,len); ////
//// ////
//// read_ext_eeprom_page(CS,address,len); ////
//// ////
//// escribe/lee una pagina de len (1..128) bytes comenzando en la ////
//// direccion address del bloque CS (0..7) desde/hacia el buffer ////
//// page_data. ////
//// CS= B,A1,A0 ////
//// block select ____| |__|____ chip select pins ////
//// ////
//// write_check_ext_eeprom_page(CS,address,len); ////
//// ////
//// El programa ppal. debe definir EEPROM_SDA y EEPROM_SCL ////
//// de lo contrario se cargan los valores por defecto... ////
///////////////////////////////////////////////////////////////////////////
//// This source code is free. by Menta (C) Copyright 2007 ////
///////////////////////////////////////////////////////////////////////////
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