¿Cómo almacenar datos de audio para el proyecto AVR?

5

Veo muchos proyectos para reproductores de audio basados en AVR que usan una tarjeta SD para almacenar los datos de audio.

De hecho, actualmente estoy haciendo lo mismo en un Arduino y su Wave Shield, que tiene un lector de tarjetas SD.

Sin embargo, me gustaría desarrollar un dispositivo que almacene el sonido en la memoria EEPROM o en la memoria flash en lugar de un medio extraíble.

Los archivos actuales son WAV PCM WAV de 16 bits de 16 bits y en total requieren 620 kilobytes.

No estoy seguro de qué buscar en los chips de memoria. Sé que necesitaré suficiente almacenamiento según los requisitos anteriores. El dispositivo no registra ni altera los datos, por lo que no es necesaria una capacidad adicional. Obviamente, quiero seleccionar la solución de menor costo que aún cumpla con los requisitos:

  • Debe almacenar al menos 620 KB
  • Será necesario que sea lo suficientemente rápido como para admitir la reproducción de 1 canal de 16 kHz y 16 kHz.
  • Compatible con microcontroladores AVR
  • Se puede escribir una sola vez
  • Debe retener datos sin poder
  • Preferiblemente el paquete SMD pero el orificio pasante es aceptable

¡Se agradecerán enormemente algunos consejos generales sobre cómo agregar y usar flash (u otros tipos) de memoria!

    
pregunta JYelton

2 respuestas

6

Le recomendaría que vea las piezas modernas del tipo SPI FLASH. Winbond es un fabricante que fabrica una buena variedad de piezas que serían perfectas para la implementación en la interfaz de hardware SPI en su AVR.

DigikeyalmacenalaspartesWinbondqueestándisponiblesenlassiguientescapacidades:

1MBytepor0.50$USD enlace

2 MByte por 0.74 $ USD enlace

8 MByte por 3.01 $ USD enlace

Se fabrican otros tamaños, pero no están actualmente en stock.

Estas partes son muy fáciles de agregar a un circuito. Los pines SPI_CLK, SPI_MOSI y SPI_MISO del puerto SPI se conectan directamente a tres pines en el SPI Flash. + 3.3V y GND son la potencia adecuada para la pieza y asegúrese de agregar un capacitor de derivación de 0.1uF a través de los pines de alimentación del chip. Los pines restantes / HOLD y / WP se pueden jalar fácilmente a 3.3V a través de resistencias de 10K. Para las piezas SPI FLASH como estas, también tiene que soportar un pin / CS en la pieza. No puede vincular esto a GND ya que la pieza está diseñada para restablecer la máquina de estado de comando cuando maneja el pin / CS pin high para prepararse para el siguiente comando.

Las partes de SPI FLASH como éstas se acceden en bloques de datos. Los tipos a los que me he vinculado aquí admiten tamaños de bloque de 4K bytes que inicialmente se tratan en los comandos de lectura / escritura a través de una dirección de múltiples bytes incluida en los comandos. En su aplicación, no sería necesario tener un búfer de RAM para cargar un bloque de lectura completo. Puede iniciar la lectura de un bloque SPI FLASH y luego leer unos pocos bytes a la vez y enviarlos a su hardware de reproductor de audio. Cada vez que cruce el límite 4K puede enviar el comando nuevamente para dirigirse al siguiente bloque. Sin embargo, es posible enviar un comando para comenzar en algún bloque en particular y luego, mientras mantenga presionado el pin / CS bajo y continúe suministrando relojes, es posible leer secuencialmente toda la parte de la memoria si es necesario.

Tenga en cuenta que estas partes admiten la lectura y escritura en los modos heredados de ancho de bit único, que presumiblemente es la forma en que los usaría con el AVR. También admiten la lectura y la escritura en los modos de 2 y 4 bits para los modos de transferencia de datos de velocidad súper alta, pero esos modos requieren un controlador SPI capaz de manejar los modos de datos en serie duales y cuádruples más amplios.

    
respondido por el Michael Karas
7

Podría transcribir el contenido de los muchos tutoriales sobre este tema aquí, pero prefiero señalarle uno muy bueno que explica la teoría y la implementación bastante bien: enlace .

En pocas palabras, utiliza PWM para controlar el altavoz, y puede almacenar las muestras de audio en un formato comprimido rudimentario (por ejemplo, codificado por Huffman) en la memoria flash (programa) o eeprom en una tabla de símbolos. Lo que estoy diciendo es que no necesita un chip de memoria externo necesariamente dependiendo de la fidelidad del audio y la duración que desee almacenar. Muchos AVR tienen una gran cantidad de memoria no volátil para este tipo de cosas.

Si realmente necesita más espacio del que puede obtener en el AVR, puede usar una EEPROM SPI externa, ya que casi todos los AVR tienen una interfaz SPI. Simplemente busque "memoria en serie" en digikey, ingrese a la categoría "Memoria", filtre hacia abajo a la interfaz en serie que elija (por ejemplo, SPI), excluya "RAM" de la categoría "Formato - Memoria" y todavía tendrá más de 700 dispositivos para elegir. Simplemente elija el más barato que sea lo suficientemente grande para almacenar lo que necesita, que viene en un paquete con el que está preparado (recomiendo SO-8 para principiantes de montaje en superficie).

Todos estos funcionan básicamente de la misma manera, solo lea la hoja de datos para comprender el formato del comando. SPI funciona dedicando un pin GPIO al dispositivo de destino para decirle que desea comunicarse con él (lo que se conoce como "chip select" o "/ CS"). Simplemente conecte a tierra ese pin y use el hardware SPI del AVR para hablar con él según las hojas de datos del dispositivo. Navegue por la web / avrfreaks / github para dispositivos con soporte de biblioteca si desea utilizar un método abreviado en el software, pero honestamente estamos hablando de un código de interfaz bastante simple aquí.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas