esp32-s3 i2s读取es7210超时

Chuan_2002
Posts: 1
Joined: Mon May 05, 2025 3:35 pm

esp32-s3 i2s读取es7210超时

Postby Chuan_2002 » Mon May 05, 2025 3:50 pm

硬件是立创实战派s3,也就是一个i2s的DI连接es7210和DO连接es8311,配置过程中读取es7210超时,i2s_channel_read返回ESP_ERR_TIMEOUT(这个函数除了返回ESP_OK就是这个),i2s的配置参考小智AI的box-s3的配置,设置tx工作在std模式下,rx工作在tdm模式下,i2s配置如下:

Code: Select all

i2s_chan_config_t i2s_chan_cfg = {
        .id = I2S_NUM_0,
        .role = I2S_ROLE_MASTER,
        .dma_desc_num = 6,
        .dma_frame_num = 240,
        .intr_priority = 0
    };
    ESP_ERROR_CHECK(i2s_new_channel(&i2s_chan_cfg, &tx_handle, &rx_handle));
    ESP_LOGI(TAG, "Configure I2S transmit channel to STD mode");
    i2s_std_config_t i2s_std_tx_conf = {
        .clk_cfg  = {
            .clk_src = I2S_CLK_SRC_DEFAULT,
            .sample_rate_hz = EXAMPLE_I2S_SAMPLE_RATE,
            .mclk_multiple = EXAMPLE_I2S_MCLK_MULTIPLE,
            .ext_clk_freq_hz = 0
        },
        .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
        .gpio_cfg = {
            .mclk = EXAMPLE_I2S_MCK_IO,
            .bclk = EXAMPLE_I2S_BCK_IO,
            .ws   = EXAMPLE_I2S_WS_IO,
            .dout = EXAMPLE_I2S_DO_IO,
            .din  = I2S_GPIO_UNUSED,
            .invert_flags = {
                .mclk_inv = false,
                .bclk_inv = false,
                .ws_inv = false
            }
        }
    };
    ESP_LOGI(TAG, "Configure I2S receive channel to TDM mode");
    i2s_tdm_config_t i2s_tdm_rx_conf = { 
        .clk_cfg  = {
            .clk_src = I2S_CLK_SRC_DEFAULT,
            .sample_rate_hz = EXAMPLE_I2S_SAMPLE_RATE,
            .mclk_multiple = EXAMPLE_I2S_MCLK_MULTIPLE,
            .ext_clk_freq_hz = 0,
            .bclk_div = 8
        }, 
        .slot_cfg = I2S_TDM_PHILIPS_SLOT_DEFAULT_CONFIG(EXAMPLE_I2S_SAMPLE_BITS, I2S_SLOT_MODE_MONO, EXAMPLE_I2S_TDM_SLOT_MASK),
        .gpio_cfg = {
            .mclk = EXAMPLE_I2S_MCK_IO,
            .bclk = EXAMPLE_I2S_BCK_IO,
            .ws   = EXAMPLE_I2S_WS_IO,
            .dout = I2S_GPIO_UNUSED,
            .din  = EXAMPLE_I2S_DI_IO,
            .invert_flags = {
                .mclk_inv = false,
                .bclk_inv = false,
                .ws_inv = false
            }
        },
        
    };
    ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle, &i2s_std_tx_conf));
    ESP_ERROR_CHECK(i2s_channel_init_tdm_mode(rx_handle, &i2s_tdm_rx_conf));
如果将双工模式改成单工,也就是下面这段代码:

Code: Select all

    ESP_LOGI(TAG, "Create I2S receive channel");
    i2s_chan_config_t i2s_chan_cfg = {
        .id = I2S_NUM_0,
        .role = I2S_ROLE_MASTER,
        .dma_desc_num = 6,
        .dma_frame_num = 240,
        .intr_priority = 0
    };
    ESP_ERROR_CHECK(i2s_new_channel(&i2s_chan_cfg, NULL, &rx_handle));
    i2s_tdm_config_t i2s_tdm_rx_conf = { 
        .clk_cfg  = {
            .clk_src = I2S_CLK_SRC_DEFAULT,
            .sample_rate_hz = EXAMPLE_I2S_SAMPLE_RATE,
            .mclk_multiple = EXAMPLE_I2S_MCLK_MULTIPLE,
            .ext_clk_freq_hz = 0,
            .bclk_div = 8
        }, 
        .slot_cfg = I2S_TDM_PHILIPS_SLOT_DEFAULT_CONFIG(EXAMPLE_I2S_SAMPLE_BITS, I2S_SLOT_MODE_MONO, EXAMPLE_I2S_TDM_SLOT_MASK),
        .gpio_cfg = {
            .mclk = EXAMPLE_I2S_MCK_IO,
            .bclk = EXAMPLE_I2S_BCK_IO,
            .ws   = EXAMPLE_I2S_WS_IO,
            .dout = I2S_GPIO_UNUSED,
            .din  = EXAMPLE_I2S_DI_IO,
            .invert_flags = {
                .mclk_inv = false,
                .bclk_inv = false,
                .ws_inv = false
            }
        },
        
    };
    ESP_ERROR_CHECK(i2s_channel_init_tdm_mode(rx_handle, &i2s_tdm_rx_conf));
这样单工模式可以正常读取,es7210配置部分采用官方的组件包,应该不会有问题,这种一个i2s设备同时连接es7210和es8311的设计在官方的box-s3上似乎也存在,我应该修改i2c的配置部分,还是更改i2s配置?
版本:
espressif/es7210: ^1.0.0
espressif/es8311: ^1.0.0
ESP-IDF v5.2.5

www375
Posts: 1
Joined: Thu Aug 14, 2025 12:35 pm

Re: esp32-s3 i2s读取es7210超时

Postby www375 » Thu Aug 14, 2025 12:46 pm

你好,请问解决这个问题了吗,我最近也在立创实战派上操作这两个芯片,遇到跟你同样的问题

Who is online

Users browsing this forum: No registered users and 3 guests