esp32-s3 i2s读取es7210超时
Posted: 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配置如下:
如果将双工模式改成单工,也就是下面这段代码:
这样单工模式可以正常读取,es7210配置部分采用官方的组件包,应该不会有问题,这种一个i2s设备同时连接es7210和es8311的设计在官方的box-s3上似乎也存在,我应该修改i2c的配置部分,还是更改i2s配置?
版本:
espressif/es7210: ^1.0.0
espressif/es8311: ^1.0.0
ESP-IDF v5.2.5
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));版本:
espressif/es7210: ^1.0.0
espressif/es8311: ^1.0.0
ESP-IDF v5.2.5