Implementar el protocolo FAT32 en un microcontrolador (PIC,AVR,ARM,Z80, etc)

Si se te queda corta para lo que estás haciendo, toca aprender a depurar mucho. Bueno, tiene la opción si no quieres depurar ahora, elegir PIC de 32 ó 64 KB. Ahí no te quejarás. Para eso lo venden.
 
Hola David.
Podrias pasarme el ejemplo que tu tienes funcionando para los Pic o otro micro?
Yo lo estoy implementando en un MSP430 y no lo consigo hechar a andar.

Gracias y un saludo
 
Última edición por un moderador:
Hola David.
Podrias pasarme el ejemplo que tu tienes funcionando para los Pic o otro micro?
Yo lo estoy implementando en un MSP430 y no lo consigo hechar a andar.

Gracias y un saludo

Hola, yo como les dije saque mi versión del trabajo de CHAN, su página web es:
http://elm-chan.org/fsw/ff/00index_e.html

el link para bajar el zip con las librerias para diferentes microcontroladores es:
http://elm-chan.org/fsw/ff/ff007e.zip

Esta implementación funciona muy bien, sin embargo microchip ya tiene su propia versión de un fat 32 que podrían revisar. No se si soporta todos los PIC 18 pero ha de soportar alguno, una de las ventajas es la documentación.

Con respecto a mi, yo utilicé las librerias de CHAN que funcionan casi que "out of the box", solo hay que tomarse el tiempo para entenderlas, yo en un principio solo cambié la velocidad del cristal (haciendo los ajustes a los parametros correspondientes en el main) y cambié la velocidad del puerto serie. Con eso lo probé y funcionó.

Cualquier pregunta con gusto!
 
Última edición por un moderador:
Este proyecto de FAT32 es muy bueno y completo, genial que soporte varias arquitecturas. Por mi lado las he probado en AVR, cuesta un poco familiarizarse con ellas, pero luego de que las conoces, son supremamente sencillas de manejar... sería bueno dar una serie de pasos sencillos para que la gente aprenda a configurar la librería. Además a mi parecer los archivos de ejemplo no están descritos de tal manera que sean fácilmente adaptables a diferentes microcontroladores dentro de la misma familia... por ahi tengo unas modificaciones que hice para los AVR, si alguien está interesado los puedo montar
 
Si tienes ejemplos de como usar las librerías, estaría bueno que los mostraras. Yo estoy desarrollando documentación en español para poder usar AVR...pero me va a llevar tiempo y no cuando terminaré.
 
Bueno, comienzo con el tutorial para manejo de FAT en microcontroladores AVR. Vamos a utilizar las librerías recomendadas en este blog, pongo nuevamente el enlace:

http://elm-chan.org/fsw/ff/00index_e.html (Fatfs)
http://elm-chan.org/fsw/ff/00index_p.html (Petit Fatfs)

En la sección Resources encuentran los links de descarga, o sigan los siguientes links (pueden desactualizarse conforme vayan saliendo nuevas versiones):

http://elm-chan.org/fsw/ff/ff8b.zip (Fatfs)
http://elm-chan.org/fsw/ff/pff2a.zip (Petit Fatfs)


Existen dos versiones de esta librería: Fatfs y Petit Fatfs. La primera es la más completa, pero consume bastante memoria tanto Flash (fácilmente pueden ser 8KB pero depende de cómo se configure) como RAM (>512 por archivo abierto). La segunda está pensada para microcontroladores con muy escasos recursos (Ejemplo la subfamilia ATtiny): usa alrededor de 2 a 4 K de Flash, y alrededor de 44 bytes de memoria RAM. Si mal no estoy, las restricciones más importantes es la de no poder crear archivos, el archivo ya debe estar en la memoria. En este tutorial me concentraré en explicar la completa, no la Petit.

Lo primero es aclarar qué permite realizar estas librerías: Son una interfaz en ANSI C para gestionar archivos que se encuentren en sistemas tipo FAT, como memorias USB, SD, Discos duros, etc. No incluyen las librerías para la interfaz hardware (también llamada capa física) con el dispositivo (como dije, puede ser una memoria SD, un disco duro IDE o ATA, un disco duro SATA, etc). Pero no hay problema, en los ejemplos de la página están incluídas las librerías para manejo de memoria SD que creo resulta ser la más interesante, ya que sólo se necesita una interfaz SPI, incluída en la mayoría de los dispositivos AVR. A continuación el link donde descargan los ejemplos:

http://elm-chan.org/fsw/ff/ffsample.zip

