Esta entrada no es un tutorial sobre cómo utilizar la
librería FatFs de ELM-Chan,
tan solo voy a dar las indicaciones necesarias para poder utilizar el
port que he realizado para los microcontroladores PSoC de Cypress.
Si necesitas saber más sobre la librería o el uso de
sus funciones, en internet puedes encontrar abundante información
sobre su uso y uno de los mejores sitios es la propia página de la
librería: ELM-Chan.
Sobre el Port.
El motivo para realizar el port de la librería fué la necesidad de implementar la grabación de datos en tarjetas SD con un micro de Cypress de la familia PSoC 4, para posteriormente tratar esos datos en un PC de sobremesa.
Partiendo de la versión R0.11a, que en el
momento de escribir esta entrada, es la última versión disponible y
la más moderna; los cambios necesarios para hacer funcionar la
librería con el micro PSoC 4 fueron mínimos. No fueron necesarios
cambios en ninguno de los archivos principales de la librería y se
realizaron cambios únicamente en el archivo “sdcard.c” que es el
que implementa el acceso a bajo nivel a las tarjetas SD. De hecho,
los cambios fueron tan sencillos que al final decidí comprobar que
funcionaban también en micros de la familia PSoC 4M e incluso hice
un port para los micros de la familia PSoC 5LP.
El port de la librería así como algunas aplicaciones
desarrolladas para pruebas puedes descargarlos de Github.
Cómo utilizar la librería.
Para utilizar la librería en tu proyecto sigue los
pasos que te indico a continuación:
-
Añade un módulo de comunicaciones SPI al esquema de tu proyecto y configúralo como maestro en modo CPHA = 0, CPOL = 0.
-
Añade una salida digital que será utilizada para la señal de selección del bus SPI. Para el buen funcionamiento de la librería, esta señal tendrá que ser controlada por el código de la librería en lugar de dejar al hardware y a la API que lo hagan. En PSoC 4 puedes hacerlo de dos manera distintas: añadir una salida digital, o reutilizar una de las señales SS del propio módulo SPI. Para utilizar esta última manera, habrá que desconectar la señal SS del módulo SPI del HSIOM (High Speed I/O Matrix). Si no sabes a qué me refiero, mira los ejemplos y consulta el manual de referencia de PSoC 4.
-
Añade los archivos que hay dentro de la carpeta PSoC_FatFs_Library del repositorio a tu proyecto.
-
Si vas a configurar la librería con funciones de escritura y quieres que la fecha y hora de los archivos sean los correctos tendrás que implementar por tí mismo un reloj de tiempo real (más información sobre RTC aquí).
-
Añade los “#includes” necesarios en la parte que corresponda de tu código (mira los ejemplos).
-
Retoca los valores de las macros que hay al principio del archivo “sdcard.c”:
-
SPI_NAME. En esta macro, pon el nombre que le hayas dado al módulo SPI en el esquema de tu proyecto. Gracias a esta macro, si decides cambiar el nombre del módulo SPI en el esquema, no tendrás que retocar los nombres de todas las funciones relativas al bus SPI dentro del código de “sdcard.c”, solo tendrás que cambiar el valor asignado a esta macro.
-
mmSPI_SS_Write(value). Función de la API correspondiente a la línea que hayas utilizado para la señal SS del bus SPI. Ejemplo: supón que añades en el esquema una salida digital a la que llamas SS. La api proveerá una función llamada SS_Write(valor) que permitira, desde el firmware fijar el valor lógico de esa salida. Esta es la función que has de asignar a esta macro. El motivo es el mismo que para la macro anterior.
-
CS_DELAY_US. Retardo en microsegundos desde que se activa la señal SS del bus SPI hasta que empieza el envío de datos.
-
M_DELAY_US. Retardo utilizado internamente en “sdcard.c”.
-
Es posible que tengas que retocar los
valores de estas dos últimas macros según el microcontrolador que
utilices y en función de la frecuencia a que lo configures. Por lo
que he podido comprobar, parece ser que las funciones para retardo de
las librerías para PSoC fallan algo en cuanto a precisión, al menos
las relativas a retardos en microsegundos (CyDelayUs) que son las
utilizadas en la librería.
Ejemplos.
En el repositorio de GitHub hay una carpeta con
proyectos para los distintos micros PSoC. Tanto la librería como el
desarrollo de los ejemplos se hicieron utilizando la última versión
de PSoC Creator (en el momento de escribir esta entrada es la versión
3.3).
Todos los ejemplos se probaron con distintas tarjetas
SD:
-
Una tarjeta Sandisk de 2GB normalilla.
-
Una tarjeta Sandisk Ultra SDHC I (30mb/s) de 4GB.
-
Otras tres tarjetas micro-SD sin marca de 2GB.
En todos los casos, las tarjetas se formatearon en un
PC con Windows XP utilizando la función habitual de formateo del
sistema operativo y todos los ejemplos funcionaron a la perfección.
No obstante, ten en cuenta que algunas tarjetas podrían fallar.
Los ejemplos son sencillos y fáciles de entender si
miras el código del archivo “main.c”. En los tres casos, el
funcionamiento es el mismo y están preparados para ser controlados
por puerto serie RS232 mediante algún programa de terminal como
TeraTerm, Hyperterminal de Windows o similar.
En ninguno de los proyectos se ha implementado un reloj
de tiempo real aunque se añadieron los archivos “rtc.c” y
“rtc.h” para simular su existencia. En “rtc.c” está la
función “get_fattime()” que es llamada por la librería FatFs
para obtener la fecha y hora del sistema cuando ha de grabar o crear
archivos. En este caso, la función siempre devuelve la misma fecha y
hora en el formato adecuado.
PSoC 4.
Proyecto preparado para ser testado en un kit de desarrollo PSoC 4 Pioneer Kit (CY8CKIT-042). En este caso, para la línea SS decidí utilizar una de las líneas SS del propio módulo SPI desconectandola del HSIOM.
PSoC 4.
Proyecto preparado para ser testado en un kit de desarrollo PSoC 4 Pioneer Kit (CY8CKIT-042). En este caso, para la línea SS decidí utilizar una de las líneas SS del propio módulo SPI desconectandola del HSIOM.
En la figura se muestran las conexiones del kit con la
tarjeta SD así como los puentes utilizados para el puerto serie.
Recuerda que hay que configurar la alimentación de la
placa de desarrollo a 3.3V.
PSoC 4M.
Proyecto idéntico al anterior pero utilizando el kit de desarrollo PSoC 4M-Series Pioneer Kit (Cy8CKIT-044).
Aunque existe conexión en la misma placa para el
puerto serie, en este caso no la utilizo y es necesario añadir
también unos puentes, indicados en la imagen en color verde.
Igualmente hay que configurar la placa para trabajar a
3.3V.
PSoC 5LP.
En este caso, hay que eliminar el diodo D1 que está en la parte inferior de la placa de desarrollo para evitar que la parte del microcontrolador se alimente con los 5V del bus USB y conectar una alimentación externa de 3.3V.
Para acabar.
Tanto la librería como los ejemplos son bastante fáciles de utilizar y de adaptar para otros kits o para tu propio hardware.
Si aún así tienes algún problema, puedes dejarme un
comentario en esta entrada y si puedo y sin prometer nada trataré de
echarte una mano.
jesusrcc, thank you for the porting work! Have you managed to get the PSoC 5LP variant of the application working for >4gb SD cards? I tried your application (without changing any of your code) but it does not seem to work with my 8gb microSD. I did not remove diode D1 as I have a separate SD card module with integrated logic converter to bring 5V down to 3.3V levels.
ResponderEliminar
ResponderEliminarHi!! Sameera.
Sorry for the delay in response, but i think i gave you an answer in cypress forums.
Similar problem happened to others that use the library with PSoC working at 5V and some kind of sdcard prototyping board or shield. Probably, the problem is with the MISO line.
SDCard works at 3.3V, so the higher voltage at MISO line when there is a ‘high’ level is 3.3V. From the datasheet: PSoC working at 5V needs at least 0.7V * VDD at gpio input for ‘high’ level this is 3.5V; higher than the maximun voltage at MISO line.
You will need some kind of level shifter at MISO line if you use PSoC powered at 5V.
Excelente trabajo Jesus!
ResponderEliminarYa me está dando resultados...
Sabes exactamente las velocidades de lectura/escritura que se alcanzan? - Has probado con memorias de más de 4Gb?
Gracias de nuevo, gran trabajo para la comunidad!
Hey, did you ever test the read functions? Did you get it to work? Having problems reading from the files, it seems on the f_gets fucntion it gets stuck on the instruction *p++ = c;
ResponderEliminarBest Regards