From 055af04092b68d6f22ace976ad63254b0fa8f00a Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 26 Nov 2019 16:43:33 +0100 Subject: [PATCH 1/3] PDM: use HFCLK clock This clock usually gets activated only by RADIO (BLE). Helps keeping the microphone jitter low. --- libraries/PDM/src/PDM.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/PDM/src/PDM.cpp b/libraries/PDM/src/PDM.cpp index c492dadc..e7bf149e 100644 --- a/libraries/PDM/src/PDM.cpp +++ b/libraries/PDM/src/PDM.cpp @@ -48,6 +48,10 @@ int PDMClass::begin(int channels, long sampleRate) { _channels = channels; + NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; + NRF_CLOCK->TASKS_HFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { } + // configure the sample rate and channels switch (sampleRate) { case 16000: From 6fb51dd8b16b7c21c3734394c269f6bac5294021 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 26 Nov 2019 16:46:55 +0100 Subject: [PATCH 2/3] PDM: respect microphone min_freq specifications --- libraries/PDM/src/PDM.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/PDM/src/PDM.cpp b/libraries/PDM/src/PDM.cpp index e7bf149e..67c8d472 100644 --- a/libraries/PDM/src/PDM.cpp +++ b/libraries/PDM/src/PDM.cpp @@ -55,7 +55,8 @@ int PDMClass::begin(int channels, long sampleRate) // configure the sample rate and channels switch (sampleRate) { case 16000: - nrf_pdm_clock_set(NRF_PDM_FREQ_1032K); + NRF_PDM->RATIO = ((PDM_RATIO_RATIO_Ratio80 << PDM_RATIO_RATIO_Pos) & PDM_RATIO_RATIO_Msk); + nrf_pdm_clock_set(NRF_PDM_FREQ_1280K); break; case 41667: nrf_pdm_clock_set(NRF_PDM_FREQ_2667K); From 545c4c5cc1cc0ef04320954ebfac2d27a0bbf1a3 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 29 Nov 2019 10:27:13 +0100 Subject: [PATCH 3/3] PDM: only enable HFCLK if needed --- libraries/PDM/src/PDM.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/PDM/src/PDM.cpp b/libraries/PDM/src/PDM.cpp index 67c8d472..49cd368b 100644 --- a/libraries/PDM/src/PDM.cpp +++ b/libraries/PDM/src/PDM.cpp @@ -48,9 +48,11 @@ int PDMClass::begin(int channels, long sampleRate) { _channels = channels; - NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; - NRF_CLOCK->TASKS_HFCLKSTART = 1; - while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { } + // Enable high frequency oscillator if not already enabled + if (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { + NRF_CLOCK->TASKS_HFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { } + } // configure the sample rate and channels switch (sampleRate) { @@ -133,6 +135,8 @@ void PDMClass::end() pinMode(_pwrPin, INPUT); } + // Don't disable high frequency oscillator since it could be in use by RADIO + // unconfigure the I/O and un-mux nrf_pdm_psel_disconnect();