单片机/MCU论坛
直播中

郭昆

未满1年用户 3经验值
擅长:嵌入式技术
私信 关注
[问答]

ESP32开发中,使用ADF环境,系统报错I2C Bus WriteReg Error和I2C Bus ReadReg Error

项目背景

使用ESP32单片机开发,运用IDF5.1.3的环境和ADF的框架,开发一个智能音响。使用的开发板为乐鑫原厂开发板,型号为ESP32-korvo v1.1 。

具体过程是通过ES7210录音,然后由ES8311播放音频,ES7210和ES8311是经过iic进行读写寄存器配置音频录音和播放的。

然后现在的问题是在编译的过程中,日志一直报I2C Bus WriteReg Error和I2C Bus ReadReg Error。

日志如图:
image.png

首先iic是正常可以通信的,使用代码读取ES7210设备的ID是可以正常读到的
86a6a8baa052ef809bbdb3c013223f9.png

6b080f63fef991cf0acd2ac59c97d21.png

代码报错位置如图
image.png

频率,端口也挨个尝试过,不存在端口占用或者频率问题

所以请教各位大佬具体是什么原因?

已退回1积分

回帖(1)

感谢相遇

2025-3-5 17:57:52

在ESP32开发中,使用ADF(Audio Development Framework)框架时,遇到I2C Bus WriteReg ErrorI2C Bus ReadReg Error错误,通常与I2C通信相关的问题有关。以下是一些可能的原因和排查步骤:


1. I2C引脚配置



  • 确保I2C的引脚配置正确。ESP32的I2C引脚可以通过i2c_config_t结构体进行配置,确保SCL和SDA引脚与硬件连接一致。


  • 检查i2c_config_t中的sda_io_numscl_io_num是否与开发板上的实际引脚一致。


    i2c_config_t conf = {
       .mode = I2C_MODE_MASTER,
       .sda_io_num = GPIO_NUM_21,  // 根据实际情况调整
       .scl_io_num = GPIO_NUM_22,  // 根据实际情况调整
       .sda_pullup_en = GPIO_PULLUP_ENABLE,
       .scl_pullup_en = GPIO_PULLUP_ENABLE,
       .master.clk_speed = 100000,  // I2C时钟频率
    };



2. I2C时钟频率



  • I2C时钟频率设置过高可能导致通信失败。尝试降低时钟频率,例如从400kHz降低到100kHz。

  • 确保master.clk_speed设置的值在设备的支持范围内。


3. 电源和地线



  • 确保ES7210和ES8311的电源和地线连接正确,且电源电压稳定。

  • 检查I2C总线的上拉电阻是否连接正确,通常为4.7kΩ。


4. I2C地址



  • 确保I2C设备的地址正确。ES7210和ES8311的I2C地址可能需要在代码中正确设置。

  • 使用I2C扫描工具(如i2c_scanner)确认设备的I2C地址。


5. I2C总线冲突



  • 确保I2C总线上没有其他设备冲突。如果有多个I2C设备,确保它们的地址不冲突。

  • 检查是否有其他进程或任务在使用I2C总线。


6. 代码逻辑



  • 检查代码中是否有逻辑错误,例如在未初始化I2C总线的情况下尝试进行读写操作。

  • 确保在读写操作之前,I2C总线已经正确初始化。


7. 调试信息



  • 在代码中添加更多的调试信息,例如在每次I2C操作前后打印日志,以便更好地定位问题。

  • 使用逻辑分析仪或示波器检查I2C总线的信号波形,确认通信是否正常。


8. 固件版本



  • 确保使用的IDF和ADF版本兼容。有时,不同版本的库可能存在兼容性问题。

  • 尝试更新到最新的IDF和ADF版本,或者回退到已知稳定的版本。


9. 硬件问题



  • 检查硬件连接是否牢固,是否有虚焊或接触不良的情况。

  • 如果有条件,尝试更换开发板或I2C设备,排除硬件故障的可能性。


10. ADF配置



  • 检查ADF的配置文件(如menuconfig)是否正确配置了I2C相关参数。

  • 确保ADF的音频配置与硬件匹配,例如采样率、通道数等。


示例代码片段


以下是一个简单的I2C初始化和读写操作的示例代码片段:


#include "driver/i2c.h"

#define I2C_MASTER_SCL_IO    22   // GPIO number for I2C SCL
#define I2C_MASTER_SDA_IO    21   // GPIO number for I2C SDA
#define I2C_MASTER_FREQ_HZ   100000  // I2C master clock frequency

void i2c_master_init() {
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = I2C_MASTER_FREQ_HZ,
    };
    i2c_param_config(I2C_NUM_0, &conf);
    i2c_driver_install(I2C_NUM_0, conf.mode, 0, 0, 0);
}

esp_err_t i2c_write_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t data) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (dev_addr << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, reg_addr, true);
    i2c_master_write_byte(cmd, data, true);
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

esp_err_t i2c_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (dev_addr << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, reg_addr, true);
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (dev_addr << 1) | I2C_MASTER_READ, true);
    i2c_master_read_byte(cmd, data, I2C_MASTER_LAST_NACK);
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

通过以上步骤和代码示例,你可以逐步排查和解决I2C Bus WriteReg ErrorI2C Bus ReadReg Error的问题。如果问题仍然存在,建议进一步检查硬件连接和固件配置。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分