🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    (M5CoreS3)I2S和ES7210做了驱动开发,但是麦克风的声音老是获取有问题

    SOFTWARE
    1
    1
    143
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      about_li
      last edited by

      我对I2S和ES7210做了驱动开发,但是麦克风的声音老是获取有问题
      i2s_chan_handle_t es7210_i2s_init(void)
      {
      ESP_LOGI(TAG, "Initializing I2S");

      i2s_chan_config_t chan_cfg = {
          .id = I2S_NUM_0,
          .role = I2S_ROLE_MASTER,
          .dma_desc_num = 8,        // 增加 DMA 描述符数量
          .dma_frame_num = 64,      // 增加每个描述符的帧数
          .auto_clear = false,      // 不自动清除 DMA buffer
      };
      
      ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &i2s_rx_chan));
      
      i2s_std_config_t std_cfg = {
          .clk_cfg = {
              .sample_rate_hz = SAMPLE_RATE,
              .clk_src = I2S_CLK_SRC_PLL_160M,  // 明确指定时钟源
              .mclk_multiple = I2S_MCLK_MULTIPLE_512,  // 提高MCLK倍数以适应48kHz
          },
          .slot_cfg = {
              .data_bit_width = I2S_DATA_BIT_WIDTH_16BIT,
              .slot_bit_width = I2S_SLOT_BIT_WIDTH_16BIT,
              .slot_mode = I2S_SLOT_MODE_STEREO,
              .slot_mask = I2S_STD_SLOT_BOTH,
              .ws_width = 16,
              .ws_pol = false,
              .bit_shift = true,
              .left_align = false,
              .big_endian = false,
              .bit_order_lsb = false,
          },
          .gpio_cfg = {
              .mclk = MCLK_PIN,
              .bclk = ADC_BCLK_PIN,
              .ws = ADC_LRCLK_PIN,
              .dout = GPIO_NUM_NC,
              .din = ADC_DATA_PIN,
              .invert_flags = {
                  .mclk_inv = false,
                  .bclk_inv = false,
                  .ws_inv = false,
              },
          },
      };
      
      ESP_ERROR_CHECK(i2s_channel_init_std_mode(i2s_rx_chan, &std_cfg));
      
      // 在启用通道之前添加延迟
      vTaskDelay(pdMS_TO_TICKS(100));
      
      ESP_ERROR_CHECK(i2s_channel_enable(i2s_rx_chan));
      
      // 等待 I2S 稳定
      vTaskDelay(pdMS_TO_TICKS(100));
      
      ESP_LOGI(TAG, "I2S initialized successfully");
      return i2s_rx_chan;
      

      }

      void es7210_codec_init(void)
      {
      ESP_LOGI(TAG, "Init I2C used to configure ES7210");
      i2c_config_t i2c_conf = {
      .mode = I2C_MODE_MASTER,
      .sda_io_num = GPIO_NUM_12,
      .scl_io_num = GPIO_NUM_11,
      .sda_pullup_en = GPIO_PULLUP_ENABLE,
      .scl_pullup_en = GPIO_PULLUP_ENABLE,
      .master = {
      .clk_speed = EXAMPLE_ES7210_I2C_CLK,
      },
      };
      ESP_ERROR_CHECK(i2c_param_config(EXAMPLE_I2C_NUM, &i2c_conf));
      ESP_ERROR_CHECK(i2c_driver_install(EXAMPLE_I2C_NUM, i2c_conf.mode, 0, 0, 0));

      /* Create ES7210 device handle */
      es7210_dev_handle_t es7210_handle = NULL;
      es7210_i2c_config_t es7210_i2c_conf = {
          .i2c_port = EXAMPLE_I2C_NUM,
          .i2c_addr = EXAMPLE_ES7210_I2C_ADDR
      };
      ESP_ERROR_CHECK(es7210_new_codec(&es7210_i2c_conf, &es7210_handle));
      
      ESP_LOGI(TAG, "Configure ES7210 codec parameters");
      es7210_codec_config_t codec_conf = {
          .sample_rate_hz = EXAMPLE_I2S_SAMPLE_RATE,
          .mclk_ratio = EXAMPLE_I2S_MCLK_MULTIPLE,
          .i2s_format = EXAMPLE_I2S_TDM_FORMAT,
          .bit_width = (es7210_i2s_bits_t)EXAMPLE_I2S_SAMPLE_BITS,
          .mic_bias = EXAMPLE_ES7210_MIC_BIAS,
          .mic_gain = EXAMPLE_ES7210_MIC_GAIN,
          .flags = {
              .tdm_enable = 1
          },
      };
      ESP_ERROR_CHECK(es7210_config_codec(es7210_handle, &codec_conf));
      ESP_ERROR_CHECK(es7210_config_volume(es7210_handle, EXAMPLE_ES7210_ADC_VOLUME));
      

      }

      1 Reply Last reply Reply Quote 0
      • First post
        Last post