Autor Tema: Leer simultaneamente dos ficheros de SD  (Leído 2011 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Leer simultaneamente dos ficheros de SD
« en: 22 de Septiembre de 2017, 07:10:32 »
 
¿ Sabeis si es posible leer al mismo tiempo dos ficheros de una tarjeta SD desde un microcontrolador ?.

Una parte varios de mis nuevos proyectos necesitan un reproductor de sonidos (WAV o RAW), para eso voy a usar un Kinetis MK20, MK64 o MK66, con las librerías Teensy de Audio (aún tengo que probar si usar el DAC del micro o un codec por I2S con el chip SGTL5000).

El problema que me ha surgido es que mi sistema de sonido, necesita poder reproducir al menos dos sonidos al mismo tiempo en algunas ocasiones. La idea es que los sonidos están almacenados en tarjeta SD, y aquí viene el problema, parece que no es posible abrir y leer dos ficheros al mismo tiempo (con librerías SD/SdFat).

En principio solo se me ocurre añadir una Eprom o una Flash por SPI y que los archivos se carguen solo una vez desde la tarjeta SD a la Eprom y desde allí los lea el programa, supongo que en ese caso no habrá problema en leer de manera simultanea los datos.

Otra sería usar la RAM como memoria intermedia, leer un fichero de sonido cargarlo en RAM y lanzarlo, mientras se abre y lee el segundo, pero esto implica que tiene que haber suficiente RAM para cargar el archivo y que hasta que no se lea totalmente el primer archivo, no se podrá leer el segundo, y si el primer archivo es gordo pueden producirse retrasos en la reproducción.

La tercera que se me ocurre, es un poco cutre, sería poner dos tarjeteros SD (uno por SPI y el otro SDIO), teniendo duplicados todos los archivos en ambas tarjetas.

Nunca había pensado en estas limitaciones con las SD, el poder abrir y leer varios ficheros simultáneamente.
« Última modificación: 22 de Septiembre de 2017, 07:20:50 por planeta9999 »

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Leer simultaneamente dos ficheros de SD
« Respuesta #1 en: 22 de Septiembre de 2017, 09:25:12 »
Otra opción es tener una memoria cache en RAM, no tan grande,probablemente de 4096 bytes por archivo abierto, estos van a contener parte de los archivos.

Cuando se valla a llegar al final de los 4096 bytes se manda una petición de lectura del siguiente bloque, pero para evitar colisiones todo se manda a una cola para que estas peticiones sea procesadas de forma secuencial.

Sería algo así como añadir una capa extra sobre las librerías.

Realizando un ejercicio mental para asentar ideas, me imagino algo como esto

Código: C
  1. typedef struct fsector{
  2.     *char filename;
  3.     uint32_t size;
  4.     uint32_t offset;
  5.     char cache[2][4096];
  6.     uint8_t cache_valid_data[2];
  7.     uint8_t a_cache; //Active Cache (0/1)
  8. };

Crear una tabla que va a fungir como cola, a la cual se le va a añadir la petición añadiendo el puntero a la estructura del fsector.

Entonces en tu capa que esté encima de las librerías FAT tendrías algo como

Código: C
  1. fs_read(fsector *queue, fsector *file)

El cual se encargará de mandar a la cola la petición de lectura, además de setear a 0, que podría significar falsa para indicar que el contenido en la caché donde se va a colocar los nuevos datos no es válido. Cuando salga de la cola este valor cambiaría a 1 indicando que los datos son validos para ser usados.

a_cache te indicaría cual caché es la que estas usando en este momento y a la hora de agotar los elementos este oscilaría entre 0 y 1 además de enviar una nueva petición de lectura para contar con nuevos datos en la caché que acabamos de terminar.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Leer simultaneamente dos ficheros de SD
« Respuesta #2 en: 22 de Septiembre de 2017, 10:20:28 »

Todavía no estoy seguro si no se pueden abrir dos o más archivos a la vez en una SD, en algunos sitios leo que si, pero nadie da un fuente de ejemplo, lo tendré que probar yo mismo para averiguarlo.

Lo que comentas está bien, pero no se todavía como me podría posicionar en el fichero en el sitio en el que se quedó la última lectura, y además la rutina que lee el archivo a reproducir está en una librería. En principio es una función transparente al usuario, simplemente le haces un play al vínculo que hay con el tarjetero, pasándole como parámetro el fichero a reproducir, y esa rutina ya se encarga de todo.

Ahora me he pedido una plaquita con el SGTL5000, para hacer todas las pruebas por I2S, y comprobaré si realmente no se pueden abrir y leer dos ficheros al mismo tiempo. Otra cosa será que aún pudiéndose, no se produzcan retrasos en las lecturas que impidan que los sonidos se reproduzcan sin problemas, espero que al usar un acceso SDIO sean menos probable los fallos.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Leer simultaneamente dos ficheros de SD
« Respuesta #3 en: 22 de Septiembre de 2017, 10:24:50 »
Para eso es el offset, y la librería que vas a usar debe de contar con la instrucción lseek para posicionarse en el lugar adecuado.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Leer simultaneamente dos ficheros de SD
« Respuesta #4 en: 22 de Septiembre de 2017, 10:56:56 »

Lo probaré todo, cuando reciba la placa del codec por I2S. Se la he pedido esta noche a HobbyTronics del Reino Unido por internet, y ya me han dado el tracking de UPS, así da gusto, que rapidez.


 

anything