i2s: support 4 line pdm rx on esp32s3

This commit is contained in:
laokaiyao
2022-10-24 17:33:49 +08:00
parent 9b8a78153f
commit fa9b022f68
27 changed files with 210 additions and 60 deletions

View File

@@ -18,7 +18,7 @@ This example is going to show how to use the PDM TX and RX mode.
#### PDM RX
* A PDM microphone whose `sel` pin is supposed to be pulled down, and connecting its `clk` pin to `EXAMPLE_PDM_RX_CLK_IO`, `data` pin to `EXAMPLE_PDM_RX_DIN_IO`.
* For non-ESP32-S3 SoC, a PDM microphone whose `sel` pin is supposed to be pulled down, and connecting its `clk` pin to `EXAMPLE_PDM_RX_CLK_IO`, `data` pin to `EXAMPLE_PDM_RX_DIN_IO`.
```
┌───────────────────────┐ ┌──────────────────┐
@@ -36,6 +36,66 @@ This example is going to show how to use the PDM TX and RX mode.
└───────────────────────┘ └──────────────────┘
```
* For ESP32-S3 SoC, this example shows how to support 8 PDM microphones, in this case, the connection can be:
```
┌──────────────────┐ ┌─────────────────────────┐ ┌──────────────────┐
│ PDM microphone3 │ │ ESP │ │ PDM microphone1 │
│ │ PDM clock │ │ PDM clock │ │
│ CLK │◄───┬───────────────────┤ EXAMPLE_PDM_RX_CLK_IO ├───────────────────┬───►│ CLK │
│ │ │ │ │ │ │ │
│ DATA ├────┼────┐ │ EXAMPLE_PDM_RX_DIN_IO │◄─────────────┬────┼────┤ DATA │
│ │ │ │ │ │ │ │ │ │
│ SEL ├────┼────┼─────────┐ │ │ ┌─────────┼────┼────┤ SEL │
│ │ │ │ │ │ │ │ │ │ │ │
│ GND ├────┼────┼────┐ │ │ │ │ ┌────┼────┼────┤ GND │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ VCC ├────┼────┼────┼────┤ │ │ ├────┼────┼────┼────┤ VCC │
└──────────────────┘ │ │ │ │ │ │ │ │ │ │ └──────────────────┘
│ │ │ │ │ │ │ │ │ │
┌──────────────────┐ │ │ │ │ │ │ │ │ │ │ ┌──────────────────┐
│ PDM microphone4 │ │ │ │ │ │ │ │ │ │ │ │ PDM microphone2 │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ CLK │◄───┤ │ │ │ │ │ │ │ │ ├───►│ CLK │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ DATA ├────┼────┴────┼────┼───►│ EXAMPLE_PDM_RX_DIN1_IO │ │ │ └────┼────┤ DATA │
│ │ │ │ │ │ │ │ │ │ │ │
│ SEL ├────┼─────────┤ │ │ │ │ ├─────────┼────┤ SEL │
│ │ │ │ │ │ │ │ │ │ │ │
│ GND ├────┼─────────┤ │ │ │ │ ├─────────┼────┤ GND │
│ │ │ │ │ │ │ │ │ │ │ │
│ VCC ├────┼─────────┼────┤ │ │ ├────┼─────────┼────┤ VCC │
└──────────────────┘ │ │ │ │ │ │ │ │ └──────────────────┘
│ │ │ │ │ │ │ │
┌──────────────────┐ │ │ │ │ │ │ │ │ ┌──────────────────┐
│ PDM microphone7 │ │ │ │ │ │ │ │ │ │ PDM microphone5 │
│ │ │ │ │ │ │ │ │ │ │ │
│ CLK │◄───┤ │ │ │ │ │ │ ├───►│ CLK │
│ │ │ │ │ │ │ │ │ │ │ │
│ DATA ├────┼────┐ │ │ │ EXAMPLE_PDM_RX_DIN2_IO │◄───┼────┼────┬────┼────┤ DATA │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ SEL ├────┼────┼────┼────┤ │ │ ├────┼────┼────┼────┤ SEL │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ GND ├────┼────┼────┤ │ │ │ │ ├────┼────┼────┤ GND │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ VCC ├────┼────┼────┼────┤ │ │ ├────┼────┼────┼────┤ VCC │
└──────────────────┘ │ │ │ │ │ │ │ │ │ │ └──────────────────┘
│ │ │ │ │ │ │ │ │ │
┌──────────────────┐ │ │ │ │ │ │ │ │ │ │ ┌──────────────────┐
│ PDM microphone8 │ │ │ │ │ │ │ │ │ │ │ │ PDM microphone6 │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ CLK │◄───┘ │ │ │ │ │ │ │ │ └───►│ CLK │
│ │ │ │ │ │ │ │ │ │ │ │
│ DATA ├─────────┴────┼────┼───►│ EXAMPLE_PDM_RX_DIN3_IO │ │ │ └─────────┤ DATA │
│ │ │ │ │ │ │ │ │ │
│ SEL ├──────────────┤ │ │ │ │ ├──────────────┤ SEL │
│ │ │ │ │ │ │ │ │ │
│ GND ├──────────────┴────┼────┤ GND ├────┼────┴──────────────┤ GND │
│ │ │ │ │ │ │ │
│ VCC ├───────────────────┴────┤ VCC ├────┴───────────────────┤ VCC │
└──────────────────┘ └─────────────────────────┘ └──────────────────┘
```
#### PDM TX
* An earphone or a speaker

