@@ -24,9 +24,6 @@ SOFTWARE.
2424AP3_PDM *ap3_pdm_handle = 0 ;
2525am_hal_pdm_transfer_t sTransfer ;
2626
27- #define internalPDMDataBufferSize 4096 // Default is array of 4096 * 32bit
28- uint32_t internalPDMDataBuffer[internalPDMDataBufferSize];
29-
3027bool AP3_PDM::begin (ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
3128{
3229 _PDMhandle = NULL ;
@@ -43,7 +40,16 @@ bool AP3_PDM::begin(ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
4340
4441bool AP3_PDM::available (void )
4542{
46- return (_PDMdataReady);
43+ if (_head != _tail)
44+ return (true );
45+ return (false );
46+ }
47+
48+ bool AP3_PDM::isOverrun (void )
49+ {
50+ if (_overrun == true )
51+ return (true );
52+ return (false );
4753}
4854
4955ap3_err_t AP3_PDM::_begin (void )
@@ -274,45 +280,45 @@ ap3_err_t ap3_pdm_pad_funcsel(ap3_pdm_pad_type_e type, ap3_gpio_pad_t pad, uint8
274280// *****************************************************************************
275281uint32_t AP3_PDM::getData (uint32_t *externalBuffer, uint32_t bufferSize)
276282{
277- if (_PDMdataReady)
278- {
279- if (bufferSize > internalPDMDataBufferSize)
280- bufferSize = internalPDMDataBufferSize;
281-
282- noInterrupts ();
283+ if (bufferSize > circularBufferSize)
284+ bufferSize = circularBufferSize;
283285
284- // Move data from internal buffer to external caller
285- for (int x = 0 ; x < bufferSize; x++)
286- externalBuffer[x] = internalPDMDataBuffer[x];
286+ noInterrupts ();
287287
288- interrupts ();
289- }
290- _PDMdataReady = false ;
288+ // Move data from internal buffer to external caller
289+ for ( int x = 0 ; x < bufferSize; x++)
290+ externalBuffer[x] = _pdmCircularBuffer[x] ;
291291
292- // Start next conversion
293- am_hal_pdm_dma_start (_PDMhandle, & sTransfer );
292+ interrupts ();
293+ }
294294}
295295
296296inline void AP3_PDM::pdm_isr (void )
297297{
298298 uint32_t ui32Status;
299299
300- //
301300 // Read the interrupt status.
302- //
303301 am_hal_pdm_interrupt_status_get (_PDMhandle, &ui32Status, true );
304302 am_hal_pdm_interrupt_clear (_PDMhandle, ui32Status);
305303
306304 if (ui32Status & AM_HAL_PDM_INT_DCMP)
307305 {
308- if (_PDMdataReady == true )
306+ // Move current DMA to circular buffer
307+ for (int x = 0 ; x < pdmDataBufferSize; x++)
308+ {
309+ _pdmCircularBuffer[head++] = _pdmDataBuffer[x];
310+ if (_head++ == circularBufferSize)
311+ _head = 0 ;
312+ }
313+
314+ if (_head == _tail)
309315 {
310- // If flag has not previously been cleared, we're overrun
311- // Serial.println("Buffer overrun!") ;
316+ Serial. println ( " Buffer overrun! " );
317+ _overrun = true ;
312318 }
313319
314- // New data has been loaded into internalPDMDataBuffer
315- _PDMdataReady = true ;
320+ // Start next conversion
321+ am_hal_pdm_dma_start (_PDMhandle, & sTransfer ) ;
316322 }
317323}
318324
0 commit comments