i2c master aborts write

dieg0_
Posts: 5
Joined: Wed Jan 24, 2018 10:40 pm

i2c master aborts write

Postby dieg0_ » Fri May 31, 2019 8:07 pm

Hey,

for some days I am trying to get an i2c connection between two ESP32 running. After having serious issues with reliability in my main project, I wanted to try around with a simple project.
I adapted the example from espressif (https://github.com/espressif/esp-idf/tr ... _self_test), so it is running on two devices, one master, one slave.

However, sometimes the master seems to just abort writing. This happens irregular and after different numbers of successfully sent bytes. The return of i2c_master_cmd_begin is either ESP_FAIL or ESP_ERR_TIMEOUT. The logic analyzer shows, that the byte-stream just stops with NAK. See attached screenshot, it's supposed to count up from 0x0a to 0x89.

My sample program is here.
https://github.com/juri117/esp32_i2c_master
https://github.com/juri117/esp32_i2c_slave

The hardware setup is:
Master ESP GPIO 18 -> Master ESP GPIO 21
Master ESP GPIO 19 -> Master ESP GPIO 22

After running this example for one minute I get at least one master write failure.

Please, any new ideas are appreciated, I don't know what else to try.
Attachments
Screenshot 2019-05-31 21.53.22.png
Screenshot 2019-05-31 21.53.22.png (172.76 KiB) Viewed 5068 times

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

Re: i2c master aborts write

Postby Ritesh » Sat Jun 01, 2019 8:50 am

Hi,

Which ESP32 IDF you are using into your development process?

Did you try connecting any I2C Device other then ESP32 with single ESP32 Device? If not then I suggest to try one time to verify that it is really software issue or hardware issue.
Regards,
Ritesh Prajapati

dieg0_
Posts: 5
Joined: Wed Jan 24, 2018 10:40 pm

Re: i2c master aborts write

Postby dieg0_ » Sat Jun 01, 2019 3:39 pm

hey, thanks for the reply, sry I should have mentioned that:
I am using esp-idf (https://github.com/espressif/esp-idf) tag: v3.2

I am using a BMP180 pressure sensor that works great. But there the ESP32 as master writes and reads maximum 2 Bytes at a time and I read from registers. With the 2nd ESP32 as slave I couldn't find a way to make the master read from a register, which I would prefer. With the fifo I am never sure how many bytes got dropped and how many bytes are available to read in the first place.

dieg0_
Posts: 5
Joined: Wed Jan 24, 2018 10:40 pm

Re: i2c master aborts write

Postby dieg0_ » Sat Aug 17, 2019 4:16 pm

After trying to distract me with other work I had to come back to the problem and got it running by now.
I think the main problem was timing. Also, the master seems to stop working once it tried to read without the slave having sent anything.

One big issue I found was, that I had the ground connection only via the two USB cables and the PC. Usually that was enough for e.g. UART but I2C needs a direct GND connection between the two ESP32!

So my new approach works like common I2C register communication. The master sends a request for specific data, then waits for a fixed period of time, while the slave puts some data (with fixed length) into the out buffer. Then the master reads without risking reading nothing. Seems stable. However, I miss a way to check the length of the out buffer on the slave side, to know whether the master read the bytes. If anyone needs a working two devices I2C ESP32 to ESP32 example, please benefit from my experiments ;)

Master:
https://github.com/juri117/esp32-i2c-slave
Slave:
https://github.com/juri117/esp32-i2c-slave

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

Re: i2c master aborts write

Postby Ritesh » Fri Aug 23, 2019 1:40 pm

dieg0_ wrote:
Sat Aug 17, 2019 4:16 pm
After trying to distract me with other work I had to come back to the problem and got it running by now.
I think the main problem was timing. Also, the master seems to stop working once it tried to read without the slave having sent anything.

One big issue I found was, that I had the ground connection only via the two USB cables and the PC. Usually that was enough for e.g. UART but I2C needs a direct GND connection between the two ESP32!

So my new approach works like common I2C register communication. The master sends a request for specific data, then waits for a fixed period of time, while the slave puts some data (with fixed length) into the out buffer. Then the master reads without risking reading nothing. Seems stable. However, I miss a way to check the length of the out buffer on the slave side, to know whether the master read the bytes. If anyone needs a working two devices I2C ESP32 to ESP32 example, please benefit from my experiments ;)

Master:
https://github.com/juri117/esp32-i2c-slave
Slave:
https://github.com/juri117/esp32-i2c-slave
Thanks for your findings for same.

We will check it and utilize it as per our requirements.
Regards,
Ritesh Prajapati

Who is online

Users browsing this forum: _anton_, chegewara and 58 guests