I2C Communication nRF52-DK and ESP32

Hi all,

I'm trying to connect an ESP32 with an nRF52-DK (nRF52832) through I2C. I'm using the ESP32 I2C Slave example (https://www.arduino.cc/reference/en/libraries/esp32-i2c-slave/).

For the ESP32 I'm using a code based on the slave_sender.ino and the master_reader.ino for the nRF52-DK.

When I connect the ESP32 to the pins SCL(P.027) and SDA(P.026) of the nRF52-DK I don't receive anything and if (when connected) I reset the ESP32 I receive this error

rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371 
 

the rest of the time I receive "slave not found"

The code in ESP32 is:

#include <Arduino.h>
#include <Wire.h>
#include <WireSlave.h>

#define I2C_SDA 12
#define I2C_SCL 13
#define I2C_SLAVE_ADDR 0x04
int table[] = {0, 0, 0};
void requestEvent();

void setup()
{
  Serial.begin(115200);

  WireSlave.begin(I2C_SDA, I2C_SCL, I2C_SLAVE_ADDR);
  Serial.printf("Slave joined I2C bus with addr #%d\n", I2C_SLAVE_ADDR);
}

void loop()
{
  int x = 120;
  int y = 1200; // gets converted to an strange # because is larger than 255
  int z = 3;
  table[0] = x;
  table[1] = y;
  table[2] = z;

  WireSlave.onRequest(requestEvent); // register event

}

// function that runs whenever the master sends an empty packet.
// this function is registered as an event, see setup().
// do not perform time-consuming tasks inside this function,
// do them elsewhere and simply read the data you wish to
// send inside here.
void requestEvent()
{
  uint8_t Buffer[3];
  Buffer[0] = table[0];
  Buffer[1] = table[1];
  Buffer[2] = table[2];
  WireSlave.write(Buffer, 3);
}

In the nRF52-DK the related part of the code is:

#include <Arduino.h>
#include "I2Cdev.h"
#include "Wire.h"
#include <WireCrc.h>
#include <WireSlave.h>

int table[] = {0, 0, 0, 0};
#define I2C_SLAVE_ADDR 0x04
#define SDA_PIN 12
#define SCL_PIN 13
#define MAX_SLAVE_RESPONSE_LENGTH 64

void setup(){

  Serial.begin(115200);
  Wire.begin();
  
}
void loop{
ESP32_Connect();
}

void ESP32_Connect(){
  
  static unsigned long lastReadMillis = 0;
  
  // request data from Slave every 1000 ms
  if (millis() - lastReadMillis > 1000) {
    // first create a WireSlaveRequest object
    // first argument is the Wire bus the slave is attached to (Wire or Wire1)
    WireSlaveRequest slaveReq(Wire, I2C_SLAVE_ADDR, MAX_SLAVE_RESPONSE_LENGTH);

    // optional: set delay in milliseconds between retry attempts.
    // the default value is 10 ms
    slaveReq.setRetryDelay(5);

    // attempts to read a packet from an ESP32 slave.
    // there's no need to specify how many bytes are requested,
    // since data is expected to be packed with WirePacker,
    // and thus can have any length.
    bool success = slaveReq.request(I2C_SLAVE_ADDR);

    if (success) {

      for (int i = 0; i < 4; i++) //organizes the data from the slave in the table
      {
        uint8_t c = slaveReq.read(); // receive a byte as character
        table[i] = c;
      }
      //displays the data
      Serial.print('\n');
      Serial.print(table[0]);
      Serial.print('\t');
      Serial.print(table[1]);
      Serial.print('\t');
      Serial.print(table[2]);
      Serial.print('\t');
      Serial.print(table[3]);
      Serial.print('\n');

      delay (500);

    }
    else {
      // if something went wrong, print the reason
      Serial.println(slaveReq.lastStatusToString());
    }

    lastReadMillis = millis();
  }
  
}

Parents
  • Hello,

    I can't see any obvious mistakes, but I'm not familiar with the ESP32 codebase, nor the arduino code you use on the 52, so that may be why.  Apart from the errors on errors shown on boot, does the esp program appear to run ok, or does it go enter a reset loop because of the errors?

    You should also connect a logic analyzer or scope to the i2c lines to see if the nrf sends the data as expected, and whether this data gets acked by the esp or not.

    Best regards,

    Vidar

Reply
  • Hello,

    I can't see any obvious mistakes, but I'm not familiar with the ESP32 codebase, nor the arduino code you use on the 52, so that may be why.  Apart from the errors on errors shown on boot, does the esp program appear to run ok, or does it go enter a reset loop because of the errors?

    You should also connect a logic analyzer or scope to the i2c lines to see if the nrf sends the data as expected, and whether this data gets acked by the esp or not.

    Best regards,

    Vidar

Children
No Data
Related