ESP32-S3对接SPH0645LM4H后音频传输为空的问题求助
问题背景
我基于esp-adf/examples/recorder/pipeline_raw_http示例(原适配Krovo 2等带内置模拟麦的开发板),修改代码适配ESP32-S3对接MEMS麦克风SPH0645LM4H,已完成以下修改:
- 注释掉编解码器相关代码:
//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);
- 修改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);
- 参考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
相关产品推荐
相关产品推荐

