1
0
mirror of https://github.com/sandeepmistry/arduino-LoRa.git synced 2025-04-19 13:02:14 +03:00

Add support for implicit header mode and SF 6

This commit is contained in:
Sandeep Mistry 2016-10-22 14:33:27 -04:00
parent 9b19623a1c
commit 8aa75b10a3
2 changed files with 62 additions and 13 deletions

View File

@ -51,6 +51,7 @@ LoRaClass::LoRaClass() :
_ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN), _ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN),
_frequency(0), _frequency(0),
_packetIndex(0), _packetIndex(0),
_implicitHeaderMode(0),
_onReceive(NULL) _onReceive(NULL)
{ {
} }
@ -110,11 +111,17 @@ void LoRaClass::end()
SPI.end(); SPI.end();
} }
int LoRaClass::beginPacket() int LoRaClass::beginPacket(bool implicitHeader)
{ {
// put in standby mode // put in standby mode
idle(); idle();
if (implicitHeader) {
implicitHeaderMode();
} else {
explicitHeaderMode();
}
// reset FIFO address and paload length // reset FIFO address and paload length
writeRegister(REG_FIFO_ADDR_PTR, 0); writeRegister(REG_FIFO_ADDR_PTR, 0);
writeRegister(REG_PAYLOAD_LENGTH, 0); writeRegister(REG_PAYLOAD_LENGTH, 0);
@ -136,11 +143,19 @@ int LoRaClass::endPacket()
return 1; return 1;
} }
int LoRaClass::parsePacket() int LoRaClass::parsePacket(int size)
{ {
int packetLength = 0; int packetLength = 0;
int irqFlags = readRegister(REG_IRQ_FLAGS); int irqFlags = readRegister(REG_IRQ_FLAGS);
if (size > 0) {
implicitHeaderMode();
writeRegister(REG_PAYLOAD_LENGTH, size & 0xff);
} else {
explicitHeaderMode();
}
// clear IRQ's // clear IRQ's
writeRegister(REG_IRQ_FLAGS, irqFlags); writeRegister(REG_IRQ_FLAGS, irqFlags);
@ -149,7 +164,11 @@ int LoRaClass::parsePacket()
_packetIndex = 0; _packetIndex = 0;
// read packet length // read packet length
packetLength = readRegister(REG_RX_NB_BYTES); if (_implicitHeaderMode) {
packetLength = readRegister(REG_PAYLOAD_LENGTH);
} else {
packetLength = readRegister(REG_RX_NB_BYTES);
}
// set FIFO address to current RX address // set FIFO address to current RX address
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR)); writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));
@ -255,8 +274,16 @@ void LoRaClass::onReceive(void(*callback)(int))
} }
} }
void LoRaClass::receive() void LoRaClass::receive(int size)
{ {
if (size > 0) {
implicitHeaderMode();
writeRegister(REG_PAYLOAD_LENGTH, size & 0xff);
} else {
explicitHeaderMode();
}
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS); writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
} }
@ -299,15 +326,19 @@ void LoRaClass::setTxPower(int level)
void LoRaClass::setSpreadingFactor(int sf) void LoRaClass::setSpreadingFactor(int sf)
{ {
if (sf < 7) { if (sf < 6) {
sf = 7; sf = 6;
} else if (sf > 12) { } else if (sf > 12) {
sf = 12; sf = 12;
} }
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe); if (sf == 6) {
writeRegister(REG_DETECTION_OPTIMIZE, 0xc3); writeRegister(REG_DETECTION_OPTIMIZE, 0xc5);
writeRegister(REG_DETECTION_THRESHOLD, 0x0a); writeRegister(REG_DETECTION_THRESHOLD, 0x0c);
} else {
writeRegister(REG_DETECTION_OPTIMIZE, 0xc3);
writeRegister(REG_DETECTION_THRESHOLD, 0x0a);
}
writeRegister(REG_MODEM_CONFIG_2, (readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0)); writeRegister(REG_MODEM_CONFIG_2, (readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0));
} }
@ -392,6 +423,20 @@ void LoRaClass::dumpRegisters(Stream& out)
} }
} }
void LoRaClass::explicitHeaderMode()
{
_implicitHeaderMode = 0;
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
}
void LoRaClass::implicitHeaderMode()
{
_implicitHeaderMode = 1;
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) | 0x01);
}
void LoRaClass::handleDio0Rise() void LoRaClass::handleDio0Rise()
{ {
int irqFlags = readRegister(REG_IRQ_FLAGS); int irqFlags = readRegister(REG_IRQ_FLAGS);
@ -404,7 +449,7 @@ void LoRaClass::handleDio0Rise()
_packetIndex = 0; _packetIndex = 0;
// read packet length // read packet length
int packetLength = readRegister(REG_RX_NB_BYTES); int packetLength = _implicitHeaderMode ? readRegister(REG_PAYLOAD_LENGTH) : readRegister(REG_RX_NB_BYTES);
// set FIFO address to current RX address // set FIFO address to current RX address
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR)); writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));

View File

@ -15,10 +15,10 @@ public:
int begin(long frequency); int begin(long frequency);
void end(); void end();
int beginPacket(); int beginPacket(bool implicitHeader = false);
int endPacket(); int endPacket();
int parsePacket(); int parsePacket(int size = 0);
int packetRssi(); int packetRssi();
float packetSnr(); float packetSnr();
@ -34,7 +34,7 @@ public:
void onReceive(void(*callback)(int)); void onReceive(void(*callback)(int));
void receive(); void receive(int size = 0);
void idle(); void idle();
void sleep(); void sleep();
@ -55,6 +55,9 @@ public:
void dumpRegisters(Stream& out); void dumpRegisters(Stream& out);
private: private:
void explicitHeaderMode();
void implicitHeaderMode();
void handleDio0Rise(); void handleDio0Rise();
uint8_t readRegister(uint8_t address); uint8_t readRegister(uint8_t address);
@ -70,6 +73,7 @@ private:
int _dio0; int _dio0;
int _frequency; int _frequency;
int _packetIndex; int _packetIndex;
int _implicitHeaderMode;
void (*_onReceive)(int); void (*_onReceive)(int);
}; };