@@ -24,9 +24,6 @@ SOFTWARE.
24
24
AP3_PDM *ap3_pdm_handle = 0 ;
25
25
am_hal_pdm_transfer_t sTransfer ;
26
26
27
- #define internalPDMDataBufferSize 4096 // Default is array of 4096 * 32bit
28
- uint32_t internalPDMDataBuffer[internalPDMDataBufferSize];
29
-
30
27
bool AP3_PDM::begin (ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
31
28
{
32
29
_PDMhandle = NULL ;
@@ -43,7 +40,16 @@ bool AP3_PDM::begin(ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
43
40
44
41
bool AP3_PDM::available (void )
45
42
{
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 );
47
53
}
48
54
49
55
ap3_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
274
280
// *****************************************************************************
275
281
uint32_t AP3_PDM::getData (uint32_t *externalBuffer, uint32_t bufferSize)
276
282
{
277
- if (_PDMdataReady)
278
- {
279
- if (bufferSize > internalPDMDataBufferSize)
280
- bufferSize = internalPDMDataBufferSize;
281
-
282
- noInterrupts ();
283
+ if (bufferSize > circularBufferSize)
284
+ bufferSize = circularBufferSize;
283
285
284
- // Move data from internal buffer to external caller
285
- for (int x = 0 ; x < bufferSize; x++)
286
- externalBuffer[x] = internalPDMDataBuffer[x];
286
+ noInterrupts ();
287
287
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] ;
291
291
292
- // Start next conversion
293
- am_hal_pdm_dma_start (_PDMhandle, & sTransfer );
292
+ interrupts ();
293
+ }
294
294
}
295
295
296
296
inline void AP3_PDM::pdm_isr (void )
297
297
{
298
298
uint32_t ui32Status;
299
299
300
- //
301
300
// Read the interrupt status.
302
- //
303
301
am_hal_pdm_interrupt_status_get (_PDMhandle, &ui32Status, true );
304
302
am_hal_pdm_interrupt_clear (_PDMhandle, ui32Status);
305
303
306
304
if (ui32Status & AM_HAL_PDM_INT_DCMP)
307
305
{
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)
309
315
{
310
- // If flag has not previously been cleared, we're overrun
311
- // Serial.println("Buffer overrun!") ;
316
+ Serial. println ( " Buffer overrun! " );
317
+ _overrun = true ;
312
318
}
313
319
314
- // New data has been loaded into internalPDMDataBuffer
315
- _PDMdataReady = true ;
320
+ // Start next conversion
321
+ am_hal_pdm_dma_start (_PDMhandle, & sTransfer ) ;
316
322
}
317
323
}
318
324
0 commit comments