ESP32 with EBYTE E220-900T22D - TIMEOUT Error

Hi,
I'm currently trying to use an EBYTE E220-900T22D LoRa Module with an ESP32 P4 from Waveshare but i can't get a response from the module.

Wiring:
TX (E220) → RX GPIO38
RX (E220) → TX GPIO37
AUX → GPIO45
M0 → GPIO32
M1 → GPIO27
VCC → 3.3V
GND → GND

Library: LoRa_E220 library by Renzo Mischianti.

Code:

#include "LoRa_E220.h"
#include <HardwareSerial.h>

HardwareSerial mySerial(2);

#define RX_PIN 38
#define TX_PIN 37
#define AUX_PIN 45
#define M0_PIN 32
#define M1_PIN 27

LoRa_E220 e220(
  TX_PIN, RX_PIN,
  &mySerial,
  AUX_PIN, M0_PIN, M1_PIN,
  UART_BPS_RATE_9600,
  SERIAL_8N1
  );

struct SensorData {
  float temperature;
  float humidity;
};

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);
  Serial.println("START");

  e220.begin();
  Serial.println("e220 start");

  ResponseStructContainer c = e220.getConfiguration();
  Serial.println("getConfiguration");

  if (c.status.code == 1) {
    Configuration config = *(Configuration*)c.data;
    config.CHAN = 18;
    config.OPTION.transmissionPower = POWER_13;
    ResponseStatus rs = e220.setConfiguration(config, WRITE_CFG_PWR_DWN_SAVE);
    Serial.println(rs.getResponseDescription());
  } else {
    Serial.print("Error: ");
    Serial.println(c.status.getResponseDescription());

  }
      c.close();

}

void loop() {
  SensorData data;
  data.temperature = 23.56;
  data.humidity = 51.2;
  ResponseStatus rs = e220.sendMessage((uint8_t*)&data, sizeof(data));
  delay(5000);
}

Problem: I want to send 2 values via the E220 Module, but every time when I upload the code, the serial monitor always prints

"START
e220 start
getConfiguration
Error: Timeout!!"

The Error seems to come from here somewhere. When I remove the lines, the error message in the serial monitor also doesn't get printed anymore:

  ResponseStructContainer c = e220.getConfiguration();
  Serial.println("getConfiguration");

  if (c.status.code == 1) {
    Configuration config = *(Configuration*)c.data;
    config.CHAN = 18;
    config.OPTION.transmissionPower = POWER_13;
    ResponseStatus rs = e220.setConfiguration(config, WRITE_CFG_PWR_DWN_SAVE);
    Serial.println(rs.getResponseDescription());
  } else {
    Serial.print("Error: ");
    Serial.println(c.status.getResponseDescription());

  }
      c.close();

I have not made a receiver yet because I want this code to work before.

Earlier, instead of "Timeout" the serial monitor also printed
"assert failed: heap_caps_free heap_caps_base.c:80 (heap != NULL && "free() target pointer is outside heap areas")"

Edit: I've just realised, that c.status.code == 9, not 1. So the if-clause gets skipped immediately. Why does this happen? It can't be a power problem because I've an external 3.3V power supply for the E220.

Questions:

  • Is there anything wrong with my wiring or UART configuration?
  • Do M0/M1 have to be set differently when reading the configuration?
  • Is there anything specific required when using this module with an ESP32 P4 that I might have missed?
  • Any ideas, why c.status.code is 9?

Any ideas would be greatly appeciated!
Thanks.

