PIC32MZ, MPLAB Harmony con I2S se bloquea después de agregar una función adicional

1

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

    
pregunta Sandrocottus

2 respuestas

1

Es probable que esto se llame desde un ISR. El motor SPI es bastante exigente en cuanto a una y otra vez, puede ver si esto ocurre deteniendo y viendo el registro SPI correspondiente. Por lo tanto, mientras realiza sus cálculos intensivos, es probable que el motor spi se sobrepase, asumiendo que está utilizando dma.

La armonía extrae demasiados detalles. Puede escribir un controlador i2s en aproximadamente 300 líneas de código.

Para solucionar esto, sugeriría configurar un búfer de ping pong, o algún otro método, y hacer tus cálculos fuera de este ISR sensible al tiempo.

    
respondido por el Erik Friesen
1

¿Exactamente a qué línea no llega? Por lo general, cuando me encuentro con estas instancias, paso por el ensamblaje para ver qué registro no puede leer el procesador.

Sin embargo, solo mirando el código que has publicado, sospecho de dónde está definida la matriz ConvertedAudioData. Es posible que el compilador esté tratando esto como "declarado implícitamente", poniendo los datos en la pila, y en el momento en que deje el alcance de eso para () loop no es válido.

    
respondido por el Drewster

Lea otras preguntas en las etiquetas