This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

PDM working??

Hello, 

I've been posting PDM questions for a while now and I think I finally have something, but I'm not sure.

/*  
		C Program to run a pulse density modulation (PDM) Microphone on the nRF9160 Dev Kit using the Nordic SDK
*/

#include <nrf9160.h>
#include <zephyr.h>
#include <misc/printk.h>
#include <string.h>
#include <stdlib.h>
#include <nrfx_pdm.h>
#include <stdint.h>
#include <gpio.h>



#define PDM_BUF_SIZE 3072  //length of buffer in 16 bit words

int16_t pdm_buf[PDM_BUF_SIZE];

void nrfx_pdm_event_handler(nrfx_pdm_evt_t const *const p_evt)
{
	if (p_evt->buffer_requested) {
		nrfx_pdm_buffer_set(pdm_buf, PDM_BUF_SIZE);
	}
	if (p_evt->buffer_released != 0) {
		printk("Out: %4x @ 0x%x\r\n %4x @ 0x%x\r\n",
		       (uint16_t)pdm_buf[0], &pdm_buf[0],
		       (uint16_t)pdm_buf[1], &pdm_buf[1]);
	}
}

static void pdm_init(void)
{
	nrfx_pdm_config_t pdm_config = NRFX_PDM_DEFAULT_CONFIG(
		10, 11); /*configures CLK to pin 10 and Din to pin 11*/
	nrfx_pdm_init(&pdm_config, nrfx_pdm_event_handler);
}

/*ISR workaround given by Nordic*/
ISR_DIRECT_DECLARE(pdm_isr_handler)
{
	nrfx_pdm_irq_handler();
	ISR_DIRECT_PM(); /* PM done after servicing interrupt for best latency
			  */

	return 1; /* We should check if scheduling decision should be made */
}

void main(void)
{
	IRQ_DIRECT_CONNECT(PDM_IRQn, 0, pdm_isr_handler, 0);  //workaround line 
	printk("Starting PDM program!\n");
	printk("PDM Buffer size: %d in 16 bit words\n", PDM_BUF_SIZE);

	/*
	bool enabled = nrfx_pdm_enable_check();
	printk(enabled ? "true/n" : "false\n");
	*/

	pdm_init();
	printk("%4x is the starting address\n", &pdm_buf);
	printk("%4x is current value at %x\n", pdm_buf[0], &pdm_buf);
	printk("The PDM will start reading NOW...\n");
      /*  for (int i = 0; i < 500; i++) {
          int k = 5;
          for (volatile int j = 0; j < 50; j++) {
                k = !k;
		}
	}*/
	nrfx_pdm_start();
	for (int i = 0; i < 100; i++) {
          int k = 5;
          for (volatile int j = 0; j < 100; j++) {
                k = !k;
		}
	}
	nrfx_pdm_stop();

	printk("%4x is current value at %x\n", pdm_buf[0], &pdm_buf);
}

When I run my code w/ the PDM Mic connected I get this output on the monitor.

However when I go through the debugger and set up these breakpoints

These are my outputs after the last breakpoint for RAM, pdm_buf [ ], and on the monitor.

Alternatively, when I disconnect the mic (removing the CLK and DATA lines to the DK)

I get this for outputs

I'm rather confused as to why my output looks the same when it's connected to the DK and when it's not (at least on the monitor side) if I just run with no breakpoints and why my output is so very different when I step through the code. 

Any help is appreciated. Thank you

Parents Reply Children
Related