Hi
I'm new to programming and recently started working on nrf52832.
I'm working on a wearable device that monitors patient's vital. I'm using MP34DB02 digital microphone to record patient breathing to detect difficulty in breathing. I can't read input from the mic and creating and accessing pdm data stored in buffer. This is the code I have so far:
ret_code_t drv_audio_enable(void)
{
nrf_delay_ms(100);
//Start audio capture
return nrf_drv_pdm_start();
}
ret_code_t drv_audio_disable(void)
{
ret_code_t status;
//Stop audio capture
status = nrf_drv_pdm_stop();
if(status!= NRF_SUCCESS)
{
return status;
}
return NRF_SUCCESS;
}
static void drv_audio_pdm_event_handler(nrf_drv_pdm_evt_t const * const p_evt)
{
int16_t *p_buffer_released = p_evt->buffer_released;
if(p_evt->buffer_requested)
{
int16_t *p_buffer;
if(!p_buffer)
{
NRF_LOG_WARNING("%s(): WARNING: Cannot allocate audio buffer!", __func__);
//We have to provide fresh buffer to keep PDM running.
//Since pool is empty, our sole option is to reuse the released buffer.
if(p_buffer_released)
{
p_buffer = p_buffer_released;
p_buffer_released = NULL;
}
}
if(p_buffer)
{
NRF_LOG_DEBUG("Buffer Request: 0x%08X%s",
p_buffer,
(p_buffer == p_evt->buffer_released) ?"(reusing released buffer)":"");
APP_ERROR_CHECK(nrf_drv_pdm_buffer_set(p_buffer, CONFIG_PDM_BUFFER_SIZE_SAMPLES));
}
}
if(p_buffer_released)
{
NRF_LOG_DEBUG("Buffer Release: 0x%08X", p_buffer_released);
}
}
ret_code_t drv_audio_init(void)
{
nrf_drv_pdm_config_t pdm_cfg = NRF_DRV_PDM_DEFAULT_CONFIG(clk_audio,
dout);
ret_code_t err_code; // a variable to hold error code value
pdm_cfg.gain_l = CONFIG_PDM_GAIN;
pdm_cfg.gain_r = CONFIG_PDM_GAIN;
pdm_cfg.edge = NRF_PDM_EDGE_LEFTFALLING;
nrf_gpio_cfg_output(lrsel);
nrf_gpio_pin_clear(lrsel);
NRF_LOG_FLUSH(); // flushing is important, if you set the deffered to 1, if deffered is set to 0 then we don't need to flush the log buffer.
//Initialize PDM driver
return nrf_drv_pdm_init(&pdm_cfg, drv_audio_pdm_event_handler);
}
int main(void)
{
// initialize the Logger so that we can print msgs on the logger
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
NRF_LOG_INFO("Application Started");
NRF_LOG_FLUSH(); // flushing is necessary if deferred is set to 1(check this video tutorial to know it better)
APP_ERROR_CHECK(drv_audio_init());
drv_audio_enable();
//nrf_delay_ms(100);
drv_audio_disable();
}
What am I missing?
Regards
Raj