@@ -22,7 +22,15 @@ SOFTWARE.
22
22
#include " PDM.h"
23
23
24
24
AP3_PDM *ap3_pdm_handle = 0 ;
25
- am_hal_pdm_transfer_t sTransfer ;
25
+
26
+ // AP3_PDM::AP3_PDM(uint16_t *userBuffer, uint32_t bufferSize)
27
+ // {
28
+ // _userBuffer = userBuffer;
29
+ // _userBufferSize = bufferSize;
30
+
31
+ // _readHead = 0;
32
+ // _writeHead = 0;
33
+ // }
26
34
27
35
bool AP3_PDM::begin (ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
28
36
{
@@ -40,15 +48,19 @@ bool AP3_PDM::begin(ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
40
48
41
49
bool AP3_PDM::available (void )
42
50
{
43
- if (_head != _tail)
51
+ // if (_readHead != _writeHead)
52
+ if (buff1New || buff2New)
44
53
return (true );
45
54
return (false );
46
55
}
47
56
48
57
bool AP3_PDM::isOverrun (void )
49
58
{
50
59
if (_overrun == true )
60
+ {
61
+ _overrun = false ;
51
62
return (true );
63
+ }
52
64
return (false );
53
65
}
54
66
@@ -124,7 +136,7 @@ ap3_err_t AP3_PDM::_begin(void)
124
136
125
137
// Configure DMA and set target address of internal buffer.
126
138
sTransfer .ui32TargetAddr = (uint32_t )_pdmDataBuffer;
127
- sTransfer .ui32TotalCount = pdmDataBufferSize * 2 ;
139
+ sTransfer .ui32TotalCount = _pdmBufferSize * 2 ;
128
140
129
141
// Start the data transfer.
130
142
am_hal_pdm_enable (_PDMhandle);
@@ -278,23 +290,36 @@ ap3_err_t ap3_pdm_pad_funcsel(ap3_pdm_pad_type_e type, ap3_gpio_pad_t pad, uint8
278
290
// Returns number of bytes read.
279
291
//
280
292
// *****************************************************************************
281
- uint32_t AP3_PDM::getData (uint32_t *externalBuffer, uint32_t bufferSize )
293
+ uint32_t AP3_PDM::getData (uint16_t *externalBuffer, uint32_t externalBufferSize )
282
294
{
283
- if (bufferSize > circularBufferSize )
284
- bufferSize = circularBufferSize ;
295
+ if (externalBufferSize > _pdmBufferSize )
296
+ externalBufferSize = _pdmBufferSize ;
285
297
286
- noInterrupts ();
287
-
288
- // Move data from internal buffer to external caller
289
- for (int x = 0 ; x < bufferSize; x++)
298
+ // Move data from internal buffers to external caller
299
+ if (buff1New == true )
290
300
{
291
- externalBuffer[x] = _pdmCircularBuffer[tail];
292
- if (tail++ == circularBufferSize)
301
+ for (int x = 0 ; x < externalBufferSize; x++)
302
+ {
303
+ externalBuffer[x] = outBuffer1[x];
304
+ }
305
+ buff1New = false ;
293
306
}
294
-
295
- interrupts ();
296
-
297
- return (bufferSize)
307
+ else if (buff2New == true )
308
+ {
309
+ for (int x = 0 ; x < externalBufferSize; x++)
310
+ {
311
+ externalBuffer[x] = outBuffer2[x];
312
+ }
313
+ buff2New = false ;
314
+ }
315
+ // for (int x = 0; x < externalBufferSize; x++)
316
+ // {
317
+ // externalBuffer[x] = _userBuffer[_readHead];
318
+ // _readHead++; //Advance the read head
319
+ // _readHead %= _userBufferSize; //Wrap if necessary
320
+ // }
321
+
322
+ return (externalBufferSize);
298
323
}
299
324
300
325
inline void AP3_PDM::pdm_isr (void )
@@ -307,18 +332,60 @@ inline void AP3_PDM::pdm_isr(void)
307
332
308
333
if (ui32Status & AM_HAL_PDM_INT_DCMP)
309
334
{
310
- // Move current DMA to circular buffer
311
- for (int x = 0 ; x < pdmDataBufferSize; x++)
335
+ uint32_t tempReadAmt = _pdmBufferSize;
336
+
337
+ // if (_writeHead + _pdmBufferSize > _userBufferSize)
338
+ // {
339
+ // //Goes past the end of our buffer, adjust the amout to read so we hit end of buffer
340
+ // tempReadAmt = _userBufferSize - _writeHead; //16384 - 16000 = 384
341
+ // }
342
+
343
+ // int i;
344
+ // for (i = 0; i < tempReadAmt; i++)
345
+ // {
346
+ // _userBuffer[_writeHead + i] = _pdmDataBuffer[i];
347
+ // }
348
+
349
+ // _writeHead += tempReadAmt; //Advance the head
350
+ // _writeHead %= _userBufferSize; //Wrap the head
351
+
352
+ // if (tempReadAmt < _pdmBufferSize)
353
+ // {
354
+ // //Finish the read where i had left off
355
+ // for (; i < _pdmBufferSize; i++)
356
+ // {
357
+ // _userBuffer[i - tempReadAmt] = _pdmDataBuffer[i];
358
+ // }
359
+
360
+ // _writeHead += _pdmBufferSize - tempReadAmt;
361
+ // }
362
+ // Check for overflow
363
+ // if (_writeHead + pdmBufferSize
364
+
365
+ // Store in the first available buffer
366
+ if (buff1New == false )
312
367
{
313
- _pdmCircularBuffer[head++] = _pdmDataBuffer[x];
314
- if (_head++ == circularBufferSize)
315
- _head = 0 ;
368
+ for (int i = 0 ; i < _pdmBufferSize; i++)
369
+ {
370
+ outBuffer1[i] = pi16Buffer[i];
371
+ }
372
+ buff1New = true ;
316
373
}
317
-
318
- if (_head == _tail)
374
+ else if (buff2New == false )
375
+ {
376
+ for (int i = 0 ; i < _pdmBufferSize; i++)
377
+ {
378
+ outBuffer2[i] = pi16Buffer[i];
379
+ }
380
+ buff2New = true ;
381
+ }
382
+ else
319
383
{
320
- Serial.println (" Buffer overrun!" );
321
384
_overrun = true ;
385
+ // Used for debugging
386
+ Serial.println (" \n\r Over flow!" );
387
+ while (1 )
388
+ ;
322
389
}
323
390
324
391
// Start next conversion
0 commit comments