mirror of
https://github.com/sandeepmistry/arduino-LoRa.git
synced 2025-04-20 23:47:47 +03:00
Add more API's to control radio parameters
This commit is contained in:
parent
048d6e982c
commit
199072565f
@ -33,6 +33,15 @@ receive KEYWORD2
|
|||||||
idle KEYWORD2
|
idle KEYWORD2
|
||||||
sleep KEYWORD2
|
sleep KEYWORD2
|
||||||
|
|
||||||
|
setTxPower KEYWORD2
|
||||||
|
setSpreadingFactor KEYWORD2
|
||||||
|
setSignalBandwidth KEYWORD2
|
||||||
|
setCodingRate4 KEYWORD2
|
||||||
|
setPreambleLength KEYWORD2
|
||||||
|
setSyncWord KEYWORD2
|
||||||
|
crc KEYWORD2
|
||||||
|
noCrc KEYWORD2
|
||||||
|
|
||||||
setPins KEYWORD2
|
setPins KEYWORD2
|
||||||
dumpRegisters KEYWORD2
|
dumpRegisters KEYWORD2
|
||||||
|
|
||||||
|
127
src/LoRa.cpp
127
src/LoRa.cpp
@ -14,7 +14,14 @@
|
|||||||
#define REG_IRQ_FLAGS 0x12
|
#define REG_IRQ_FLAGS 0x12
|
||||||
#define REG_RX_NB_BYTES 0x13
|
#define REG_RX_NB_BYTES 0x13
|
||||||
#define REG_PKT_RSSI_VALUE 0x1a
|
#define REG_PKT_RSSI_VALUE 0x1a
|
||||||
|
#define REG_MODEM_CONFIG_1 0x1d
|
||||||
|
#define REG_MODEM_CONFIG_2 0x1e
|
||||||
|
#define REG_PREAMBLE_MSB 0x20
|
||||||
|
#define REG_PREAMBLE_LSB 0x21
|
||||||
#define REG_PAYLOAD_LENGTH 0x22
|
#define REG_PAYLOAD_LENGTH 0x22
|
||||||
|
#define REG_DETECTION_OPTIMIZE 0x31
|
||||||
|
#define REG_DETECTION_THRESHOLD 0x37
|
||||||
|
#define REG_SYNC_WORD 0x39
|
||||||
#define REG_DIO_MAPPING_1 0x40
|
#define REG_DIO_MAPPING_1 0x40
|
||||||
#define REG_VERSION 0x42
|
#define REG_VERSION 0x42
|
||||||
|
|
||||||
@ -30,8 +37,9 @@
|
|||||||
#define PA_BOOST 0x80
|
#define PA_BOOST 0x80
|
||||||
|
|
||||||
// IRQ masks
|
// IRQ masks
|
||||||
#define IRQ_TX_DONE_MASK 0x08
|
#define IRQ_TX_DONE_MASK 0x08
|
||||||
#define IRQ_RX_DONE_MASK 0x40
|
#define IRQ_PAYLOAD_CRC_ERROR_MASK 0x20
|
||||||
|
#define IRQ_RX_DONE_MASK 0x40
|
||||||
|
|
||||||
#define MAX_PKT_LENGTH 255
|
#define MAX_PKT_LENGTH 255
|
||||||
|
|
||||||
@ -135,7 +143,7 @@ int LoRaClass::parsePacket()
|
|||||||
// clear IRQ's
|
// clear IRQ's
|
||||||
writeRegister(REG_IRQ_FLAGS, irqFlags);
|
writeRegister(REG_IRQ_FLAGS, irqFlags);
|
||||||
|
|
||||||
if (irqFlags & IRQ_RX_DONE_MASK) {
|
if ((irqFlags & IRQ_RX_DONE_MASK) && (irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0) {
|
||||||
// received a packet
|
// received a packet
|
||||||
_packetIndex = 0;
|
_packetIndex = 0;
|
||||||
|
|
||||||
@ -256,6 +264,95 @@ void LoRaClass::sleep()
|
|||||||
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
|
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoRaClass::setTxPower(int level)
|
||||||
|
{
|
||||||
|
if (level < 2) {
|
||||||
|
level = 2;
|
||||||
|
} else if (level > 17) {
|
||||||
|
level = 17;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::setSpreadingFactor(int sf)
|
||||||
|
{
|
||||||
|
if (sf < 7) {
|
||||||
|
sf = 7;
|
||||||
|
} else if (sf > 12) {
|
||||||
|
sf = 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
|
||||||
|
writeRegister(REG_DETECTION_OPTIMIZE, 0xc3);
|
||||||
|
writeRegister(REG_DETECTION_THRESHOLD, 0x0a);
|
||||||
|
|
||||||
|
writeRegister(REG_MODEM_CONFIG_2, (readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::setSignalBandwidth(long sbw)
|
||||||
|
{
|
||||||
|
int bw;
|
||||||
|
|
||||||
|
if (sbw <= 7.8E3) {
|
||||||
|
bw = 0;
|
||||||
|
} else if (sbw <= 10.4E3) {
|
||||||
|
bw = 1;
|
||||||
|
} else if (sbw <= 15.6E3) {
|
||||||
|
bw = 2;
|
||||||
|
} else if (sbw <= 20.8E3) {
|
||||||
|
bw = 3;
|
||||||
|
} else if (sbw <= 31.25E3) {
|
||||||
|
bw = 4;
|
||||||
|
} else if (sbw <= 41.7E3) {
|
||||||
|
bw = 5;
|
||||||
|
} else if (sbw <= 62.5E3) {
|
||||||
|
bw = 6;
|
||||||
|
} else if (sbw <= 125E3) {
|
||||||
|
bw = 7;
|
||||||
|
} else if (sbw <= 250E3) {
|
||||||
|
bw = 8;
|
||||||
|
} else /*if (sbw <= 250E3)*/ {
|
||||||
|
bw = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0x0f) | (bw << 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::setCodingRate4(int denominator)
|
||||||
|
{
|
||||||
|
if (denominator < 5) {
|
||||||
|
denominator = 5;
|
||||||
|
} else if (denominator > 8) {
|
||||||
|
denominator = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cr = denominator - 4;
|
||||||
|
|
||||||
|
writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0xf1) | (cr << 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::setPreambleLength(unsigned long length)
|
||||||
|
{
|
||||||
|
writeRegister(REG_PREAMBLE_MSB, (uint8_t)(length >> 8));
|
||||||
|
writeRegister(REG_PREAMBLE_LSB, (uint8_t)(length >> 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::setSyncWord(int sw)
|
||||||
|
{
|
||||||
|
writeRegister(REG_SYNC_WORD, sw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::crc()
|
||||||
|
{
|
||||||
|
writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) | 0x04);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoRaClass::noCrc()
|
||||||
|
{
|
||||||
|
writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb);
|
||||||
|
}
|
||||||
|
|
||||||
void LoRaClass::setPins(int ss, int reset, int dio0)
|
void LoRaClass::setPins(int ss, int reset, int dio0)
|
||||||
{
|
{
|
||||||
_ss = ss;
|
_ss = ss;
|
||||||
@ -280,21 +377,23 @@ void LoRaClass::handleDio0Rise()
|
|||||||
// clear IRQ's
|
// clear IRQ's
|
||||||
writeRegister(REG_IRQ_FLAGS, irqFlags);
|
writeRegister(REG_IRQ_FLAGS, irqFlags);
|
||||||
|
|
||||||
// received a packet
|
if ((irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0) {
|
||||||
_packetIndex = 0;
|
// received a packet
|
||||||
|
_packetIndex = 0;
|
||||||
|
|
||||||
// read packet length
|
// read packet length
|
||||||
int packetLength = readRegister(REG_RX_NB_BYTES);
|
int 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));
|
||||||
|
|
||||||
if (_onReceive) {
|
if (_onReceive) {
|
||||||
_onReceive(packetLength);
|
_onReceive(packetLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset FIFO address
|
||||||
|
writeRegister(REG_FIFO_ADDR_PTR, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset FIFO address
|
|
||||||
writeRegister(REG_FIFO_ADDR_PTR, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t LoRaClass::readRegister(uint8_t address)
|
uint8_t LoRaClass::readRegister(uint8_t address)
|
||||||
|
@ -37,6 +37,15 @@ public:
|
|||||||
void idle();
|
void idle();
|
||||||
void sleep();
|
void sleep();
|
||||||
|
|
||||||
|
void setTxPower(int level);
|
||||||
|
void setSpreadingFactor(int sf);
|
||||||
|
void setSignalBandwidth(long sbw);
|
||||||
|
void setCodingRate4(int denominator);
|
||||||
|
void setPreambleLength(unsigned long length);
|
||||||
|
void setSyncWord(int sw);
|
||||||
|
void crc();
|
||||||
|
void noCrc();
|
||||||
|
|
||||||
void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN);
|
void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN);
|
||||||
|
|
||||||
void dumpRegisters(Stream& out);
|
void dumpRegisters(Stream& out);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user