My first suspect is your code EXPECTS a responses from a receiver and if it never comes, you get a time-out after several retries. A check might be to Serial.print the time right after you print “getConfiguration” and again right after this:

 } else {
    Serial.print("Error: ");
    Serial.println(c.status.getResponseDescription());
That will show the time spent in trying to find your receiver.

Thanks for the quick reply. I've now just realised, that c.status.code == 9, not 1. So the if-clause with the configurations gets skipped immediately. Any ideas, why this happens?

No, never used the devices. Have you worked through the various tutorials?

this code worked for me transmitting and receiving datas using a pair of EBYTE LoRa E220 connected to an ESP32s

// ESP32_02_sendTransparentTransmission
// Load ESP32_02_sendTransparent_Struct into both ESP32

// both will transmit and display received data, e.g.
// ESP32 > transmit > (14) Success  temperature 26.60  humidity 60.90  pressure 200.00
// received length 11  ResponseDescription Success
//      seq 132  temperature 158.60  humidity 1380.90  pressure 13400.00 RSSI: 110
// *** Sequence number error ! expected 0
//
// ESP32 > transmit > (14) Success  temperature 27.60  humidity 70.90  pressure 300.00
//received length 11  ResponseDescription Success
//      seq 133  temperature 159.60  humidity 1390.90  pressure 13500.00 RSSI: 110

/*
 * EBYTE LoRa E220
 * send a transparent message, you must check that the transmitter and receiver have the same
 * CHANNEL ADDL and ADDH
 *
 * Pay attention e220 support RSSI, if you want use that functionality you must enable RSSI on configuration
 * configuration.TRANSMISSION_MODE.enableRSSI = RSSI_ENABLED;
 *
 * and uncomment #define ENABLE_RSSI true in this sketch
 *
 * You must uncommend the correct constructor.
 *
 * by Renzo Mischianti <https://www.mischianti.org>
 *
 * https://www.mischianti.org
 *
 * E220		  ----- WeMos D1 mini	----- esp32			----- Arduino Nano 33 IoT	----- Arduino MKR	----- Raspberry Pi Pico   ----- stm32               ----- ArduinoUNO
 * M0         ----- D7 (or GND) 	----- 19 (or GND) 	----- 4 (or GND) 			----- 2 (or GND) 	----- 10 (or GND)	      ----- PB0 (or GND)        ----- 7 Volt div (or GND)
 * M1         ----- D6 (or GND) 	----- 21 (or GND) 	----- 6 (or GND) 			----- 4 (or GND) 	----- 11 (or GND)	      ----- PB10 (or GND)       ----- 6 Volt div (or GND)
 * TX         ----- D3 (PullUP)		----- TX2 (PullUP)	----- TX1 (PullUP)			----- 14 (PullUP)	----- 8 (PullUP)	      ----- PA2 TX2 (PullUP)    ----- 4 (PullUP)
 * RX         ----- D4 (PullUP)		----- RX2 (PullUP)	----- RX1 (PullUP)			----- 13 (PullUP)	----- 9 (PullUP)	      ----- PA3 RX2 (PullUP)    ----- 5 Volt div (PullUP)
 * AUX        ----- D5 (PullUP)		----- 18  (PullUP)	----- 2  (PullUP)			----- 0  (PullUP)	----- 2  (PullUP)	      ----- PA0  (PullUP)       ----- 3 (PullUP)
 * VCC        ----- 3.3v/5v			----- 3.3v/5v		----- 3.3v/5v				----- 3.3v/5v		----- 3.3v/5v		      ----- 3.3v/5v             ----- 3.3v/5v
 * GND        ----- GND				----- GND			----- GND					----- GND			----- GND			      ----- GND                 ----- GND
 *
 */
#define ENABLE_RSSI true
#define FREQUENCY_868

#include "Arduino.h"
#include "LoRa_E220.h"

// ---------- esp8266 pins --------------
//LoRa_E220 e220ttl(RX, TX, AUX, M0, M1);  // Arduino RX <-- e220 TX, Arduino TX --> e220 RX
//LoRa_E220 e220ttl(D3, D4, D5, D7, D6); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1
//LoRa_E220 e220ttl(D2, D3); // Config without connect AUX and M0 M1

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX
//LoRa_E220 e220ttl(&mySerial, D5, D7, D6); // AUX M0 M1
// -------------------------------------

// ---------- Arduino pins --------------
//LoRa_E220 e220ttl(4, 5, 3, 7, 6); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1
//LoRa_E220 e220ttl(4, 5); // Config without connect AUX and M0 M1

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(4, 5); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX
//LoRa_E220 e220ttl(&mySerial, 3, 7, 6); // AUX M0 M1
// -------------------------------------

// ------------- Arduino Nano 33 IoT -------------
// LoRa_E220 e220ttl(&Serial1, 2, 4, 6); //  RX AUX M0 M1
// -------------------------------------------------

// ------------- Arduino MKR WiFi 1010 -------------
// LoRa_E220 e220ttl(&Serial1, 0, 2, 4); //  RX AUX M0 M1
// -------------------------------------------------

// ---------- esp32 pins --------------
// LoRa_E220 e220ttl(&Serial2, 15, 21, 19); //  RX AUX M0 M1
//  ESP32
#define RXD1 16
#define TXD1 17

// ---------- esp32 pins --------------
LoRa_E220 e220ttl(&Serial2, 18, 21, 19);  //  RX AUX M0 M1
// CHECK WIRING!  using GetConfiguration

//LoRa_E220 e220ttl(&Serial2, 22, 4, 18, 21, 19, UART_BPS_RATE_9600); //  esp32 RX <-- e220 TX, esp32 TX --> e220 RX AUX M0 M1
// -------------------------------------

// ---------- Raspberry PI Pico pins --------------
// LoRa_E220 e220ttl(&Serial2, 2, 10, 11); //  RX AUX M0 M1
// -------------------------------------

// ---------------- STM32 --------------------
//HardwareSerial Serial2(USART2);   // PA3  (RX)  PA2  (TX)
//LoRa_E220 e220ttl(&Serial2, PA0, PB0, PB10); //  RX AUX M0 M1
// -------------------------------------------------

// test structure
struct __attribute__((packed)) Struct1 {
  int16_t seq;  // sequence number
  float temperature;
  float humidity;
  float pressure;
};

Struct1 struct1 = { 0, 25.6f, 50.9f, 100.0f };  // test values

void setup() {
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, RXD1, TXD1);  

  // Startup all pins and UART
  e220ttl.begin();
  sendData();
}

