Cómo abordar eficazmente la escritura de páginas largas en EEPROM

Estoy usando el compilador C18 y la EEPROM 24LC256. Me gustaría saber cómo manejar el caso de rollover en términos de gran escritura de EEPROM. Estoy escribiendo una rutina que escribe 120 bytes cada media hora y me gustaría saber cómo puedo guardar/almacenar mis datos fácilmente como lo hará Page Write. tome solo 5 ms como equivalente a una sola operación de escritura. El tamaño de la página aquí es de 64 bytes. Y tengo que escribir durante 10 horas, por lo que es un espacio de 2.4 K por día.

Bueno el problema que tengo es:

1.Quiero usar Page Write de manera eficiente y quiero evitar la condición de rollover. el tamaño de página comienza desde 0-63, 64-127, 128-191,192-255... hasta 32 K. Quiero predecir cuándo llegará el límite de página y quiero que la escritura de página cambie en consecuencia.

Por ejemplo: si empiezo con la dirección 0: 0-63 ocupará 64 bytes y 64-117 ocupará los siguientes 56 bytes. Luego, para la siguiente escritura de página, solo puedo escribir 20 ubicaciones y tengo que escribir 64 y 20 en otras dos operaciones de escritura de página.

Nota: No es necesario dedicar ubicaciones de página de inicio para cada escritura de página.

Page write operations are limited to writing
bytes within a single physical page,
regardless of the number of bytes actually
being written. Physical page boundaries
start at addresses that are integer
multiples of the page buffer size (or ‘page
size’) and end at addresses that are
integer multiples of [page size - 1]. If a
Page Write command attempts to write
across a physical page boundary, the
result is that the data wraps around to the
beginning of the current page (overwriting
data previously stored there), instead of
being written to the next page, as might be
expected. It is, therefore, necessary for the
application software to prevent page write
operations that would attempt to cross a
page boundary

He estado tratando de encontrar un algoritmo para hacerlo. Sería extremadamente útil si solucionas este problema o sugieres tus puntos de vista.

Saludos

Arookie

¿No sería mucho más sencillo escribir siempre tus 120 bytes en dos páginas? No pareces tener restricciones de tamaño.
Bueno, estoy bastante limitado en tamaño aquí. Solo estaba tratando de obtener un método para encontrar un método adecuado aquí para solucionar el problema.
No veo tu problema. Por cada byte que escribe, incrementa un contador, cuando llega a 64, escribe una página y establece el contador en 0.
Gracias @Wouter van Ooijeb ¿Qué pasa si cruza el límite de la página? Puede causar un problema, ¿verdad?
Cuando cruza el límite de la página, la dirección pasa a la primera ubicación de la página y sobrescribe el valor allí.
Me escribirán en la misma página física, ¿verdad? Pero necesito escribir 120 bytes cada media hora y comenzar a escribir la página física desde donde se terminó la escritura de página anterior.

Respuestas (1)

Lo que ha sugerido Wouter van Ooijen tiene perfecto sentido.

Esto debería funcionar

uint8_t page_counter=0;
uint8_t data_counter=0;
uint8_t last_used_address=0;


while(data_counter<120)  // we want to write 120 bytes
{
  send_eeprom_address(last_used_address);
  while((page_counter++)<64)  // while not end of page
  {
     write_eeprom_byte(y);         
     if (++data_counter==120) break; // exit the loop is 120 bytes have been written
  }
  last_used_address= last_used_address + page_counter;  // update last used location
  if(page_counter==64) page_counter=0;
}

El código no está probado y obviamente necesita implementar las funciones eeprom correctas.

gracias @alexan_e. Estoy extremadamente agradecido por su valioso tiempo.