@@ -21,7 +21,8 @@ SOFTWARE.
21
21
*/
22
22
#include " PDM.h"
23
23
24
- AP3_PDM *ap3_pdm_handle = 0 ;
24
+ AP3_PDM* ap3_pdm_handle = NULL ;
25
+ static void * pdm_handle = NULL ; // the apollo3 blue only has one PDM instance so let's keep it simple
25
26
26
27
// AP3_PDM::AP3_PDM(uint16_t *userBuffer, uint32_t bufferSize)
27
28
// {
@@ -34,7 +35,8 @@ AP3_PDM *ap3_pdm_handle = 0;
34
35
35
36
bool AP3_PDM::begin (pin_size_t pinPDMData, pin_size_t pinPDMClock)
36
37
{
37
- _PDMhandle = NULL ;
38
+ pdm_handle = NULL ;
39
+ ap3_pdm_handle = NULL ;
38
40
_PDMconfig = ap3_pdm_config_default;
39
41
_pinPDMData = pinPDMData;
40
42
_pinPDMClock = pinPDMClock;
@@ -78,7 +80,7 @@ uint32_t AP3_PDM::_begin(void)
78
80
}
79
81
pincfg.uFuncSel = funcsel; // set the proper function select option for this instance/pin/type combination
80
82
retval = am_hal_gpio_pinconfig (_pinPDMData, pincfg);
81
- if (retval != AP3_OK )
83
+ if (retval != AM_HAL_STATUS_SUCCESS )
82
84
{
83
85
return retval;
84
86
}
@@ -90,59 +92,70 @@ uint32_t AP3_PDM::_begin(void)
90
92
}
91
93
pincfg.uFuncSel = funcsel; // set the proper function select option for this instance/pin/type combination
92
94
retval = am_hal_gpio_pinconfig (_pinPDMClock, pincfg);
93
- if (retval != AP3_OK )
95
+ if (retval != AM_HAL_STATUS_SUCCESS )
94
96
{
95
97
return retval;
96
98
}
97
99
98
100
// Initialize, power-up, and configure the PDM.
99
101
100
102
// //User may want to change settings mid-sketch. Only init PDM if it's new.
101
- if (_PDMhandle == NULL )
103
+ if (pdm_handle == NULL )
102
104
{
103
105
// Now that pins are initialized start the actual driver
104
- retval = (uint32_t )am_hal_pdm_initialize (0 , &_PDMhandle );
105
- if (retval != AP3_OK )
106
+ retval = (uint32_t )am_hal_pdm_initialize (0 , &pdm_handle );
107
+ if (retval != AM_HAL_STATUS_SUCCESS )
106
108
{
107
109
return retval;
108
110
}
109
111
}
110
- retval = (uint32_t )am_hal_pdm_power_control (_PDMhandle , AM_HAL_PDM_POWER_ON, false );
111
- if (retval != AP3_OK )
112
+ retval = (uint32_t )am_hal_pdm_power_control (pdm_handle , AM_HAL_PDM_POWER_ON, false );
113
+ if (retval != AM_HAL_STATUS_SUCCESS )
112
114
{
113
115
return retval;
114
116
}
115
- retval = (uint32_t )am_hal_pdm_configure (_PDMhandle , &_PDMconfig);
116
- if (retval != AP3_OK )
117
+ retval = (uint32_t )am_hal_pdm_configure (pdm_handle , &_PDMconfig);
118
+ if (retval != AM_HAL_STATUS_SUCCESS )
117
119
{
118
120
return retval;
119
121
}
120
- retval = (uint32_t )am_hal_pdm_enable (_PDMhandle );
121
- if (retval != AP3_OK )
122
+ retval = (uint32_t )am_hal_pdm_enable (pdm_handle );
123
+ if (retval != AM_HAL_STATUS_SUCCESS )
122
124
{
123
125
return retval;
124
126
}
125
127
128
+ Serial.println (" pdm initialized and configured. now need to enable interrupts" );
129
+
126
130
//
127
131
// Configure and enable PDM interrupts (set up to trigger on DMA
128
132
// completion).
129
133
//
130
- 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));
131
- // am_hal_interrupt_master_enable();
134
+ uint32_t ui32Status = 0x00 ;
135
+ am_hal_pdm_interrupt_status_get (pdm_handle, &ui32Status, false );
136
+ am_hal_pdm_interrupt_clear (pdm_handle, ui32Status);
137
+ am_hal_pdm_interrupt_enable (pdm_handle, (AM_HAL_PDM_INT_DERR | AM_HAL_PDM_INT_DCMP | AM_HAL_PDM_INT_UNDFL | AM_HAL_PDM_INT_OVF));
138
+ am_hal_interrupt_master_enable ();
132
139
NVIC_EnableIRQ (PDM_IRQn);
133
140
134
- // Register the class into the local list
141
+ Serial.println (" interrupts enabled" );
142
+
135
143
ap3_pdm_handle = this ;
136
144
145
+ Serial.println (" object registered" );
146
+
137
147
// Configure DMA and set target address of internal buffer.
138
148
sTransfer .ui32TargetAddr = (uint32_t )_pdmDataBuffer;
139
149
sTransfer .ui32TotalCount = _pdmBufferSize * 2 ;
140
150
141
151
// Start the data transfer.
142
- am_hal_pdm_enable (_PDMhandle );
152
+ am_hal_pdm_enable (pdm_handle );
143
153
am_util_delay_ms (100 );
144
- am_hal_pdm_fifo_flush (_PDMhandle);
145
- am_hal_pdm_dma_start (_PDMhandle, &sTransfer );
154
+ am_hal_pdm_fifo_flush (pdm_handle);
155
+ am_hal_pdm_dma_start (pdm_handle, &sTransfer );
156
+
157
+ Serial.println (" dma transfer started" );
158
+ Serial.println (retval);
146
159
147
160
return retval;
148
161
}
@@ -230,9 +243,9 @@ uint32_t AP3_PDM::getDecimationRate()
230
243
bool AP3_PDM::updateConfig (am_hal_pdm_config_t newConfiguration)
231
244
{
232
245
_PDMconfig = newConfiguration;
233
- uint32_t retval = (uint32_t )am_hal_pdm_configure (_PDMhandle , &_PDMconfig);
246
+ uint32_t retval = (uint32_t )am_hal_pdm_configure (pdm_handle , &_PDMconfig);
234
247
235
- am_hal_pdm_enable (_PDMhandle ); // Reenable after changes
248
+ am_hal_pdm_enable (pdm_handle ); // Reenable after changes
236
249
237
250
if (retval != AP3_OK)
238
251
{
@@ -322,14 +335,8 @@ uint32_t AP3_PDM::getData(uint16_t *externalBuffer, uint32_t externalBufferSize)
322
335
return (externalBufferSize);
323
336
}
324
337
325
- inline void AP3_PDM::pdm_isr (void )
338
+ inline void AP3_PDM::pdm_isr (uint32_t ui32Status )
326
339
{
327
- uint32_t ui32Status;
328
-
329
- // Read the interrupt status.
330
- am_hal_pdm_interrupt_status_get (_PDMhandle, &ui32Status, true );
331
- am_hal_pdm_interrupt_clear (_PDMhandle, ui32Status);
332
-
333
340
if (ui32Status & AM_HAL_PDM_INT_DCMP)
334
341
{
335
342
uint32_t tempReadAmt = _pdmBufferSize;
@@ -389,7 +396,7 @@ inline void AP3_PDM::pdm_isr(void)
389
396
}
390
397
391
398
// Start next conversion
392
- am_hal_pdm_dma_start (_PDMhandle , &sTransfer );
399
+ am_hal_pdm_dma_start (pdm_handle , &sTransfer );
393
400
}
394
401
}
395
402
@@ -400,5 +407,12 @@ inline void AP3_PDM::pdm_isr(void)
400
407
// *****************************************************************************
401
408
extern " C" void am_pdm_isr (void )
402
409
{
403
- ap3_pdm_handle->pdm_isr ();
410
+ uint32_t ui32Status;
411
+ // Read the interrupt status.
412
+ am_hal_pdm_interrupt_status_get (pdm_handle, &ui32Status, true );
413
+ am_hal_pdm_interrupt_clear (pdm_handle, ui32Status);
414
+
415
+ if (ap3_pdm_handle){
416
+ ap3_pdm_handle->pdm_isr (ui32Status);
417
+ }
404
418
}
0 commit comments