View File

@@ -15,7 +15,12 @@
#include "i2s_pdm_example.h"
#define EXAMPLE_PDM_RX_CLK_IO GPIO_NUM_0 // I2S PDM RX clock io number
#define EXAMPLE_PDM_RX_DIN_IO GPIO_NUM_2 // I2S PDM RX data in io number
#define EXAMPLE_PDM_RX_DIN_IO GPIO_NUM_4 // I2S PDM RX data in io number
#if CONFIG_IDF_TARGET_ESP32S3
#define EXAMPLE_PDM_RX_DIN1_IO GPIO_NUM_5 // I2S PDM RX data line1 in io number
#define EXAMPLE_PDM_RX_DIN2_IO GPIO_NUM_6 // I2S PDM RX data line2 in io number
#define EXAMPLE_PDM_RX_DIN3_IO GPIO_NUM_7 // I2S PDM RX data line3 in io number
#endif
#define EXAMPLE_PDM_RX_FREQ_HZ 16000 // I2S PDM RX frequency
@@ -39,12 +44,27 @@ static i2s_chan_handle_t i2s_example_init_pdm_rx(void)
.slot_cfg = I2S_PDM_RX_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO),
.gpio_cfg = {
.clk = EXAMPLE_PDM_RX_CLK_IO,
#if CONFIG_IDF_TARGET_ESP32S3
// Only ESP32-S3 can support 4-line PDM RX
.dins = {
EXAMPLE_PDM_RX_DIN_IO,
EXAMPLE_PDM_RX_DIN1_IO,
EXAMPLE_PDM_RX_DIN2_IO,
EXAMPLE_PDM_RX_DIN3_IO,
},
#else
.din = EXAMPLE_PDM_RX_DIN_IO,
#endif
.invert_flags = {
.clk_inv = false,
},
},
};
#if CONFIG_IDF_TARGET_ESP32S3
// Enable all slots for example
pdm_rx_cfg.slot_cfg.slot_mode = I2S_SLOT_MODE_STEREO;
pdm_rx_cfg.slot_cfg.slot_mask = I2S_PDM_LINE_SLOT_ALL;
#endif
ESP_ERROR_CHECK(i2s_channel_init_pdm_rx_mode(rx_chan, &pdm_rx_cfg));
/* Step 3: Enable the rx channels before reading data */