lunes, 18 de enero de 2016

Port de la librería FatFs para micros PSoC de Cypress.


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”.
Retardo CS_DELAY_US

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.
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.

Para la familia de micros PSoC 5LP utilizando el kit PSoC 5LP Prototyping Kit (CY8CKIT-059).










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.


Compartir:  Facebook Twitter

4 comentarios:

  1. 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


  2. Hi!! 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.

    ResponderEliminar
  3. Excelente trabajo Jesus!

    Ya 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!

    ResponderEliminar
  4. 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;

    Best Regards

    ResponderEliminar