ESP32C3 I2C no ack 无应答[已解决]

day_day
Posts: 4
Joined: Sun Jan 24, 2021 12:31 pm

ESP32C3 I2C no ack 无应答[已解决]

Postby day_day » Sun Jul 03, 2022 3:59 pm

(一)现象
我使用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

I use idf to program esp32c3, and problem occurred when using i2c. The i2c was send successfully as display in logic analyzer, but no ack receive from slaver.
I had been test the slaver(both adxl345 and as5600) in NXP's lpc55s69, and it work as same as above, except the ack is successfully receive.
I have change the pin of i2c, but it does not work!

the board in this experience is esp32c3 developed by hezhou:
https://wiki.luatos.com/chips/esp32c3/board.html

the idf version is v4.4-release.
and I develop it in ubuntu20.04+vscode+idf4.4

(二)代码
i2c_simple.tar.gz
(16.17 KiB) Downloaded 577 times
初始化 init


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);
}

逻辑代码 the logic code
1-自己编写cmd-program by 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-调用函数-program by usb the sdk function

i2c_master_write_to_device(I2C_NUM_0, 0x1D, data, 1, 500 / portTICK_PERIOD_MS);


(三)
Image
Image
https://img-mid.csdnimg.cn/release/stat ... 320,m_lfit
https://img-mid.csdnimg.cn/release/stat ... 320,m_lfit
图片外链很麻烦,详细请看:https://ask.csdn.net/questions/7752699

基于以上情况,我只能怀疑是不是sda电平在接收ack的时候被主机钳住总线了?
毕竟合宙的板子似乎外部没有接任何器件了,尽只有我挂的adxl345
而且安可信的esp32板子也是同样的情况,难道是有什么配置没有配好吗?

I think the sda might be limited by esp32c3, thus the slaver can't pull it down?

--------------------2022 07 05---------------------
今天尝试了DS3231,同样的代码,意外的竟可以驱动!但换回ADXL345依然不能驱动,我仅仅修改了从机地址而已!
但有个问题 DS3231 模块是一个3.3-5V都兼容的,模块,但在esp32c3上只有5V才有正常的Ack响应。是不是里面某些电气特性上有问题?

--------------------2022 07 06---------------------
今天又尝试了DS3231,发现虽然通过设置ack相关位为0实现了应答,但读上来的数据全是FF,看样子数据上传的时候还是被钳住了总线。

day_day
Posts: 4
Joined: Sun Jan 24, 2021 12:31 pm

Re: ESP32C3 I2C no ack 无应答

Postby day_day » Thu Jul 14, 2022 3:35 pm

已经解决:主要是由于as5600本身对上升沿有一些要求。而 adxl345 则是因为从机地址弄错了。
https://ask.csdn.net/questions/7752699?weChatOA=
https://ask.csdn.net/questions/7752699?weChatOA=

代码没什么毛病,就是读的时候要用对应的宏设置应答:

Code: Select all

        
        i2c_master_read_byte(cmd, data, I2C_MASTER_ACK);
        i2c_master_read_byte(cmd, &data[1], I2C_MASTER_LAST_NACK);
之所以没有应答,对于adxl345时因为弄错了从机地址。
对于as5600则大有名堂,as5600对上升沿要求很严格,数据手册里面限制到120ns。但经过示波器测量,esp32内部上拉带来的上升沿有10us。

Image
Image

以上分别是成功读取的nxp开发板和esp32c3上升沿。

将速度放缓到1K仍然不能读取:
Image

经查询as5600数据手册后发现iic数据线需要上拉4.7K,猜测是因为as5600对上升沿有异常要求,所以靠外部上来来提升上升沿响应速度。
一下是10K速度下读取的时序:
内部上拉+失败-外部上拉+成功

Image
Image

Who is online

Users browsing this forum: No registered users and 81 guests