From fe5cdc06dd2bfbd81d1f2e92a822fe0a1446fe9d Mon Sep 17 00:00:00 2001 From: 0xSeren <0xseren@tutamail.com> Date: Thu, 16 Apr 2026 17:39:58 -0400 Subject: [PATCH] fix: enable LoRa CRC on SX127x for RNode interop After reset, SX127x hardware leaves REG_MODEM_CONFIG_2 bit 2 (RxPayloadCrcOn) cleared, and RadioLib's SX127x::begin() does not touch it. Upstream RNode firmware explicitly enables CRC on every LoRa transmit and receive path (sx127x::enableCrc in RNode_Firmware.ino:531, sx127x.cpp:160), so a real RNode will silently drop frames that arrive without a valid CRC. This means T-Beam and LoRa32 V2.1 users running the example LoRaInterface cannot interop with real RNodes over LoRa today: outbound packets are dropped at the RNode, inbound packets may be accepted but silently corrupted. Fix by calling chip->setCRC(true) after SX1276::begin() in the SX127x branch of LoRaInterface::start(). The new call is gated on the prior begin() having succeeded, and its own error is folded into state so the existing RADIOLIB_ERR_NONE check catches it. No change required on the SX126x branches: RadioLib's SX126x::begin() already calls setCRC(2), so RAK4631, Heltec V3, and Heltec V4 inherit CRC-on. --- examples/common/lora_interface/LoRaInterface.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/common/lora_interface/LoRaInterface.cpp b/examples/common/lora_interface/LoRaInterface.cpp index 9cf0279..9d01265 100644 --- a/examples/common/lora_interface/LoRaInterface.cpp +++ b/examples/common/lora_interface/LoRaInterface.cpp @@ -109,6 +109,13 @@ bool LoRaInterface::start() { // begin(freq MHz, bw kHz, sf, cr, syncWord, power dBm, preamble symbols, LNA gain 0=AGC) int state = chip->begin(frequency, bandwidth, spreading, coding, RADIOLIB_SX127X_SYNC_WORD, power, 20, 0); + // SX127x hardware default leaves RxPayloadCrcOn=0 and RadioLib's + // SX127x::begin() does not touch it. Upstream RNode firmware enables + // CRC unconditionally (sx127x::enableCrc, RNode_Firmware.ino:531), so + // real RNodes silently drop frames without a CRC. Enable it here to + // interoperate. SX126x branches below inherit CRC-on from + // SX126x::begin() (setCRC(2)), so no explicit call is needed there. + if (state == RADIOLIB_ERR_NONE) state = chip->setCRC(true); #elif defined(BOARD_RAK4631) // nRF52: SPI pins must be configured before SPI.begin()