Cómo transferir datos desde / al controlador I2S a través de AXI DMA

0

Estoy haciendo un proyecto de análisis de sonido en la placa Zybo y estoy teniendo dificultades para usar el DMA AXI para transferir datos del controlador I2S a la RAM. Estoy usando el controlador I2S de github de Digilent que en realidad es una versión modificada Analog Devices IP : el códec de la placa es el SSM2603 de Analog. Se supone que la IP es compatible con el modo AXI DMA, así como con el PL330 DMA (del sistema de procesamiento) y también existe la posibilidad de acceso directo al registro. El ejemplo del sistema base de Zybo usa este último. I2S IP utiliza un FIFO 8x24 para cada canal y sé que funciona con acceso directo al registro.

Estoy tratando de hacer la transferencia de datos "correctamente" con un DMA y, como no se encuentran ejemplos de PL330 (al menos no de metal desnudo, que es lo que estoy haciendo), estoy tratando de usar el AXI DMA. Sin embargo, sólo puedo obtener algunas muestras a la memoria RAM. Realmente no sé si hay un problema en el controlador I2S o en mi configuración del DMA, por lo que primero me gustaría saber si entiendo cómo funciona el DMA.

Estoy basando mi código en el ejemplo de DMA de Xilinx, por lo que creo que las inicializaciones y similares se hacen correctamente. De lo que no estoy seguro es de lo siguiente: comienzo la transferencia de S2MM (Transferencia a memoria asignada - I2S a RAM) con el número de bytes que se transferirán y espero que el controlador I2S solo envíe datos cuando los tenga. Entonces, si quiero transferir 5 segundos de audio, comienzo la transferencia de

5 * 48000 (sampling frequency) * 2 (channels) bytes.

Por ahora, espero la interrupción en la que se establece un indicador, para saber que la transferencia ha finalizado. Espero que esto dure 5 segundos, pero en lugar de eso ocurre en un par de cientos de ms (no tengo o-scope) y solo llegan algunas muestras.

¿Entonces mi entendimiento es correcto? ¿Alguna vez alguien ha usado esta IP I2S con DMA?

    
pregunta Luka

1 respuesta

0

Bien, parece que mi comprensión descrita en la pregunta es correcta. El DMA AXI funciona como lo describí y el controlador I2S también parece funcionar correctamente. El problema fue que pensé que una vez que se afirma que TLAST se restablece y la transferencia continúa, cuando en realidad se detiene de inmediato. Debería haber leído cómo funciona la transmisión AXI.

Así que necesitaba establecer un registro de período en el controlador I2S más alto (solo tiene 16 bits de longitud, por lo que podría hacerlo más grande más adelante). Ahora tengo otro problema con la transferencia de MM2S, pero eso realmente no pertenece a esta respuesta.

    
respondido por el Luka

Lea otras preguntas en las etiquetas