Utilizar la SD como unidad de almacenamiento para PIC. Sistema de archivos FAT.

Muchas veces querremos utilizar una tarjeta de memoria como medio de intercambio de datos con un ordenador, aparte de como almacenamiento para el microcontrolador. En este caso ya no nos vale escribir y leer un bloque en cualquier dirección de la tarjeta como veíamos en la entrada anterior, sino que debemos respetar el formato de ficheros de la misma.

El sistema de ficheros más sencillo de implementar y seguramente el más extendido es el FAT en cualquiera de sus versiones: FAT12, FAT16 o FAT32.

De momento veremos sólo el acceso a FAT12 y FAT16, pero la librería que vamos a desarrollar se puede ampliar fácilmente a un sistema FAT32.

Hay muchos documentos interesantes sobre el sistema FAT accesibles en la red, uno de los que yo he seguido por su simplicidad es este: http://ww1.microchip.com/downloads/en/AppNotes/01045a.pdf

Los datos se estructuran en la memoria de la siguiente manera:

  • En todas las SD el tamaño del sector es fijo e igual a 512 bytes.
  • En el primer sector de la tarjeta se encuentra el MBR, que nos interesa principalmente porque almacena la tabla de particiones del «disco»
    • La tabla de particiones tiene cuatro entradas, aunque en el 99% de los casos sólo se usa la primera. Esta tabla guarda la dirección de inicio de cada partición, su sistema de archivos y su tamaños. Para simplificar, nosotros leeremos sólo la primera y daremos por sentado que sólo hay una partición. Obtenemos de aquí un puntero hacía el primer sector de la partición con la que trabajaremos
  • En el primer sector de la partición se encuentra el BSE (Boot sector). Necesitamos acceder a él para obtener todos los datos de configuración del sistema de archivos. Nos vamos a quedar con:
    • El número de bytes por sector: Siempre es 512 para las tarjetas SD. Pero puede servir de comprobación.
    • El número de sectores por cluster: A partir de este punto el acceso al disco se hace, ya no por sectores de 512 bytes, sino por clusters que son agrupaciones de sectores de tamaño fijo. Este número sí que varía con la tarjeta.
    • Posición de la FAT1 y de la FAT2 y su tamaño: En el disco se guardan dos bloques de datos (por seguridad) donde se almacenan los punteros a los datos de los archivos.
    • Tamaño y posición del directorio raíz: El directorio raíz nos da la lista de ficheros en el primer nivel de directorios de la tarjeta. En FAT12 y FAT16 tiene una posición fija.
  • Como hemos visto ahora vienen las tablas FAT1 y FAT2 que deben ser idénticas si no hay problemas en el disco. Son registros de tamaño fijo (12 bits para FAT12, 16bits para FAT16 y 32bits para FAT32). Los registros 0 y 1 están reservados, los demás corresponden a cada cluster del disco. El número almacenado en el registro indica si el cluster está libre, si los datos del fichero almacenados en este cluster terminan aquí, o si siguen en otro cluster cuyo valor se indica en el registro.
  • El directorio raíz: Contiene una lista de entradas de 32 bytes cada una que contienen el nombre del fichero, la longitud, atributos y fechas y  el primer cluster donde se almacenan los datos.
  • La zona de datos: Donde se almacenan los datos de los ficheros y los subdirectorios en bloques del tamaño de un cluster.

Partiremos del punto donde dejamos la entrada anterior. Ya sabemos acceder a un sector de la tarjeta para leer y para escribir. Ahora vamos a introducir unas cuantas funciones más para acceder a los ficheros. En esta entrada he decidido dejar de usar el SPI por hardware por la versión software que proporciona CCS, eso deja libre los pines del micro  del conector ICSP para poder cargar el programa sin tener que sacar la tarjeta SD, facilitando las cosas durante la fase de depuración, también he modificado algo  las funciones que dan acceso a la tarjeta SD.

En esta entrada nos limitaremos al acceso a ficheros del directorio raiz, con nombres cortos y sólo para particiones FAT12 y FAT16.

Para hacerlo más interesante, vamos a incluir un para de sondas DS1820 y añadiremos los datos obtenidos a un fichero CSV que luego podremos abrir en el ordenador como una hoja de cálculo. Aquí está el esquema del circuito empleado:

Al empezar el programa leeremos el MBR, para obtener los datos de las particiones,  luego con el BSE sacamos las direcciones de los bloques principales de la partición y el tamaño del cluster. Las funciones de acceso a ficheros son fopen, fwrite, fread y fclose. La primera busca el fichero en el directorio raíz (o lo crea si es necesario)  y obtiene el primer cluster y el tamaño del fichero, la segunda y tercera, sirven para escribir o leer un bloque de datos en el sitio apuntado por el puntero de fichero fp->pt_rw, la última cierra el fichero actualizando los datos del directorio raíz.

El proyecto en CCS abre el fichero TEMP.CSV para escribir (si no existe lo crea) y añade continuamente los valores de temperatura medidos con las dos sondas.

 

Fichero sólo visible para usuarios registrados

 

Continuara …

 

Deja una respuesta

Tu email nunca se publicará.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies