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

1

Estoy usando el compilador C18 y 24LC256 EEPROM. Me gustaría saber cómo manejar el caso Rollover en términos de una 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, ya que la escritura de la página tomará solo 5 ms igual a una sola operación de escritura. El tamaño de la página es de 64 bytes. Y tengo que escribir durante 10 horas para que tenga un espacio de 2,4 K por día.

Bueno, el problema que tengo es:

1.Quiero utilizar la escritura de página de manera eficiente y quiero evitar que se vuelque.  el tamaño de la página comienza desde 0-63, 64-127, 128-191,192-255 ... hasta 32 K.  Quiero predecir cuándo vendrá el límite de página y quiero que la escritura de la página cambie en consecuencia.

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

Nota: no es necesario dedicar ubicaciones de inicio de página 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 soluciona este problema o sugiere sus ideas.

Saludos

Arookie

    
pregunta Rookie91

1 respuesta

1

Lo que Wouter van Ooijen ha sugerido 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 se ha probado y, obviamente, necesita implementar las funciones de eeprom correctas.

    
respondido por el alexan_e

Lea otras preguntas en las etiquetas