Ahora, comencemos explicando los archivos de los que se compone tanto la librería como los ejemplos. El primer archivo, el de la librería Fatfs, incluye básicamente los siguientes archivos en la carpeta src:

  1. diskio.h (Interfaz capa física)
  2. ff.c (Librería Fatfs)
  3. ff.h (Librería Fatfs)
  4. ffconf.h (Configuración)
  5. integer.h

El primer archivo es solo uno de cabecera, no incluye código, solo definiciones de funciones utilizadas para acceder al dispositivo (capa física). Como estas funciones son totalmente dependientes del dispositivo a utilizar (memoria USB, tarjeta SD, Disco duro, etc), la librería no las incluye, solo las define. Este archivo no lo tocaremos.
El segundo y tercer archivo es la implementación de las funciones de la librería Fatfs. No los tocaremos.
El quinto archivo tampoco es interesante, son solamente las definiciones de los tipos de enteros a utilizar. No lo tocaremos.
El cuarto archivo es el más importante porque permite configurar la librería, es el único que editaremos.

Ahora descomprimamos el otro archivo, el de los ejemplos. Nos dirigimos a la carpeta avr y ahi encontraremos, fuera de los archivos previamente mencionados, lo siguiente:

  1. ata.c (driver para medios ATA)
  2. cfc.c (driver para medios Compact Flash)
  3. cfmm.c (driver para medios Compact Flash y MMC)
  4. mmc.c (driver para memorias MMC o SD)
  5. mmcbb.c (driver para memorias MMC o SD sin usar SPI)

Por lo tanto, vemos que los ejemplos incluyen justamente las definiciones de las funciones en diskio.h, es decir la capa física! El único archivo que tomaremos en cuenta será el mmc.c, que utilizaremos para acceder a memorias SD. Entonces, la lista de archivos que necesitamos para comenzar con un proyecto que implemente FAT en memoria SD es:

  1. diskio.h (Interfaz capa física)
  2. ff.c (Librería Fatfs)
  3. ff.h (Librería Fatfs)
  4. ffconf.h (Configuración)
  5. integer.h
  6. mmc.c (driver para memorias MMC o SD)

Bueno, por ahora, termino este primer post del tutorial de FAT32 para AVR, más adelante explicaré algunos cambios necesarios a realizar en estos archivos para configurar nuestro proyecto.
 
Es la primera vez que veo este tema y me parece muy util habia escuchado en otras ocasiones que era posible realizar este sistema de archivos con microcontroladores por que hay proyectos que solicitan la creacion de archivos y almacenamiento en memorias me gustaria saber mas acerca de como guardar archivos en una memoria flash USB con un microcontrolador para luego leerlas en una PC, estaré esperando el siguiente post y gracias por toda la info.
 
Es la primera vez que veo este tema y me parece muy util habia escuchado en otras ocasiones que era posible realizar este sistema de archivos con microcontroladores por que hay proyectos que solicitan la creacion de archivos y almacenamiento en memorias me gustaria saber mas acerca de como guardar archivos en una memoria flash USB con un microcontrolador para luego leerlas en una PC, estaré esperando el siguiente post y gracias por toda la info.

StrySG, toma en cuenta que una cosa es el formato FAT32 y otra cosa es la capa física del dispositivo a través de la cual accedes a los archivos en este formato. Me refiero a que estás pensando en utilizar una memoria USB para acceder a los archivos que están en el sistema FAT, pero primero tienes que contar con la interfaz USB Host que te permita cumplir con el protocolo de comunicación USB antes de pensar en leer los archivos del sistema FAT. Mejor considera tener una memoria SD, ya que la capa física es SPI, la cual está incluida en la mayoría de microcontroladores de bajo costo, al menos en los AVR.
 
Continuando con el tutorial de FAT para AVR usando memoria SD (o microSD), quedamos en cuales eran los archivos necesarios para realizar nuestro primer proyecto. En este post explicaré la capa física de memorias SD.

