From 729a4099e5c51701dea5d9a75d4ddd6a21eccf7a Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Wed, 8 Jan 2025 22:16:07 +0100 Subject: [PATCH] Correct invalid IRQ index for SX1280 --- sx128x.cpp | 49 +++++++++++++++++++++++++++++++++++++++++-------- sx128x.h | 2 +- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/sx128x.cpp b/sx128x.cpp index 3c86990..a17624a 100644 --- a/sx128x.cpp +++ b/sx128x.cpp @@ -1,6 +1,14 @@ // Copyright Sandeep Mistry, Mark Qvist and Jacob Eva. // Licensed under the MIT license. +// TODO: Remove debug +#define PIN_PREAMBLE 16 +#define PIN_HEADER 15 +#define PIN_CAD 18 +#define PIN_DCD 12 +#define PIN_TXSIG 48 +///////////////////////// + #include "Boards.h" #if MODEM == SX1280 @@ -123,19 +131,26 @@ void sx128x::handleDio0Rise() { uint8_t rxbuf[2] = {0}; executeOpcodeRead(OP_RX_BUFFER_STATUS_8X, rxbuf, 2); - // If implicit header mode is enabled, read packet length as payload length instead. + // If implicit header mode is enabled, use pre-set packet length as payload length instead. // See SX1280 datasheet v3.2, page 92 if (_implicitHeaderMode == 0x80) { _rxPacketLength = _payloadLength; } else { _rxPacketLength = rxbuf[0]; } - if (_onReceive) { _onReceive(_rxPacketLength); } + if (_receive_callback) { _receive_callback(_rxPacketLength); } } bool sx128x::preInit() { + // TODO: Remove debug + pinMode(PIN_PREAMBLE, OUTPUT); + pinMode(PIN_HEADER, OUTPUT); + pinMode(PIN_CAD, OUTPUT); + pinMode(PIN_DCD, OUTPUT); + pinMode(PIN_TXSIG, OUTPUT); + ////////////////////// pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); - // todo: check if this change causes issues on any platforms + // TODO: Check if this change causes issues on any platforms #if MCU_VARIANT == MCU_ESP32 #if BOARD_MODEL == BOARD_RNODE_NG_22 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); @@ -146,11 +161,11 @@ bool sx128x::preInit() { SPI.begin(); #endif - // Detect modem (retry for up to 2 seconds) + // Detect modem (retry for up to 500ms) long start = millis(); uint8_t version_msb; uint8_t version_lsb; - while (((millis() - start) < 2000) && (millis() >= start)) { + while (((millis() - start) < 500) && (millis() >= start)) { version_msb = readRegister(REG_FIRM_VER_MSB); version_lsb = readRegister(REG_FIRM_VER_LSB); if ((version_msb == 0xB7 && version_lsb == 0xA9) || (version_msb == 0xB5 && version_lsb == 0xA9)) { break; } @@ -357,6 +372,7 @@ void sx128x::end() { } int sx128x::beginPacket(int implicitHeader) { + digitalWrite(PIN_TXSIG, HIGH); // TODO: Remove debug standby(); if (implicitHeader) { implicitHeaderMode(); } @@ -399,6 +415,8 @@ int sx128x::endPacket() { mask[0] = 0x00; mask[1] = IRQ_TX_DONE_MASK_8X; executeOpcode(OP_CLEAR_IRQ_STATUS_8X, mask, 2); + + digitalWrite(PIN_TXSIG, LOW); // TODO: Remove debug if (timed_out) { return 0; } else { return 1; } @@ -412,20 +430,33 @@ bool sx128x::dcd() { bool carrier_detected = false; uint8_t buf[2] = {0}; executeOpcodeRead(OP_GET_IRQ_STATUS_8X, buf, 2); - if ((buf[1] & IRQ_PREAMBLE_DET_MASK_8X) != 0) { + if ((buf[0] & IRQ_PREAMBLE_DET_MASK_8X) != 0) { + digitalWrite(PIN_PREAMBLE, HIGH); // TODO: Remove debug 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) { preamble_detected_at = 0; uint8_t clearbuf[2] = {0}; - clearbuf[1] = IRQ_PREAMBLE_DET_MASK_8X; + clearbuf[0] = IRQ_PREAMBLE_DET_MASK_8X; executeOpcode(OP_CLEAR_IRQ_STATUS_8X, clearbuf, 2); } + } else { + digitalWrite(PIN_PREAMBLE, LOW); // TODO: Remove debug } if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) { + digitalWrite(PIN_HEADER, HIGH); // TODO: Remove debug carrier_detected = true; header_detected_at = millis(); + } else { + digitalWrite(PIN_HEADER, LOW); // TODO: Remove debug + } + + // TODO: Remove debug + if (carrier_detected) { + digitalWrite(PIN_DCD, HIGH); // TODO: Remove debug + } else { + digitalWrite(PIN_DCD, LOW); // TODO: Remove debug } return carrier_detected; @@ -524,7 +555,7 @@ int sx128x::peek() { void sx128x::onReceive(void(*callback)(int)) { - _onReceive = callback; + _receive_callback = callback; if (callback) { pinMode(_dio0, INPUT); @@ -589,6 +620,8 @@ void sx128x::receive(int size) { // in continuous RX mode. This is documented as Errata 16.1 in // the SX1280 datasheet v3.2 (page 149) // Therefore, the modem is set to single RX mode below instead. + + // uint8_t mode[3] = {0x03, 0xFF, 0xFF}; // Countinuous RX mode uint8_t mode[3] = {0}; // single RX mode executeOpcode(OP_RX_8X, mode, 3); } diff --git a/sx128x.h b/sx128x.h index df15775..ccaeb04 100644 --- a/sx128x.h +++ b/sx128x.h @@ -138,7 +138,7 @@ private: bool _radio_online; int _rxPacketLength; uint32_t _bitrate; - void (*_onReceive)(int); + void (*_receive_callback)(int); }; extern sx128x sx128x_modem;