I am connecting a eByte E22-900M22 module with the SX1262 chip. This module has DIO1 and DIO2 exposed, but DIO2 (in my setup) is used to control the RX/TX direction of the antenna. DIO3 is not available.
The initialization routine for the SX1262 module asks for 2 interrupt inputs. But I can only assign DIO1.
Questions:
Will it work with only one IRQ?
If it should work, how do I initialize the module?
Does the library setup DIO2 to control the antenna? Do I have to set a flag to activate this feature?
The code is based on the SX126x_Receive.ino and SX126x_Transmit.ino examples:
#include <Arduino.h>
#include <SPI.h>
#include <RadioLib.h>
// SX1262 module is in slot A on the shield
SX1262 lora = new Module(5, 25, 25, 22, SPI);
void setFlag(void);
void printError(int errNo);
#define LED_RED 16
#define RADIO_RXEN 27
#define RADIO_TXEN 26
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
uint8_t dataBuffer[1024];
void setup()
{
pinMode(LED_RED, OUTPUT);
pinMode(RADIO_RXEN, OUTPUT);
pinMode(RADIO_TXEN, INPUT);
digitalWrite(LED_RED, HIGH);
digitalWrite(RADIO_RXEN, HIGH);
// digitalWrite(RADIO_TXEN, LOW);
SPI.begin(18, 19, 23, 5);
Serial.begin(115200);
Serial.println("=====================================");
Serial.println("SX126x receiver test");
Serial.println("=====================================");
int state = lora.begin(915.0, 125.0, 6, 5, 0x3444, 22, 8);
// int state = lora.begin();
if (state == ERR_NONE)
{
Serial.println("success!");
}
else
{
Serial.print("failed: ");
printError(state);
}
// set the function that will be called
// when new packet is received
lora.setDio1Action(setFlag);
lora.setDio2Action(setFlag);
digitalWrite(RADIO_RXEN, HIGH);
// start listening for LoRa packets
// Serial.print("[SX1262] Starting to listen ... ");
// state = lora.startReceive();
// if (state == ERR_NONE)
// {
// Serial.println("success!");
// }
// else
// {
// Serial.print("failed: ");
// printError(state);
// }
/// \todo add WiFi connection here
}
void loop()
{
// put your main code here, to run repeatedly:
digitalWrite(LED_RED, !digitalRead(LED_RED));
delay(500);
int result = lora.receive(dataBuffer, 1024);
if ((result != ERR_NONE) && (result != ERR_RX_TIMEOUT))
{
Serial.print("Receive error: ");
printError(result);
}
else if (result == ERR_NONE)
{
Serial.println("Received==>");
Serial.println(String((char *)dataBuffer));
}
// check if the flag is set
if (receivedFlag)
{
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = lora.readData(str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = lora.receive(byteArr, 8);
*/
if (state == ERR_NONE)
{
// packet was successfully received
Serial.println("[SX1262] Received packet!");
// print data of the packet
Serial.print("[SX1262] Data:\t\t");
Serial.println(str);
// print RSSI (Received Signal Strength Indicator)
Serial.print("[SX1262] RSSI:\t\t");
Serial.print(lora.getRSSI());
Serial.println(" dBm");
// print SNR (Signal-to-Noise Ratio)
Serial.print("[SX1262] SNR:\t\t");
Serial.print(lora.getSNR());
Serial.println(F(" dBm"));
}
else if (state == ERR_CRC_MISMATCH)
{
// packet was received, but is malformed
Serial.println(F("CRC error!"));
}
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt)
{
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void printError(int errNo)
{
switch (errNo)
{
case ERR_NONE:
Serial.println("Success!");
break;
case ERR_UNKNOWN:
Serial.println("Unknown error");
break;
case ERR_CHIP_NOT_FOUND:
Serial.println("SX127x not found");
break;
case ERR_EEPROM_NOT_INITIALIZED:
Serial.println("EEPROM not initialized");
break;
case ERR_PACKET_TOO_LONG:
Serial.println("TX packet too long");
break;
case ERR_TX_TIMEOUT:
Serial.println("TX timeout");
break;
case ERR_RX_TIMEOUT:
Serial.println("RX timeout");
break;
case ERR_CRC_MISMATCH:
Serial.println("CRC error");
break;
case ERR_INVALID_BANDWIDTH:
Serial.println("Invalid bandwidth");
break;
case ERR_INVALID_SPREADING_FACTOR:
Serial.println("Invalid spreading factor");
break;
case ERR_INVALID_CODING_RATE:
Serial.println("Invalid coding rate");
break;
case ERR_INVALID_BIT_RANGE:
Serial.println("Invalid bit range (internal error)");
break;
case ERR_INVALID_FREQUENCY:
Serial.println("Invalid frequence value");
break;
case ERR_INVALID_OUTPUT_POWER:
Serial.println("Invalid output power");
break;
case PREAMBLE_DETECTED:
Serial.println("Channel is in use");
break;
case CHANNEL_FREE:
Serial.println("Channel is free");
break;
case ERR_SPI_WRITE_FAILED:
Serial.println("SPI write error");
break;
case ERR_INVALID_CURRENT_LIMIT:
Serial.println("Invalid current limit");
break;
case ERR_INVALID_PREAMBLE_LENGTH:
Serial.println("Invalid preamble length");
break;
case ERR_INVALID_GAIN:
Serial.println("Invalid gain");
break;
case ERR_WRONG_MODEM:
Serial.println("Wrong modem command");
break;
case ERR_INVALID_BIT_RATE:
Serial.println("Invalid bit rate");
break;
case ERR_INVALID_FREQUENCY_DEVIATION:
Serial.println("Invalid frequence deviation");
break;
case ERR_INVALID_BIT_RATE_BW_RATIO:
Serial.println("Invalid bit rate bandwidth ratio");
break;
case ERR_INVALID_RX_BANDWIDTH:
Serial.println("Invalid RX bandwidth");
break;
case ERR_INVALID_SYNC_WORD:
Serial.println("FSK sync word invalid");
break;
case ERR_INVALID_DATA_SHAPING:
Serial.println("Invalid FSK data shaping");
break;
case ERR_INVALID_MODULATION:
Serial.println("Invalid modulation");
break;
case ERR_AT_FAILED:
Serial.println("AT command failed");
break;
case ERR_URL_MALFORMED:
Serial.println("Invalid URL");
break;
case ERR_RESPONSE_MALFORMED_AT:
Serial.println("Malformed AT command");
break;
case ERR_RESPONSE_MALFORMED:
Serial.println("Malformed response");
break;
case ERR_MQTT_CONN_VERSION_REJECTED:
Serial.println("MQTT connection rejected due to version mismatch");
break;
case ERR_MQTT_CONN_ID_REJECTED:
Serial.println("MQTT connection rejected due to unknown ID");
break;
case ERR_MQTT_CONN_SERVER_UNAVAILABLE:
Serial.println("MQTT server unavailable");
break;
case ERR_MQTT_CONN_BAD_USERNAME_PASSWORD:
Serial.println("MQTT username/password incorrect");
break;
// case ERR_MQTT_CONN_NOT_AUTHORIZED:
// Serial.println("Unauthorized connection to MQTT broker");
// break;
case ERR_MQTT_UNEXPECTED_PACKET_ID:
Serial.println("Unexpected MQTT packet ID");
break;
case ERR_MQTT_NO_NEW_PACKET_AVAILABLE:
Serial.println("No packet available");
break;
// case MQTT_SUBS_SUCCESS_QOS_0:
// Serial.println("MQTT QoS 0 subscription success");
// break;
case MQTT_SUBS_SUCCESS_QOS_1:
Serial.println("MQTT QoS 1 subscription success");
break;
case MQTT_SUBS_SUCCESS_QOS_2:
Serial.println("MQTT QoS 2 subscription success");
break;
case ERR_MQTT_SUBS_FAILED:
Serial.println("MQTT subscription failed");
break;
case ERR_CMD_MODE_FAILED:
Serial.println("Command failure");
break;
case ERR_FRAME_MALFORMED:
Serial.println("Frame malformed");
break;
case ERR_FRAME_INCORRECT_CHECKSUM:
Serial.println("Frame checksum error");
break;
case ERR_FRAME_UNEXPECTED_ID:
Serial.println("Unexpected ID");
break;
case ERR_FRAME_NO_RESPONSE:
Serial.println("Frame timeout");
break;
case ERR_INVALID_RTTY_SHIFT:
Serial.println("Invalid RTTY shift");
break;
case ERR_UNSUPPORTED_ENCODING:
Serial.println("Unsupported encoding");
break;
case ERR_INVALID_DATA_RATE:
Serial.println("Invalid data rate");
break;
case ERR_INVALID_ADDRESS_WIDTH:
Serial.println("Invalid address width");
break;
case ERR_INVALID_PIPE_NUMBER:
Serial.println("Invalid pipe number");
break;
case ERR_INVALID_NUM_BROAD_ADDRS:
Serial.println("Invalid broadcast address");
break;
case ERR_INVALID_CRC_CONFIGURATION:
Serial.println("Invalid CRC configuration");
break;
case LORA_DETECTED:
Serial.println("Scan found LoRa transmission");
break;
case ERR_INVALID_TCXO_VOLTAGE:
Serial.println("Invalid TCXO voltage");
break;
case ERR_INVALID_MODULATION_PARAMETERS:
Serial.println("Invalid modulation parameter");
break;
case ERR_SPI_CMD_TIMEOUT:
Serial.println("SPI timeout");
break;
case ERR_SPI_CMD_INVALID:
Serial.println("SPI received invalid command");
break;
case ERR_SPI_CMD_FAILED:
Serial.println("SPI CMD failed");
break;
}
}
I am connecting a eByte E22-900M22 module with the SX1262 chip. This module has DIO1 and DIO2 exposed, but DIO2 (in my setup) is used to control the RX/TX direction of the antenna. DIO3 is not available.
The initialization routine for the SX1262 module asks for 2 interrupt inputs. But I can only assign DIO1.
Questions:
The code is based on the SX126x_Receive.ino and SX126x_Transmit.ino examples: