Archivos dañados generados por Arduino con la biblioteca SD. ¿Cómo evitar eso?

4

Tengo un boceto que se ejecuta en un Arduino Ethernet (que viene con un lector de tarjetas SD y, por supuesto, una interfaz Ethernet).

Hay un lugar único en este boceto donde escribo en un archivo en la tarjeta SD, que básicamente tiene este aspecto:

char dpath[13]; // File path
char logline[30]; // String to be stored in

/* ... */

File dataFile;
if (dataFile = SD.open(dpath, FILE_WRITE)) {
    dataFile.println(logline);
}
dataFile.close();

No tuve ningún problema durante algunos meses con un par de Arduinos ejecutando este boceto.

Recientemente, puse a trabajar otro que se está comportando de manera extraña. En particular, veo que en la tarjeta SD generó un archivo algo dañado.

El tamaño del archivo parece ser de 4.0 GB, aunque el tamaño total de la tarjeta SD es de 3.7 GB, y si intento leerlo con un editor hexadecimal, aparece vacío:

$ du -h 20130206.DAT_ 
4,0G    20130206.DAT_

$ df -h
Filesystem   Size  Used  Avail  Use%   Mounted on
/dev/sdb1    3,7G   58M   3,6G    2%   /media/B045-FE58

$ hexdump 20130206.DAT_ 
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
fd000000

¿Qué podría estar pasando con el microcontrolador?

Estoy preguntando esto aquí, porque no puedo notar ningún problema de programación, y el croquis se está ejecutando bien en otras placas. ¿Debo estar al tanto de algunos problemas eléctricos conocidos? ¿Podría, por ejemplo, una fuente de alimentación no estabilizada o alguna radiación electromagnética conducir a este comportamiento? Agradecería cualquier sugerencia sobre problemas electrónicos que debería revisar.

    
pregunta etuardu

1 respuesta

2

Tanto la interfaz de la tarjeta SD como la interfaz WizNet comparten la misma interfaz SPI del microcontrolador. Existe un error conocido (o más bien un descuido terrible del diseño) en la biblioteca de software Arduino SPI a este respecto, que ocasionalmente causa daños en los datos. No es seguro contra interrupciones. El problema se explica y se soluciona aquí:

enlace

Esto se logra al permitir que el usuario de la biblioteca incluya el acceso a SPI con métodos de protección:

  

En pocas palabras, SPI.beginTransaction () protege su acceso SPI de otras bibliotecas basadas en interrupciones y garantiza la configuración correcta mientras usa el bus SPI.

Oh, la profundidad del problema significa que tiene que arreglar / reescribir todo lo que se aprovecha de la biblioteca SPI. El caso de uso de Arduino ha evolucionado hacia arriba en complejidad a partir de proyectos muy simples, y las bibliotecas pueden tardar un tiempo en reflejar completamente esta transición.

    
respondido por el Siana

Lea otras preguntas en las etiquetas