Leer y escribir multivariable (Struct) desde / a la memoria FRAM externa a través de SPI por ATMEGA mediante Code Vision

4

Estoy trabajando en un proyecto para leer algunos datos de ADC y almacenarlos en FRAM externo a través de SPI. Tengo 8 valores flotantes diferentes que se deben guardar cuando la alimentación está desconectada u otra situación específica y, después de encenderla, lea cada valor y continúe desde las variables guardadas. Entonces, mi pregunta es si los guardo en una matriz o estructura, ¿cómo puedo escribirlos y leerlos desde FRAM? Gracias de antemano.

    
pregunta hossein

1 respuesta

5

Las memorias SPI en los microcontroladores AVR no son asignables en memoria : no puede decirle a ATMEGA que ha conectado una memoria, dejar que mapee el dispositivo en el área de memoria y cuidar de todo. los comandos requeridos por las operaciones de lectura / escritura.

En su lugar, debe crear manualmente sus funciones readByte / writeByte, para leer y escribir un solo byte en el FRAM a través del SPI.

Luego, creas las funciones readBuffer / writeBuffer y pasas 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:

  • copie la estructura justo antes de que el AVR se apague o pase al modo de reposo (es posible que necesite un poco de hardware para detectar cuándo se está desconectando la alimentación, y tener algún capacitor de reserva para poder guardar datos en la FRAM).
  • copie la estructura cuando se produce una operación de escritura (más lenta, pero no requiere hardware adicional).

En cualquier caso, cuando el dispositivo recibe alimentación, debe copiar los datos del FRAM de nuevo a la RAM interna.

EDITAR:

Como usted dijo, ya tiene las funciones que escriben y leen un byte a / desde el FRAM. Solo necesita crear una función que lea una mayor cantidad de datos y escriba una mayor cantidad de datos. Luego 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));

Escribir:

writeBuffer(address, (uint8_t*) &yourStructure, sizeof(yourStructure));
    
respondido por el next-hack

Lea otras preguntas en las etiquetas