@@ -22,6 +22,11 @@ SOFTWARE.
22
22
#include " PDM.h"
23
23
24
24
AP3_PDM *ap3_pdm_handle = 0 ;
25
+ am_hal_pdm_transfer_t sTransfer ;
26
+
27
+ // Temp
28
+ #define internalPDMDataBufferSize 4096 // Default is array of 4096 * 32bit
29
+ uint32_t internalPDMDataBuffer[internalPDMDataBufferSize];
25
30
26
31
bool AP3_PDM::begin (ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
27
32
{
@@ -106,12 +111,22 @@ ap3_err_t AP3_PDM::_begin(void)
106
111
// completion).
107
112
//
108
113
am_hal_pdm_interrupt_enable (_PDMhandle, (AM_HAL_PDM_INT_DERR | AM_HAL_PDM_INT_DCMP | AM_HAL_PDM_INT_UNDFL | AM_HAL_PDM_INT_OVF));
109
- am_hal_interrupt_master_enable ();
114
+ // am_hal_interrupt_master_enable();
110
115
NVIC_EnableIRQ (PDM_IRQn);
111
116
112
117
// Register the class into the local list
113
118
ap3_pdm_handle = this ;
114
119
120
+ // Configure DMA and set target address of internal buffer.
121
+ sTransfer .ui32TargetAddr = (uint32_t )internalPDMDataBuffer;
122
+ sTransfer .ui32TotalCount = internalPDMDataBufferSize * 2 ;
123
+
124
+ // Start the data transfer.
125
+ am_hal_pdm_enable (_PDMhandle);
126
+ am_util_delay_ms (100 );
127
+ am_hal_pdm_fifo_flush (_PDMhandle);
128
+ am_hal_pdm_dma_start (_PDMhandle, &sTransfer );
129
+
115
130
return retval;
116
131
}
117
132
@@ -255,24 +270,21 @@ ap3_err_t ap3_pdm_pad_funcsel(ap3_pdm_pad_type_e type, ap3_gpio_pad_t pad, uint8
255
270
// Start a transaction to get some number of bytes from the PDM interface.
256
271
//
257
272
// *****************************************************************************
258
- void AP3_PDM::getData (uint32_t *PDMDataBuffer , uint32_t bufferSize)
273
+ void AP3_PDM::getData (uint32_t *externalBuffer , uint32_t bufferSize)
259
274
{
260
- //
261
- // Configure DMA and target address.
262
- //
263
- am_hal_pdm_transfer_t sTransfer ;
264
- sTransfer .ui32TargetAddr = (uint32_t )PDMDataBuffer;
265
- sTransfer .ui32TotalCount = bufferSize * 2 ; // PDM_FFT_BYTES;
266
-
267
- //
268
- // Start the data transfer.
269
- //
270
- am_hal_pdm_enable (_PDMhandle);
271
- am_util_delay_ms (100 );
272
- am_hal_pdm_fifo_flush (_PDMhandle);
273
- am_hal_pdm_dma_start (_PDMhandle, &sTransfer );
275
+ if (_PDMdataReady)
276
+ {
277
+ noInterrupts ();
274
278
279
+ // Move data from internal buffer to external caller
280
+ for (int x = 0 ; x < bufferSize; x++)
281
+ externalBuffer[x] = internalPDMDataBuffer[x]; // Not clear, PDMDataBuffer is bufferSize * 2, do we need just the one left byte vs one right byte?
282
+ interrupts ();
283
+ }
275
284
_PDMdataReady = false ;
285
+
286
+ // Start next conversion
287
+ am_hal_pdm_dma_start (_PDMhandle, &sTransfer );
276
288
}
277
289
278
290
inline void AP3_PDM::pdm_isr (void )
@@ -295,8 +307,13 @@ inline void AP3_PDM::pdm_isr(void)
295
307
//
296
308
if (ui32Status & AM_HAL_PDM_INT_DCMP)
297
309
{
298
- am_hal_pdm_disable (_PDMhandle);
299
- _PDMdataReady = true ;
310
+ if (_PDMdataReady == true )
311
+ Serial.println (" Buffer overrun!" );
312
+ else
313
+ {
314
+ // New data has been loaded into internalPDMDataBuffer
315
+ _PDMdataReady = true ;
316
+ }
300
317
}
301
318
}
302
319
0 commit comments