Skip to content

Commit 2547fcf

Browse files
committed
Big change to how PDM getData works. Interim fix: move sTransfer to global. Create internal buffer.
1 parent af25d94 commit 2547fcf

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

libraries/PDM/src/PDM.cpp

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ SOFTWARE.
2222
#include "PDM.h"
2323

2424
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];
2530

2631
bool 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

278290
inline 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

libraries/PDM/src/PDM.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class AP3_PDM
114114

115115
bool updateConfig(am_hal_pdm_config_t newConfiguration);
116116

117-
void getData(uint32_t *PDMDataBuffer, uint32_t bufferSize);
117+
void getData(uint32_t *externalBuffer, uint32_t bufferSize);
118118

119119
void pdm_isr(void);
120120

0 commit comments

Comments
 (0)