From 49d023379f8c3c35bab1e5c6c779f1d0f3a77fb4 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 16 Jan 2025 23:01:46 +0100 Subject: [PATCH] Work around for SX1280 modem RSSI status latch on invalid preamble lengths --- sx128x.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/sx128x.cpp b/sx128x.cpp index a77920b..301dd0d 100644 --- a/sx128x.cpp +++ b/sx128x.cpp @@ -86,6 +86,11 @@ extern SPIClass SPI; #define MAX_PKT_LENGTH 255 +// #define PIN_PREAMBLE 38 +// #define PIN_HEADER 16 +// #define PIN_CAD 15 +// #define PIN_TRIG 39 + sx128x::sx128x() : _spiSettings(8E6, MSBFIRST, SPI_MODE0), _ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN), _rxen(pin_rxen), _busy(LORA_DEFAULT_BUSY_PIN), _txen(pin_txen), @@ -129,6 +134,12 @@ void sx128x::handleDio0Rise() { } bool sx128x::preInit() { + // pinMode(PIN_PREAMBLE, OUTPUT); + // pinMode(PIN_HEADER, OUTPUT); + // pinMode(PIN_CAD, OUTPUT); + // pinMode(PIN_TRIG, OUTPUT); + ////////////////////////// + pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); @@ -402,29 +413,53 @@ int sx128x::endPacket() { } unsigned long preamble_detected_at = 0; -unsigned long header_detected_at = 0; extern long lora_preamble_time_ms; extern long lora_header_time_ms; +bool false_preamble_detected = false; bool sx128x::dcd() { + bool preamble_detected = false; + bool header_detected = false; bool carrier_detected = false; + bool trig = false; uint8_t buf[2] = {0}; executeOpcodeRead(OP_GET_IRQ_STATUS_8X, buf, 2); + uint32_t header_detect_max_time = lora_preamble_time_ms + lora_header_time_ms; + uint32_t now = millis(); + + if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) { + preamble_detected = false; + header_detected = true; + carrier_detected = true; + } else { + header_detected = false; + } if ((buf[0] & IRQ_PREAMBLE_DET_MASK_8X) != 0) { carrier_detected = true; - if (preamble_detected_at == 0) preamble_detected_at = millis(); - if (millis() - preamble_detected_at > lora_preamble_time_ms + lora_header_time_ms) { + if (preamble_detected_at == 0) { preamble_detected_at = now; } + if (now - preamble_detected_at > header_detect_max_time) { + preamble_detected = false; preamble_detected_at = 0; - uint8_t clearbuf[2] = {0}; + + if (!header_detected) { false_preamble_detected = true; } + + uint8_t clearbuf[2] = {0}; clearbuf[0] = IRQ_PREAMBLE_DET_MASK_8X; executeOpcode(OP_CLEAR_IRQ_STATUS_8X, clearbuf, 2); + digitalWrite(PIN_PREAMBLE, LOW); + + } else { + if (!header_detected) { preamble_detected = true; } + else { preamble_detected = false; } } } - if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) { - carrier_detected = true; - header_detected_at = millis(); - } + // if (carrier_detected || preamble_detected || header_detected) { trig = true; } + // if (trig) { digitalWrite(PIN_TRIG, HIGH); } else { digitalWrite(PIN_TRIG, LOW); } + // if (preamble_detected) { digitalWrite(PIN_PREAMBLE, HIGH); } else { digitalWrite(PIN_PREAMBLE, LOW); } + // if (header_detected) { digitalWrite(PIN_HEADER, HIGH); } else { digitalWrite(PIN_HEADER, LOW); } + // if (false_preamble_detected) { digitalWrite(PIN_CAD, HIGH); } else { digitalWrite(PIN_CAD, LOW); } + if (false_preamble_detected) { sx128x_modem.receive(); false_preamble_detected = false; } return carrier_detected; }