I cannot find an example project for using the PDM module on SDK 15.3.0. Can you please direct me to where I will be able to find such an example project?
Thank you.
I cannot find an example project for using the PDM module on SDK 15.3.0. Can you please direct me to where I will be able to find such an example project?
Thank you.
Hi, Sarnab I too, have the same question as yours. So how far have you reached?I tried the example which Simonr have provided the link for the example. But I am getting the following errors:
undefined reference to `nrfx_pdm_init' and undefined reference to `nrfx_pdm_start'
@ Simonr if you have any idea about how can I solve the above errors?
Hi Sara, I was able to get it working though I have not extensively tested if the data is valid. To get the nrfx_pdm_xxx() functions you have to include nrfx_pdm.h in your project. Hope that helps. Also if you are able to get meaningful data please let me know what you did!
Yes, I have included the nrfx_pdm.h but getting nrfx_pdm_init undefined and nrfx_pdm_start undefined references. For that what should I do?
when you right click on nrfx_pdm.h and select 'go to definition' does it take you to the file?
yes it takes me to file to the file and when I right click on nrf_drv_pdm_start it takes me to its macro definition in nrfx_drv_pdm.h as nrfx_pdm_start
yes it takes me to file to the file and when I right click on nrf_drv_pdm_start it takes me to its macro definition in nrfx_drv_pdm.h as nrfx_pdm_start
Hmm, that is strange. What IDE are you using? I am on Segger Embedded Studio (SES). Are you sure your include paths are set correctly?
yes I have set the paths correctly.I have added #include "nrf_drv_pdm.h" in main .c file , then added the following in the .emProject file <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_pdm.c" /> is there anything else I am missing?
And I m using SES too. SDK ver 15.3.0
The error was solved, I had not enabled
#ifndef PDM_ENABLED
#define PDM_ENABLED 1
I programmed the code but now question is how should i check whether pdm is working properly or not? I am not storing anything in flash. For now, I just need the data of pdm so how should I test it to get the results
static void bsp_event_handler(bsp_event_t event)
{
ret_code_t err_code;
switch (event)
{
case BSP_EVENT_SLEEP:
sleep_mode_enter();
break; // BSP_EVENT_SLEEP
case BSP_EVENT_DISCONNECT:
err_code = sd_ble_gap_disconnect(m_conn_handle,
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
break; // BSP_EVENT_DISCONNECT
case BSP_EVENT_WHITELIST_OFF:
if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
{
err_code = ble_advertising_restart_without_whitelist(&m_advertising);
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
}
break; // BSP_EVENT_KEY_0
case BSP_EVENT_KEY_1:
NRF_LOG_INFO("\n Press Button key 1\n");
NRF_LOG_INFO("\n Erase the flash content !!\n");
// err_code = pcm_pstorage_eraseall();
// APP_ERROR_CHECK(err_code);
break;
case BSP_EVENT_KEY_2:
NRF_LOG_INFO("\n Start:PDM --> PCM\n");
err_code = nrf_drv_pdm_start();
APP_ERROR_CHECK(err_code);
break;
case BSP_EVENT_KEY_3:
NRF_LOG_INFO("\n Stop:PDM --> PCM\n");
// stop audio sample
nrf_drv_pdm_stop();
break;
default:
break;
}
}
static void drv_audio_pdm_event_handler(uint32_t *p_buffer, uint16_t length)
{
m_buffer_handler((int16_t *)p_buffer, length);
int i;
// for(i=0;i<= length;i++)
// {
// NRF_LOG_INFO("%s ",&p_buffer[i]);
// }
// NRF_LOG_INFO("\n ");
NRF_LOG_INFO("pdm event handler \n");
}
uint32_t drv_audio_init(drv_audio_buffer_handler_t buffer_handler)
{
// nrf_drv_pdm_config_t pdm_cfg = NRF_DRV_PDM_DEFAULT_CONFIG(CONFIG_IO_PDM_CLK,
// CONFIG_IO_PDM_DATA,
// m_pdm_buff[0],
// m_pdm_buff[1],
// CONFIG_PDM_BUFFER_SIZE_SAMPLES);
nrf_drv_pdm_config_t pdm_cfg = NRF_DRV_PDM_DEFAULT_CONFIG(CONFIG_IO_PDM_CLK,CONFIG_IO_PDM_DATA);
if (buffer_handler == NULL)
{
return NRF_ERROR_INVALID_PARAM;
}
m_buffer_handler = buffer_handler;
pdm_cfg.gain_l = CONFIG_PDM_GAIN;
pdm_cfg.gain_r = CONFIG_PDM_GAIN;
return nrf_drv_pdm_init(&pdm_cfg, drv_audio_pdm_event_handler);
}
int main(void)
{
bool erase_bonds;
// Initialize.
log_init();
timers_init();
buttons_leds_init(&erase_bonds);
power_management_init();
ble_stack_init();
gap_params_init();
gatt_init();
advertising_init();
services_init();
conn_params_init();
peer_manager_init();
// Start execution.
NRF_LOG_INFO("Template example started.");
application_timers_start();
// advertising_start(erase_bonds);
uint32_t err_code;
err_code = drv_audio_init(drv_audio_pdm_event_handler);
APP_ERROR_CHECK(err_code);
// Enter main loop.
for (;;)
{
idle_state_handle();
}
}
.For your reference, I am attaching my code snippet
I have checked the clk pin on Oscilloscope , the clock is not being generated.In order to generate clk at pin number 22 of nrf52 DK board should I define pin clk as #define CONFIG_IO_PDM_CLK 0x22 or 0x16 (hex value of 22 )instead of 0x22?
And when I read the pdm documentation it says I need to change the PSEL.CLK register value? Then how should I do it and with what value? same for PSEL.DIN register. I am confused a lot. Please suggest me the solution to all my doubts.
Hi
Could you please create a new ticket where you explain your problem, and what your application is supposed to do in order for us to get a better overview of what exactly is wrong. This will also ensure this ticket won't derail into something completely off-topic.
Thanks,
Simon