He referido enlace y puedo configurar el I2S y leer datos continuos desde un micrófono.
Estoy enfrentando un problema con los datos del micrófono, y ya lo he estado discutiendo aquí PIC32MZ: MSB de datos I2S del micrófono digital siempre es alto . Sin embargo, ese es otro problema en conjunto.
He configurado el I2S en DMA y puedo leer continuamente los datos del micrófono digital en mi búfer.
Mi problema es que cada vez que agrego una función para calcular la media, el promedio o para filtrar el desplazamiento de CC de los datos, mi programa PIC32MZ se atasca.
Recibo la interrupción DMA y, por consiguiente, los datos digitales de I2S una vez, pero después de eso nunca llego al punto de interrupción donde leí los datos.
A continuación aparece mi código para leer datos en la interrupción DMA: -
void APP_VOICE_RECORD_LOOP_BufferEventHandler(DRV_I2S_BUFFER_EVENT event,
DRV_I2S_BUFFER_HANDLE handle, uintptr_t context)
{
// The context handle was set to an application specific
// object. It is now retrievable easily in the event handler.
//MY_APP_OBJ myAppObj = (MY_APP_OBJ *) contextHandle;
uint32_t convertedBufferCount = 0;
uint32_t evenCount = 0;
switch(event)
{
case DRV_I2S_BUFFER_EVENT_COMPLETE:
// This means the data was transferred.
appVoiceRecordLoopData.codecClient.rxbufferObject = (uint32_t *) micbuf2;
DRV_I2S_BufferAddRead(appVoiceRecordLoopData.codecClient.handle,
appVoiceRecordLoopData.codecClient.txbufferObject,
appVoiceRecordLoopData.codecClient.rxbufferObject,
appVoiceRecordLoopData.codecClient.bufferSize);
uint32_t receivedBufferSize = appVoiceRecordLoopData.codecClient.bufferSize / sizeof(uint32_t);
for(evenCount = 0; evenCount < receivedBufferSize; evenCount++)
{
if(evenCount%2 == 0 && micbuf2[evenCount] != 0)
{
ConvertedAudioData[convertedBufferCount++] = (micbuf2[evenCount] >> 14);
}
}
//uint32_t average = CalculateAverage(ConvertedAudioData, convertedBufferCount);
appVoiceRecordLoopData.state = APP_VOICE_RECORD_LOOP_STATES_CODEC_WAIT_FOR_BUFFER_COMPLETE;
break;
case DRV_I2S_BUFFER_EVENT_ERROR:
// Error handling here.
break;
case DRV_I2S_BUFFER_EVENT_ABORT:
// Error handling here.
break;
default:
break;
}
}
El código funciona correctamente cuando comento
//uint32_t average = CalculateAverage(ConvertedAudioData, convertedBufferCount);
Sin embargo, cuando elimino el comentario de esta función, el código nunca llega aquí la segunda vez.
¿Alguna sugerencia de lo que podría estar haciendo incorrectamente aquí?
Gracias de antemano