void sendData(void) {
// update data ready for next transmissiom - replace with code to read sensor
  struct1.temperature += 1.0f;
  struct1.humidity += 10.0f;
  struct1.pressure += 100.0f;
  Serial.printf("\nESP32 > transmit > (%d) ", sizeof(struct1));
  ResponseStatus rs = e220ttl.sendMessage(&struct1, sizeof(struct1));
  // Check If there is some problem of succesfully send
  Serial.print(rs.getResponseDescription());  // transmit structure and print vales transmitted
  Serial.print("  temperature ");
  Serial.print(struct1.temperature);
  Serial.print("  humidity ");
  Serial.print(struct1.humidity);
  Serial.print("  pressure ");
  Serial.println(struct1.pressure);
   struct1.seq++;
   }

void loop() {
  static long timer = millis();
  static int seqExpected = 0;
  // If something available
  if (e220ttl.available() > 1) {
    delay(10);
    Serial.printf("received length %d ", e220ttl.available());
    // read the structure message
    ResponseStructContainer rc = e220ttl.receiveMessageRSSI(sizeof(Struct1));
    // Is something goes wrong print error
    if (rc.status.code != 1) {
       Serial.print("  ResponseDescription ");
      Serial.println(rc.status.getResponseDescription());
   } else {
      // Print the data received
      Serial.print(" ResponseDescription ");
      Serial.println(rc.status.getResponseDescription());
      Serial.print("      seq ");
      Serial.print(((Struct1*)rc.data)->seq);
      Serial.print("  temperature ");
      Serial.print(((Struct1*)rc.data)->temperature);
      Serial.print("  humidity ");
      Serial.print(((Struct1*)rc.data)->humidity);
      Serial.print("  pressure ");
      Serial.print(((Struct1*)rc.data)->pressure);
      Serial.print(" RSSI: ");
      Serial.println(rc.rssi, DEC);
      // check for sequence error
      if (struct1.seq != seqExpected) {
        Serial.print("*** Sequence number error ! expected ");
        Serial.println(seqExpected);
      }
      seqExpected = struct1.seq + 1;  // set up next sequence number
    }
  }
  if (millis() - timer > 5000) {
    timer = millis();
    sendData();
  }
}

transmitter serial monitor output

oad ESP32_02_sendTransparent_Struct into both ESP32

ESP32 COM4
ESP32 > transmit > (14) Success  temperature 26.60  humidity 60.90  pressure 200.00
received length 11  ResponseDescription Success
      seq 132  temperature 158.60  humidity 1380.90  pressure 13400.00 RSSI: 110
*** Sequence number error ! expected 0

ESP32 > transmit > (14) Success  temperature 27.60  humidity 70.90  pressure 300.00
received length 11  ResponseDescription Success
      seq 133  temperature 159.60  humidity 1390.90  pressure 13500.00 RSSI: 110

ESP32 > transmit > (14) Success  temperature 28.60  humidity 80.90  pressure 400.00
received length 11  ResponseDescription Success
      seq 134  temperature 160.60  humidity 1400.90  pressure 13600.00 RSSI: 110


receiver serial monitor output

ESP32 COM6
ESP32 > transmit > (14) Success  temperature 63.60  humidity 430.90  pressure 3900.00
received length 11  ResponseDescription Success
      seq 4  temperature 30.60  humidity 100.90  pressure 600.00 RSSI: 110

ESP32 > transmit > (14) Success  temperature 64.60  humidity 440.90  pressure 4000.00
received length 11  ResponseDescription Success
      seq 5  temperature 31.60  humidity 110.90  pressure 700.00 RSSI: 110

ESP32 > transmit > (14) Success  temperature 65.60  humidity 450.90  pressure 4100.00
received length 11  ResponseDescription Success
      seq 6  temperature 32.60  humidity 120.90  pressure 800.00 RSSI: 110

Thanks for helping. It now works. There were a few small things that didn't work, but now everything works fine.

Can be a good idea to post details of what was wrong with your setup, it might help others in the future.