It is my first question in this forum, i don't know where to ask and i am out of ideas, i hope you can give me a some hints.
Taking from reference an example in the book "Exploring BeagleBone" edition, 2, pg.483, by Derek Molloy, i am making an ESP32
act like an I2C slave, while the master is a RPI3b+.
The code I load into the ESP32 is below. I get the same results with a Dymore ESP32 WROOM-32 and an Heltec wifi kit 32.
. I can see the board from Linux (it has address 0x44)
$> i2cdetect -y -r 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --
. By the program, when I query a register value i should receive back just its address,
But what happens is that OnRequest answers before OnReceive, so it answers
before the data coming from the master has been red.
$> i2cdump -y 1 0x44 b
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 05 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e ..??????????????
10: 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e ????????????????
.....
as you see the first value is 5, but it should instead be zero !
then all other values are delayed by one. second value should be 01,
third 02 and so on.
. I put 1 kOhm resistors pull up to SDA and SCL
. I put the RPi and the ESP32 in common ground
. I'm compiling with the latest ArduinoIDE appimage, 2.3.3
. The boards model i am using in ArduinoIDE are DOIT ESP32 DEVKIT V1 for the WROOM and
Heltec wifi kit 32(v3) for the Heltec board.
. I tried to reduce the speed from 100_000 -> nothing changed.
please let me know if you have any idea
bye
Nicola
====== ESP32 code ========
Code: Select all
#include <Wire.h>
const byte slaveAddr = 0x44;
byte inRegAddr = 5;
void myOnReceive(int x) {
inRegAddr = Wire.read();
}
void myOnRequest() {
Wire.write(inRegAddr);
}
void setup() {
// i2c slave
Wire.begin((uint8_t)slaveAddr);
Wire.setClock(1000L);
Wire.onReceive(myOnReceive);
Wire.onRequest(myOnRequest);
}
void loop() {
delay(2000);
}