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

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

    Scheduled Pinned Locked Moved SOFTWARE
    1 Posts 1 Posters 1.3k Views
    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 Offline
      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

      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

      With your input, this post could be even better 💗

      Register Login
      • First post
        Last post