Estoy intentando que i2s y adc trabajen juntos en la placa stm32f4. Aquí está mi código para generar una onda de sierra simple, y salida a través de CS43L22
frequency = 80;
fs = 48000;
step = fs/frequency;
k = 65536/step;
while (1)
{
buffer[0]=i;
buffer[1]=i;
HAL_I2S_Transmit(&hi2s3, buffer, 2 , 10);
i>65536?i=0:(i+=k);
}
Y estoy usando un búfer DMA circular con conversión continua de adc. Si comienzo el proceso adc_dma, la generación de la onda se detiene.
Tengo tres preguntas con respecto a este tema;
1) ¿Por qué se detiene i2s al convertir adc con dma?
2) ¿Debo usar diferentes métodos I2S, es decir, IT, DMA?
3) Con respecto a la segunda pregunta, ¿cómo se utilizan las funciones getstate de hal? Intenté usar algo como
if(HAL_I2S_GetState(&hi2s3) == HAL_I2S_STATE_READY)
HAL_I2S_Transmit_DMA(&hi2s3, buffer, 2);
en el bucle while, no funcionó. ¿Qué estoy haciendo mal? ¿Debo estar utilizando controles de bandera como este?
if(hi2s3.State == HAL_I2S_STATE_READY)
HAL_I2S_Transmit_DMA(&hi2s3, buffer, 2);