@@ -22,6 +22,11 @@ SOFTWARE.
2222#include " PDM.h"
2323
2424AP3_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];
2530
2631bool AP3_PDM::begin (ap3_gpio_pin_t pinPDMData, ap3_gpio_pin_t pinPDMClock)
2732{
@@ -106,12 +111,22 @@ ap3_err_t AP3_PDM::_begin(void)
106111 // completion).
107112 //
108113 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();
110115 NVIC_EnableIRQ (PDM_IRQn);
111116
112117 // Register the class into the local list
113118 ap3_pdm_handle = this ;
114119
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+
115130 return retval;
116131}
117132
@@ -255,24 +270,21 @@ ap3_err_t ap3_pdm_pad_funcsel(ap3_pdm_pad_type_e type, ap3_gpio_pad_t pad, uint8
255270// Start a transaction to get some number of bytes from the PDM interface.
256271//
257272// *****************************************************************************
258- void AP3_PDM::getData (uint32_t *PDMDataBuffer , uint32_t bufferSize)
273+ void AP3_PDM::getData (uint32_t *externalBuffer , uint32_t bufferSize)
259274{
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 ();
274278
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+ }
275284 _PDMdataReady = false ;
285+
286+ // Start next conversion
287+ am_hal_pdm_dma_start (_PDMhandle, &sTransfer );
276288}
277289
278290inline void AP3_PDM::pdm_isr (void )
@@ -295,8 +307,13 @@ inline void AP3_PDM::pdm_isr(void)
295307 //
296308 if (ui32Status & AM_HAL_PDM_INT_DCMP)
297309 {
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+ }
300317 }
301318}
302319
0 commit comments