Aunque hay varias librerías para el manejo de ficheros con los microcontroladores, en el confinamiento he tenido mucho tiempo libre y he aprovechado para estudiar varias cosas, entre ellas, el sistema de archivos FAT, aunque ya algo obsoleto, para lo que vamos a hacer con los pic creo que es mas que suficiente.
Poder manejar una tarjeta de 32 Gb y tener todo ese almacenamiento no parece ser poca cosa.
Por ello, me propuse y me lancé a crear una librería que fuese capaz de inicializar una tarjeta de memoria vía SPI formateada con un sistema de archivos FAT, que puede ser 12/16 o 32 y después de darle varios pulidos os la presento y comparto por si a alguien le es útil. A mi si, bastante. La he llamado Remi_fat. (Y si, admito que estoy un poco gordo
)
Quería que se pudiesen manejar archivos y carpetas con nombre de tipo estándar de MsDOS, " 8 caracteres de nombre + 3 de extensión" pero también que se pudiesen manejar los que tienen nombres largos. Sistema LFN (Long File Name) y así lo he hecho.
De modo que esta librería puede crear carpetas y archivos con o sin extensión. con nombres cortos de tipo MsDOS o largos (el máximo que admite FAT), con mayúsculas o minúsculas, etc.
He escrito funciones que permiten acceder a distintas carpetas , volver al directorio raíz, ir una carpeta atrás.
Se puede abrir un archivo para leer y/o escribir contenido dentro del mismo.
Se puede eliminar un archivo.
He habilitado macros para permitir que se pueda optar por no compilar fat32 y/o LFN. permitiendo ahorrar espacio en ram y flash. Por ejemplo, si en un proyecto se usa una tarjeta de memoria de 1 Gb, con fat16 es suficiente. Si los archivos y carpetas tienen todos nombres estándar, se puede evitar usar LFN y así se ahorra aun más.
La librería ya incluye además otras sub-librerías para habilitar y dejar configurado el módulo SPI para comunicar el pic con la tarjeta de memoria.
El modulo SPI utiliza al principio el timer2 para obtener 500 Khz de velocidad en el puerto y negociar con la tarjeta. Una vez inicializada la tarjeta
ya el módulo SPI queda conectado al oscilador principal y el timer 2 queda libre.
También se incluye otra sub-librería que habilita y configura el módulo uart del PIC por si se quiere enviar a una terminal datos por rs232.
Mediante unas macros, se habilitan los pines que se usarán para las señales CS, si se desea utilizar el sensor switch del zócalo de la tarjeta, si ese switch es pull_up o push_pull, etc.
En el interior del fichero rar incluyo un fichero txt con mas detalles de todo esto.
Por otro lado, decir, que he dejado plasmado por escrito todo lo que he aprendido y entendido acerca del sistema de archivos fat así como acerca de los protocolos de las tarjetas SD. Todo está comentado en el código a modo de tutorial (Entiendo que ello pueda provocar dificultad en la lectura del código fuente). Todo lo que ahí expongo es lo que YO a nivel personal he entendido después de leer decenas de documentos en internet, lo cual no tiene por que ser cierto todo. Lo mas normal es que contenga errores de conceptos u otros.
Digamos que sobre el código voy explicando las cosas a la misma vez que las implemento.
Así que nada, si a alguien le sirve, ahí lo tiene, y si alguien quiere mejorar cosas, pues se agradece. Se puede trabajar para reducir el espacio en flash que ocupa y algo mas de ram. Ya lo he reducido bastante, aun así admito que ocupa un huevo... Las cosas como son. Aunque el ejemplo esté basado en un 18f4550, en verdad lo suyo es utilizar algo de mayor capacidad. Yo hace tiempo que lo mas pequeño que uso son 18f46k20 que es lo mas parecido al 18f4550.
El código de ejemplo, si se compila y se monta el circuito, debería generar tres carpetas, algunas dentro de otras. Generar varios archivos y colocar contenido de texto dentro de algunos de ellos.
Luego se saca la tarjeta, se mete en el ordenador y si todo está bien, desde windows ahí debería estar todo.
Un saludo.