Lo primero y más importante es definir con cual formato de memoria se trabajará. Incluiré los diagramas de conexión para tanto para memorias SD como microSD (img 3) aunque considero que estas últimas son fáciles de conseguir, así como su puerto de conexión, que o bien pueden extraer de un celular viejo o existen algunas tiendas que ofrecen tarjetas con el conector para conexión a protoboard, como en la img 1 (EJ: http://www.naxuscolombia.com/productos/prototipado/). También es posible conseguir memorias microSD que incluyen un conversor a formato SD (img 2).

Interfaz física con Tarjetas [micro]SD
Una memoria SD incluye un controlador interno que se encarga de gestionar los bancos de memoria Flash de la tarjeta, así como la interfaz de comunicación con el exterior (img 4). Para trabajar con memorias SD se tienen dos Modos de comunicación: Modo SD y Modo SPI . El primer modo se utiliza muy poco, al menos para montajes con microcontroladores, por lo que se explicará exclusivamente el modo SPI, el cual es un periférico comúnmente incluído en microcontroladores AVR. Para este bus de comunicación serial es necesario explicar cuales líneas físicas se manejan:

  1. MISO (Master In Slave Out)
  2. MOSI (Master Out Slave In)
  3. SCK (Reloj)
  4. /CS (Chip select, también llamado SS, activo bajo)
  5. GND (Tierra)
  6. VCC (Alimentación = 3,3V)

Por lo tanto es necesario identificar estas líneas en nuestras tarjetas SD o microSD. He dejado las img 5 y 6 para memorias microSD y SD respectivamente. Las equivalencias entre las lineas de tarjetas microSD y SD se pueden observar en la img 7. Los nombres de las líneas explican claramente su funcionamiento: el microcontrolador hace las veces de Maestro y la tarjeta SD de esclavo. Entonces básicamente la línea MISO se utiliza cuando la tarjeta SD se comunica con el microcontrolador, la línea MOSI cuando el microcontrolador desea enviar datos a la tarjeta SD. La línea SCK transmite la señal de reloj para la transmisión serial (SPI es un bus de comunicación síncrono, a diferencia de un bus serial normal implementado con una UART, que es asíncrono, es decir, no transmite señal de reloj). Vemos también la línea CS, que sirve para activar el dispositivo esclavo, la SD. SPI permite el manejo de múltiples periféricos, por lo tanto se comparten las líneas MISO MOSI y SCK. Para diferenciar con qué dispositivo se comunicará el Maestro SPI (nuestro microcontrolador), se usa la activación de la línea CS del periférico de interés.

Como vemos existe un punto muy importante y es la alimentación de la memoria SD, que es de 3.3V. La mayoría de montajes con microcontroladores usa 5V, así que cuidado con la conexión. Lo primero es conseguir un regulador de 3.3V, que puede tomar como entrada los 5V del circuito. Esto soluciona la conexión de la alimentación de la tarjeta SD, pero no la interfaz de las líneas MISO, MOSI, SCK y CS. Por fortuna la topología de los pines de E/S de AVR juega a nuestro favor: Podemos configurar estos pines sin habilitar el pullup interno (registros PORT), y conectaremos pull-ups externos a 3.3V. Esta solución se puede observar en la img 9. Para las resistencias de pullup (R) pueden usarse valores desde 4.7k hasta 10k. Otra posible solución sería habilitar los pull-ups internos de las salidas del microcontrolador, y realizar un sencillo divisor de voltaje para cada línea, de tal manera que pase de 5V a 3.3V el voltaje de cada linea, como se ilustra en la img 8. Para R1 y R2 se puede utilizar 330 y 680 ohms respectivamente. Cuál de los dos montajes es más efectivo? Cualquiera de los dos funciona, aunque podría ser preferible el pull-up externo, ya que en teoría es menos susceptible frente a variaciones en la resistencia (debidos por ejemplo a cambios de temperatura).

Con esto termino el post de hoy, ya especificada la interfaz fisica con la memoria SD, pasare a explicar la configuración de la libreria para el microcontrolador AVR de nuestro interés.


Otras lecturas del mismo tema
http://elm-chan.org/docs/mmc/mmc_e.html
http://www.basementcode.com/avr/sd_fatfs/fatfs.php
http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html
 

Adjuntos

  • 1-sdExp-naxuscolombia.jpg
    1-sdExp-naxuscolombia.jpg
    108.3 KB · Visitas: 38
  • 2-microSD.JPG
    2-microSD.JPG
    66 KB · Visitas: 35
  • 3-microSD.JPG
    3-microSD.JPG
    68.8 KB · Visitas: 29
  • 4-SD-interna.png
    4-SD-interna.png
    33.2 KB · Visitas: 47
  • 5-pines-microSD.png
    5-pines-microSD.png
    37.8 KB · Visitas: 46
  • 6-pines-SD.jpg
    6-pines-SD.jpg
    15 KB · Visitas: 45
  • 7-relacionPines-SD-microSD.png
    7-relacionPines-SD-microSD.png
    151.4 KB · Visitas: 42
  • 8-divisor.png
    8-divisor.png
    49.8 KB · Visitas: 45
  • 9-pullup.png
    9-pullup.png
    49.7 KB · Visitas: 44
Última edición:
Hace un tiempo deje ejemplos de Fat32 para Attiny y Atmega32 para SD. No es muy dificil entender las librerias de "chan" lo que resulto un poco dificil el grabar en formato "*.txt" especial para "office excel" para que salga en orden.
 
alepusto

Seria bueno que por favor motaras algun ejemplo de manejo de la SDcard con avr comentado, por si no vas a seguir desarrolando el tema, ya que las librerias del "chan" no estan muy bien comentadas. Gracias :D
 
Hola! Este es mi primer post en este foro!

Quería comenzar agradeciendo por este post y los tutoriales de @alepusto

Voy a seguir de cerca el hilo a medida que se vaya ampliando la información sobre la implementación de la librería en uC. Particularmente tengo un proyecto en mente para la regularización de una cátedra implementando uC PIC, específicamente el 18F4550 (en este pensaba utilizar la librería completa), pero también tengo interés en utilizarlos en sistemas mucho mas simples sobre MSP430 de TI (vi algunas implementaciones sobre estos uC pero con la petit).

Me comprometo en ir subiendo mi avance (a este foro y seguramente al de uControl, y a mi Blog), espero que podamos avanzar entre todos!

Nuevamente muchas gracias y continúen así!
 
Hola a todos, intenté hacer correr la librería FATFS SD/MMC R0.09a de Elm-chan pero no lo logré, (Sigo Intentando
help.gif
), asi que retrocedí en versión y pues logré hacer funcionar la R0.08a .
Aqui dejo el código en AVR Studio 4 y simulador Proteus 7.7 usando microcontrolador ATmega328P.

En este ejemplo se leerán tres archivos, la librería soporta multiples archivos (crear mas variables de tipo FIL), pero yo cierro uno para abrir el otro.

Para un adecuado funcionamiento; en la función disk_initialize no comentar las lineas a1 y a2 además borrar las líneas posteriores a estas.. ( enviará 2 warnings en proteus)

Para crear la imagen con extensión .mmc he usado WinImage 8.5.

código fuente en:
http://code.google.com/p/avr-uni/downloads/list
 
Hola,

Actualmente me encuentro en la fase final de mi proyecto y he llegado a un punto muerto en el cual no tengo ni idea de como actuar, al no disponer de información.

La cuestión es que necesito crear un fichero txt con los datos leídos por mi datalooger que he desarrollado con stm8l discovery. Dispongo de un módulo sd y micro sd, más concretamente el SD card Shield 3.0, el problema es que para mi MCU no dispongo de bibliotecas ni ejemplos, estoy sin nada y lo peor de todo es que no se como hacerlo.

El SD card se puede conectar tanto por I2C, SPI o UART, pero no me dan información de como hacerlo, en I2C, por ejemplo no se cual es la dirección del dispositivo.

¿Qué debería hacer? ¿Debería intentar conectarlo por SPI? ¿Tiene que ver que el MCU sea de 8 bits para que se pueda realizar lo que yo quiero?

Por favor necesito ayuda de alguien que sepa del tema puesto que ni en los foros ni el servcio técnico de STMicroelectronics me dan respuesta y dispongo solamente de dos meses para acabar mi proyecto.

Muchas Gracias
 
Intenta enviar los datos via SPI es una comunicacion serial que te permite el envio de paquetes de 8 bits es sencilla de implementar checa en este link para que entiendas un poco su protocolo, ahora bien la memoria que usas debe tener ciertos comando con los cuales le indicas si vas a leer o escribir.

Saludos
 

Ok, lo voy a intentar, un pregunta el MCU que estoy usando es tiene 2KBytes de RAM, ¿crees que funcionará?

Lo que me gustaría saber previamente es si mi MCU está habilitado para llevar a cabo mi propósito, lo pregunto porque, como no se nada del tema no se si las características de mi MCU son las adecuadas.

Este es el enlace de la demo-board:

http://www.st.com/web/catalog/tools/FM116/SC959/SS1673/PF250636

Y este el del MCU que incorpora:

http://www.st.com/web/catalog/mmc/FM141/SC1244/SS1336/LN1570/PF244063?s_searchtype=partnumber

Destacar que lo que estoy desarrollando es un datalooger el cual ya lo tengo funcionando, por lo que cambiar de MCU ahora sería tirar 5 meses de trabajo a la basura.

He leido en el tema al que me has remitido que pude dar problemas también el SPI si comparte terminales con el USART, mi MCU comparte terminales también.

Entonces, ¿Me recomendáis que intente realizar una conexión SPI o USART? y otra pregunta, ¿es posible realizar estas comunicaciones, para probar que me funciona, sin emplear FAT al principio? es decir, conectar el módulo por SPI o USART y mandar unos bytes para comprobar y aprender el funcionamiento de SPI, antes de liarme con la programación del FAT.

Disculpadme si son preguntas tontas, es que no tengo ni idea aún, también es verdad que tengo que leer toda la información que pueda de los protocolos y del FAT.

Muchas gracias por vuestro tiempo
 
Atrás
Arriba