You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3对接SPH0645LM4H后音频传输为空的问题求助

问题背景

我基于esp-adf/examples/recorder/pipeline_raw_http示例(原适配Krovo 2等带内置模拟麦的开发板),修改代码适配ESP32-S3对接MEMS麦克风SPH0645LM4H,已完成以下修改:

  1. 注释掉编解码器相关代码:
//audio_board_handle_t board_handle = audio_board_init();
//audio_hal_ctrl_codec(board_handle->audio_hal, AUDIO_HAL_CODEC_MODE_ENCODE, AUDIO_HAL_CTRL_START);
  1. 修改I2S配置:
i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT();

i2s_cfg.type = AUDIO_STREAM_READER;
//i2s_cfg_reader.out_rb_size = 16 * 1024;
i2s_cfg.i2s_config.mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_PDM_DSR_16S;
i2s_cfg.i2s_config.sample_rate = 16000;
i2s_cfg.i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT;
i2s_cfg.i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT; 
i2s_cfg.i2s_config.communication_format = I2S_COMM_FORMAT_STAND_MSB;
i2s_cfg.i2s_config.use_apll = false;
i2s_cfg.out_rb_size = 16 * 1024; // Increase buffer to avoid missing data in bad network conditions
i2s_cfg.i2s_config.dma_buf_count = 8,
i2s_cfg.i2s_config.dma_buf_len = 200,
i2s_cfg.i2s_port = I2S_NUM_0;
i2s_cfg.i2s_config.fixed_mclk = 768000;
i2s_stream_reader = i2s_stream_init(&i2s_cfg);
  1. 参考Krovo 2引脚配置接线:GPIO_NUM_9接BCLK、GPIO_NUM_45接LRCLK、GPIO_NUM_10接数据引脚。

代码编译无错误,但无法向服务器传输有效音频数据,发送内容为空,请求协助排查。

排查建议

1. 补全I2S引脚映射配置

原示例依赖audio_board_init()完成引脚与I2S外设的绑定,你注释掉该代码后,需要手动添加引脚映射配置,否则I2S无法识别指定GPIO。在I2S初始化代码前添加:

i2s_pin_config_t pin_config = {
    .bck_io_num = GPIO_NUM_9,
    .ws_io_num = GPIO_NUM_45,
    .data_in_num = GPIO_NUM_10,
    .data_out_num = I2S_PIN_NO_CHANGE // 接收模式无需配置输出引脚
};
i2s_cfg.i2s_config.pin_cfg = pin_config;

2. 匹配SPH0645的输出模式

SPH0645支持I2S和PDM两种输出模式,当前配置中的I2S_PDM_DSR_16S是PDM转PCM的降采样标识,需根据硬件实际配置调整:

  • 若SPH0645设为I2S模式:移除I2S_PDM_DSR_16S,将mode改为I2S_MODE_MASTER | I2S_MODE_RX
  • 若SPH0645设为PDM模式:确认硬件电阻配置是否开启PDM输出,同时注释掉fixed_mclk = 768000(该时钟值与16kHz采样率的PDM时钟不匹配,建议让ESP自动计算时钟)

3. 验证I2S是否读取到有效数据

在音频发送逻辑前添加调试代码,确认I2S缓冲区是否有数据:

uint8_t test_buf[1024];
int bytes_read = i2s_stream_read(i2s_stream_reader, test_buf, sizeof(test_buf), portMAX_DELAY);
ESP_LOGI("I2S_CHECK", "Read %d bytes, first 10 bytes: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
         bytes_read, test_buf[0], test_buf[1], test_buf[2], test_buf[3], test_buf[4],
         test_buf[5], test_buf[6], test_buf[7], test_buf[8], test_buf[9]);

如果bytes_read为0或数据全是0x00/0xFF,说明I2S未读到数据,优先排查硬件接线和引脚配置;若数据有变化,说明I2S读取正常,问题出在HTTP传输环节。

4. 修正DMA配置语法错误

当前代码中DMA参数的结尾使用了逗号,会导致配置未生效,需改为分号:

i2s_cfg.i2s_config.dma_buf_count = 8;
i2s_cfg.i2s_config.dma_buf_len = 200;

若仍有数据丢失问题,可尝试调整为dma_buf_count = 4, dma_buf_len = 1024,平衡内存占用和数据稳定性。

5. 确认音频管道链路完整性

注释掉板级初始化后,需确保音频管道的组件注册和链接逻辑正确:

audio_pipeline_handle_t pipeline = audio_pipeline_init();
audio_pipeline_register(pipeline, i2s_stream_reader, "i2s");
audio_pipeline_register(pipeline, http_stream_writer, "http");
const char *link_tag[2] = {"i2s", "http"};
audio_pipeline_link(pipeline, link_tag, 2);

同时检查HTTP客户端的服务器地址、请求方法、头部配置,确认HTTP连接已正常建立。


内容的提问来源于stack exchange,提问作者warrior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:42:51