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?