乐鑫技术交流
直播中

李宛蔓

7年用户 984经验值
私信 关注
[问答]

ESP32-S3在APLL无法启用的情况下该如何正确配置I2S总线上的MEMS麦克风的参数?

想请教大家一下ESP32-S3在APLL 无法启用的情况下该如何正确配置I2S总线上的MEMS麦克风的参数,比如i2s_config 和i2s_set_clk。下面是我自己的代码但是无法正确运行。非常感谢!


  • #define CONFIG_I2S_CH             I2S_NUM_0
  • #define CONFIG_SAMPLE_RATE        48000
  • #define CONFIG_BIT_SAMPLE         32 //bits
  • #define SAMPLE_T                  int32_t
  • #define CONFIG_SAMPLES_SHORT     (CONFIG_SAMPLE_RATE / 8) // ~125ms 6000

  • #define CONFIG_SAMPLE_T          int32_t
  • #define CONFIG_SAMPLES_LEQ       (CONFIG_SAMPLE_RATE * LEQ_PERIOD)
  • #define CONFIG_DMA_BANK_SIZE     (CONFIG_SAMPLES_SHORT / 16) //375
  • #define CONFIG_DMA_BANKS         32

  • #define CONFIG_I2S_WS_GPIO 4
  • #define CONFIG_I2S_CLK_GPIO 5
  • #define CONFIG_I2S_SD 13

  • extern "C" void init_microphone(void)
  • {
  •     // Set the I2S configuration as PDM and 32bits per sample
  •     i2s_config_t i2s_config = {

  •         mode :i2s_mode_t(I2S_MODE_MASTER| I2S_MODE_RX),
  •         .sample_rate = CONFIG_SAMPLE_RATE,
  •         .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
  •         .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
  •         communication_format: i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
  •         .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  •         .dma_buf_count = CONFIG_DMA_BANKS,
  •         .dma_buf_len = CONFIG_DMA_BANK_SIZE,
  •         .use_apll = 0,
  •         tx_desc_auto_clear: true,
  •         fixed_mclk: 0,
  •     };

  •     // Set the pinout configuration (set using menuconfig)
  •     i2s_pin_config_t pin_config = {

  •         .bck_io_num = CONFIG_I2S_CLK_GPIO,
  •         .ws_io_num = CONFIG_I2S_WS_GPIO,
  •         .data_out_num = I2S_PIN_NO_CHANGE,
  •         .data_in_num = CONFIG_I2S_SD,
  •     };


  •     // Call driver installation function before any I2S R/W operation.

  •     ESP_ERROR_CHECK( i2s_driver_install(CONFIG_I2S_CH, &i2s_config, 0, NULL) );
  •     ESP_ERROR_CHECK( i2s_set_pin(CONFIG_I2S_CH, &pin_config) );
  •     ESP_ERROR_CHECK( i2s_set_clk(CONFIG_I2S_CH, CONFIG_SAMPLE_RATE, I2S_BITS_PER_SAMPLE_32BIT, I2S_CHANNEL_MONO) );
  • }


回帖(1)

挽你何用

2024-6-27 17:04:53
在ESP32-S3中,如果APLL无法启用,您可以尝试使用其他时钟源(如XTAL或PLL)来配置I2S总线上的MEMS麦克风。以下是一些建议和示例代码,帮助您正确配置I2S参数。

1. 首先,确保您的ESP32-S3开发板已经连接到MEMS麦克风,并正确设置了I2S引脚。

2. 在您的代码中,定义I2S配置参数。根据您的需求,您已经定义了以下参数:

```c
#define CONFIG_I2S_CH        I2S_NUM_0
#define CONFIG_SAMPLE_RATE   48000
#define CONFIG_BIT_SAMPLE    32 // bits
```

3. 接下来,配置I2S参数。您可以使用以下代码作为参考:

```c
i2s_config_t i2s_config = {
    .mode = I2S_MODE_MASTER | I2S_MODE_RX, // 设置为接收模式
    .sample_rate = CONFIG_SAMPLE_RATE,
    .bits_per_sample = CONFIG_BIT_SAMPLE,
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // 根据麦克风数据格式选择
    .communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 8,
    .dma_buf_len = 1024
};
```

4. 初始化I2S驱动:

```c
esp_err_t ret = i2s_driver_install(CONFIG_I2S_CH, &i2s_config, 0, NULL);
if (ret != ESP_OK) {
    ESP_LOGE("I2S", "Failed to install I2S driver: %d", ret);
    return;
}
```

5. 配置I2S时钟。由于APLL无法启用,您可以使用XTAL或PLL作为时钟源。以下是一个示例,使用XTAL时钟源:

```c
i2s_set_clk(CONFIG_I2S_CH, CONFIG_SAMPLE_RATE, CONFIG_BIT_SAMPLE, I2S_CHANNEL_STEREO);
```

6. 接下来,您可以编写代码来接收I2S数据并处理MEMS麦克风的音频数据。

请注意,您可能需要根据您的具体硬件和需求调整上述代码。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分