问题遇到的现象和发生背景
我使用idf开发esp32c3,使用i2c外设时出现问题。I2C正常发送了出去,但从机没有应答。
我此前使用过nxp的lpc55s69进行过测试,并将这两次的波形使用逻辑分析仪采集出来,区别仅有ACK应答。读取数据的时候现象也是一样的,从机无法作出应答,但时序波形与lpc55s69下实验仅有ack部分有区别。
从机使用AS5600和ADXL345都测试过,现象如上一致。
引脚也更换过多个,包括4 5 6 8 9,都是如此。
实验使用的esp32c3为合宙版。后来又使用安可信的esp32(非c3),额外编写esp32工程,现象依然如此。
实验使用的idf为v4.4-release分支。开发环境ubuntu20.04+vscode+idf4.4
问题相关代码,请勿粘贴截图
初始化
static esp_err_t i2c_master_init(void)
{
int i2c_master_port = I2C_MASTER_NUM;
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_master_port, &conf);
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
1-自己编写cmd
// i2c_cmd_handle_t cmd = i2c_cmd_link_create();
// i2c_master_start(cmd);
// i2c_master_write_byte(cmd, AS5600_I2C_ADDR << 1 | I2C_MASTER_WRITE, false);
// i2c_master_write_byte(cmd, 0x00, false);
// i2c_master_stop(cmd);
// ret = i2c_master_cmd_begin(0, cmd, 1000 / portTICK_RATE_MS);
// i2c_cmd_link_delete(cmd);
// cmd = i2c_cmd_link_create();
// vTaskDelay(50 / portTICK_PERIOD_MS);
// i2c_master_start(cmd);
// i2c_master_write_byte(cmd, AS5600_I2C_ADDR << 1 | I2C_MASTER_READ, false);
// i2c_master_read_byte(cmd, data, false);
// i2c_master_stop(cmd);
// ret = i2c_master_cmd_begin(0, cmd, 1000 / portTICK_RATE_MS);
// i2c_cmd_link_delete(cmd);
2-调用函数
i2c_master_write_to_device(I2C_NUM_0, 0x1D, data, 1, 500 / portTICK_PERIOD_MS);
运行结果及报错内容
我的解答思路和尝试过的方法
基于以上情况,我只能怀疑是不是sda电平在接收ack的时候被主机钳住总线了?
毕竟合宙的板子似乎外部没有接任何器件了,尽只有我挂的adxl345