jgromes / RadioLib

Universal wireless communication library for embedded devices
https://jgromes.github.io/RadioLib/
MIT License
1.49k stars 376 forks source link

Question for SX126x module: IRQs and DIO2 #12

Closed beegee-tokyo closed 5 years ago

beegee-tokyo commented 5 years ago

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:

#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;
  }
}