Estoy trabajando en un proyecto para leer algunos datos de ADC y almacenarlos en un FRAM externo sobre SPI. Tengo 8 valores de flotación diferentes que necesitan ser guardados cuando la energía está apagada o en otra situación específica y después de que la energía se encienda leer cada valor y continuar desde las variables guardadas. Así que mi pregunta es, si los guardo en una matriz o estructura, ¿cómo puedo escribir y leerlos desde FRAM? Gracias de antemano.
Respuesta
¿Demasiados anuncios?Las memorias SPI en los microcontroladores AVR no son mapeables. y dejar que mapee el dispositivo en el área de memoria y se encargue de todos los comandos requeridos por las operaciones de lectura/escritura.
En cambio, tienes que crear manualmente tus funciones readByte/writeByte, para leer y escribir un solo byte en el FRAM a través del SPI.
A continuación, se crean las funciones readBuffer/writeBuffer, y se pasa el puntero de esa estructura, y el tamaño de esa estructura (y la dirección de destino en el FRAM, por supuesto).
Aún así, trabajar directamente en una memoria SPI externa será extremadamente lento. Una mejor idea es trabajar en una copia en la RAM interna, y luego adoptar una de las siguientes estrategias:
- copiar la estructura justo antes de que el AVR se apague o pase al modo de reposo (puede que necesites algún hardware para detectar cuando se está quitando la energía, y tener algún condensador de reserva para poder guardar realmente los datos en el FRAM).
- copiar la estructura cuando se produce una operación de escritura (más lento, pero no requiere hardware adicional).
En cualquier caso, cuando el dispositivo se alimenta, debe copiar los datos del FRAM a la RAM interna.
EDITAR:
Como dijiste, ya tienes las funciones que escriben y leen un byte a/desde el FRAM. Sólo necesitas crear una función que lea una mayor cantidad de datos, y escriba una mayor cantidad de datos. Entonces puedes hacer lo siguiente:
void writeBuffer (uint16_t address, uint8_t *data, int16_t size)
{
for (; size>0; size--)
{
writeByte (address++, *data++);
}
}
void readBuffer (uint16_t address, uint8_t *data, int16_t size)
{
for (; size>0; size--)
{
*data++ = readByte (address++);
}
}
Luego para leer la estructura:
readBuffer(address, (uint8_t*) &yourStructure, sizeof(yourStructure));
Para escribir:
writeBuffer(address, (uint8_t*) &yourStructure, sizeof(yourStructure));