From 855a64c05390a08405fc3a701bf64b41d2f59d1f Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 26 Nov 2024 19:46:43 +0100 Subject: [PATCH] [SX126x] Allow SX1261 version string for LLCC68 devices (#1329) --- .../LLCC68_Receive_Blocking.ino | 107 ----------------- .../LLCC68_Transmit_Blocking.ino | 108 ------------------ src/modules/LLCC68/LLCC68.cpp | 7 ++ src/modules/LLCC68/LLCC68.h | 1 + 4 files changed, 8 insertions(+), 215 deletions(-) delete mode 100644 examples/LLCC68/LLCC68_Receive_Blocking/LLCC68_Receive_Blocking.ino delete mode 100644 examples/LLCC68/LLCC68_Transmit_Blocking/LLCC68_Transmit_Blocking.ino diff --git a/examples/LLCC68/LLCC68_Receive_Blocking/LLCC68_Receive_Blocking.ino b/examples/LLCC68/LLCC68_Receive_Blocking/LLCC68_Receive_Blocking.ino deleted file mode 100644 index f934e18c..00000000 --- a/examples/LLCC68/LLCC68_Receive_Blocking/LLCC68_Receive_Blocking.ino +++ /dev/null @@ -1,107 +0,0 @@ -/* - RadioLib LLCC68 Blocking Receive Example - - This example listens for LoRa transmissions using LLCC68 LoRa modules. - - NOTE: LLCC68 modules offer the same features as SX1261 and have the same - interface. The difference is in the available LoRa settings (not all - spreading factors are available on LLCC68). - Please see SX126x examples for full reference. - - WARNING: Often, LLCC68 modules are mislabeled. If you are seeing error -2 - (RADIOLIB_ERR_CHIP_NOT_FOUND) and debug mode shows "SX1261" as - the version string, use the SX1261 class! - - For default module settings, see the wiki page - https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx126x---lora-modem - - For full API reference, see the GitHub Pages - https://jgromes.github.io/RadioLib/ -*/ - -// include the library -#include - -// LLCC68 has the following connections: -// NSS pin: 10 -// DIO1 pin: 2 -// NRST pin: 3 -// BUSY pin: 9 -LLCC68 radio = new Module(10, 2, 3, 9); - -// or detect the pinout automatically using RadioBoards -// https://github.com/radiolib-org/RadioBoards -/* -#define RADIO_BOARD_AUTO -#include -Radio radio = new RadioModule(); -*/ - -void setup() { - Serial.begin(9600); - - // initialize LLCC68 with default settings - Serial.print(F("[LLCC68] Initializing ... ")); - int state = radio.begin(); - if (state == RADIOLIB_ERR_NONE) { - Serial.println(F("success!")); - } else { - Serial.print(F("failed, code ")); - Serial.println(state); - while (true) { delay(10); } - } -} - -void loop() { - Serial.print(F("[LLCC68] Waiting for incoming transmission ... ")); - - // you can receive data as an Arduino String - String str; - int state = radio.receive(str); - - // you can also receive data as byte array - /* - byte byteArr[8]; - int state = radio.receive(byteArr, 8); - */ - - if (state == RADIOLIB_ERR_NONE) { - // packet was successfully received - Serial.println(F("success!")); - - // print the data of the packet - Serial.print(F("[LLCC68] Data:\t\t")); - Serial.println(str); - - // print the RSSI (Received Signal Strength Indicator) - // of the last received packet - Serial.print(F("[LLCC68] RSSI:\t\t")); - Serial.print(radio.getRSSI()); - Serial.println(F(" dBm")); - - // print the SNR (Signal-to-Noise Ratio) - // of the last received packet - Serial.print(F("[LLCC68] SNR:\t\t")); - Serial.print(radio.getSNR()); - Serial.println(F(" dB")); - - // print frequency error - Serial.print(F("[LLCC68] Frequency error:\t")); - Serial.print(radio.getFrequencyError()); - Serial.println(F(" Hz")); - - } else if (state == RADIOLIB_ERR_RX_TIMEOUT) { - // timeout occurred while waiting for a packet - Serial.println(F("timeout!")); - - } else if (state == RADIOLIB_ERR_CRC_MISMATCH) { - // packet was received, but is malformed - Serial.println(F("CRC error!")); - - } else { - // some other error occurred - Serial.print(F("failed, code ")); - Serial.println(state); - - } -} diff --git a/examples/LLCC68/LLCC68_Transmit_Blocking/LLCC68_Transmit_Blocking.ino b/examples/LLCC68/LLCC68_Transmit_Blocking/LLCC68_Transmit_Blocking.ino deleted file mode 100644 index 8874f339..00000000 --- a/examples/LLCC68/LLCC68_Transmit_Blocking/LLCC68_Transmit_Blocking.ino +++ /dev/null @@ -1,108 +0,0 @@ -/* - RadioLib SX126x Blocking Transmit Example - - This example transmits packets using LLCC68 LoRa radio module. - - NOTE: LLCC68 modules offer the same features as SX1261 and have the same - interface. The difference is in the available LoRa settings (not all - spreading factors are available on LLCC68). - Please see SX126x examples for full reference. - - WARNING: Often, LLCC68 modules are mislabeled. If you are seeing error -2 - (RADIOLIB_ERR_CHIP_NOT_FOUND) and debug mode shows "SX1261" as - the version string, use the SX1261 class! - - For default module settings, see the wiki page - https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx126x---lora-modem - - For full API reference, see the GitHub Pages - https://jgromes.github.io/RadioLib/ -*/ - -// include the library -#include - -// LLCC68 has the following connections: -// NSS pin: 10 -// DIO1 pin: 2 -// NRST pin: 3 -// BUSY pin: 9 -LLCC68 radio = new Module(10, 2, 3, 9); - -// or detect the pinout automatically using RadioBoards -// https://github.com/radiolib-org/RadioBoards -/* -#define RADIO_BOARD_AUTO -#include -Radio radio = new RadioModule(); -*/ - -void setup() { - Serial.begin(9600); - - // initialize LLCC68 with default settings - Serial.print(F("[LLCC68] Initializing ... ")); - int state = radio.begin(); - if (state == RADIOLIB_ERR_NONE) { - Serial.println(F("success!")); - } else { - Serial.print(F("failed, code ")); - Serial.println(state); - while (true) { delay(10); } - } - - // some modules have an external RF switch - // controlled via two pins (RX enable, TX enable) - // to enable automatic control of the switch, - // call the following method - // RX enable: 4 - // TX enable: 5 - /* - radio.setRfSwitchPins(4, 5); - */ -} - -// counter to keep track of transmitted packets -int count = 0; - -void loop() { - Serial.print(F("[LLCC68] Transmitting packet ... ")); - - // you can transmit C-string or Arduino string up to - // 256 characters long - String str = "Hello World! #" + String(count++); - int state = radio.transmit(str); - - // you can also transmit byte array up to 256 bytes long - /* - byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF}; - int state = radio.transmit(byteArr, 8); - */ - - if (state == RADIOLIB_ERR_NONE) { - // the packet was successfully transmitted - Serial.println(F("success!")); - - // print measured data rate - Serial.print(F("[LLCC68] Datarate:\t")); - Serial.print(radio.getDataRate()); - Serial.println(F(" bps")); - - } else if (state == RADIOLIB_ERR_PACKET_TOO_LONG) { - // the supplied packet was longer than 256 bytes - Serial.println(F("too long!")); - - } else if (state == RADIOLIB_ERR_TX_TIMEOUT) { - // timeout occured while transmitting packet - Serial.println(F("timeout!")); - - } else { - // some other error occurred - Serial.print(F("failed, code ")); - Serial.println(state); - - } - - // wait for a second before transmitting again - delay(1000); -} diff --git a/src/modules/LLCC68/LLCC68.cpp b/src/modules/LLCC68/LLCC68.cpp index 12de7a52..834f5eda 100644 --- a/src/modules/LLCC68/LLCC68.cpp +++ b/src/modules/LLCC68/LLCC68.cpp @@ -9,6 +9,13 @@ LLCC68::LLCC68(Module* mod) : SX1262(mod) { int16_t LLCC68::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t pwr, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { // execute common part int16_t state = SX126x::begin(cr, syncWord, preambleLength, tcxoVoltage, useRegulatorLDO); + if(state == RADIOLIB_ERR_CHIP_NOT_FOUND) { + // bit of a hack, but some LLCC68 chips report as "SX1261", try that + // for full discussion, see https://github.com/jgromes/RadioLib/issues/1329 + chipType = RADIOLIB_SX1261_CHIP_TYPE; + state = SX126x::begin(cr, syncWord, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_DEBUG_PRINTLN("LLCC68 version string not found, using SX1261 instead"); + } RADIOLIB_ASSERT(state); // configure publicly accessible settings diff --git a/src/modules/LLCC68/LLCC68.h b/src/modules/LLCC68/LLCC68.h index a0b6d19e..7809c56c 100644 --- a/src/modules/LLCC68/LLCC68.h +++ b/src/modules/LLCC68/LLCC68.h @@ -7,6 +7,7 @@ #include "../../Module.h" #include "../SX126x/SX1262.h" +#include "../SX126x/SX1261.h" //RADIOLIB_SX126X_REG_VERSION_STRING #define RADIOLIB_LLCC68_CHIP_TYPE "LLCC68"