[LR11x0] Added basic LR11x0 support (#679)
This commit is contained in:
parent
e7da14421d
commit
77ed4452ae
10 changed files with 3926 additions and 0 deletions
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
RadioLib LR11x0 Blocking Receive Example
|
||||||
|
|
||||||
|
This example listens for LoRa transmissions using LR11x0 Lora modules.
|
||||||
|
To successfully receive data, the following settings have to be the same
|
||||||
|
on both transmitter and receiver:
|
||||||
|
- carrier frequency
|
||||||
|
- bandwidth
|
||||||
|
- spreading factor
|
||||||
|
- coding rate
|
||||||
|
- sync word
|
||||||
|
- preamble length
|
||||||
|
|
||||||
|
Other modules from LR11x0 family can also be used.
|
||||||
|
|
||||||
|
Using blocking receive is not recommended, as it will lead
|
||||||
|
to significant amount of timeouts, inefficient use of processor
|
||||||
|
time and can some miss packets!
|
||||||
|
Instead, interrupt receive is recommended.
|
||||||
|
|
||||||
|
For default module settings, see the wiki page
|
||||||
|
https://github.com/jgromes/RadioLib/wiki/Default-configuration#lr11x0---lora-modem
|
||||||
|
|
||||||
|
For full API reference, see the GitHub Pages
|
||||||
|
https://jgromes.github.io/RadioLib/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// include the library
|
||||||
|
#include <RadioLib.h>
|
||||||
|
|
||||||
|
// LR1110 has the following connections:
|
||||||
|
// NSS pin: 10
|
||||||
|
// DIO1 pin: 2
|
||||||
|
// NRST pin: 3
|
||||||
|
// BUSY pin: 9
|
||||||
|
LR1110 radio = new Module(10, 2, 3, 9);
|
||||||
|
|
||||||
|
// or using RadioShield
|
||||||
|
// https://github.com/jgromes/RadioShield
|
||||||
|
//LR1110 radio = RadioShield.ModuleA;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// initialize LR1110 with default settings
|
||||||
|
Serial.print(F("[LR1110] Initializing ... "));
|
||||||
|
int state = radio.begin();
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Serial.print(F("[LR1110] Waiting for incoming transmission ... "));
|
||||||
|
|
||||||
|
// you can receive data as an Arduino String
|
||||||
|
String str;
|
||||||
|
int state = radio.receive(str);
|
||||||
|
|
||||||
|
// you can also receive data as byte array
|
||||||
|
/*
|
||||||
|
byte byteArr[8];
|
||||||
|
int state = radio.receive(byteArr, 8);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
// packet was successfully received
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
|
||||||
|
// print the data of the packet
|
||||||
|
Serial.print(F("[LR1110] Data:\t\t"));
|
||||||
|
Serial.println(str);
|
||||||
|
|
||||||
|
// print the RSSI (Received Signal Strength Indicator)
|
||||||
|
// of the last received packet
|
||||||
|
Serial.print(F("[LR1110] RSSI:\t\t"));
|
||||||
|
Serial.print(radio.getRSSI());
|
||||||
|
Serial.println(F(" dBm"));
|
||||||
|
|
||||||
|
// print the SNR (Signal-to-Noise Ratio)
|
||||||
|
// of the last received packet
|
||||||
|
Serial.print(F("[LR1110] SNR:\t\t"));
|
||||||
|
Serial.print(radio.getSNR());
|
||||||
|
Serial.println(F(" dB"));
|
||||||
|
|
||||||
|
} else if (state == RADIOLIB_ERR_RX_TIMEOUT) {
|
||||||
|
// timeout occurred while waiting for a packet
|
||||||
|
Serial.println(F("timeout!"));
|
||||||
|
|
||||||
|
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
|
||||||
|
// packet was received, but is malformed
|
||||||
|
Serial.println(F("CRC error!"));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// some other error occurred
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
RadioLib LR11x0 Receive with Interrupts Example
|
||||||
|
|
||||||
|
This example listens for LoRa transmissions and tries to
|
||||||
|
receive them. Once a packet is received, an interrupt is
|
||||||
|
triggered. To successfully receive data, the following
|
||||||
|
settings have to be the same on both transmitter
|
||||||
|
and receiver:
|
||||||
|
- carrier frequency
|
||||||
|
- bandwidth
|
||||||
|
- spreading factor
|
||||||
|
- coding rate
|
||||||
|
- sync word
|
||||||
|
|
||||||
|
Other modules from LR11x0 family can also be used.
|
||||||
|
|
||||||
|
For default module settings, see the wiki page
|
||||||
|
https://github.com/jgromes/RadioLib/wiki/Default-configuration#lr11x0---lora-modem
|
||||||
|
|
||||||
|
For full API reference, see the GitHub Pages
|
||||||
|
https://jgromes.github.io/RadioLib/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// include the library
|
||||||
|
#include <RadioLib.h>
|
||||||
|
|
||||||
|
// LR1110 has the following connections:
|
||||||
|
// NSS pin: 10
|
||||||
|
// DIO1 pin: 2
|
||||||
|
// NRST pin: 3
|
||||||
|
// BUSY pin: 9
|
||||||
|
LR1110 radio = new Module(10, 2, 3, 9);
|
||||||
|
|
||||||
|
// or using RadioShield
|
||||||
|
// https://github.com/jgromes/RadioShield
|
||||||
|
//LR1110 radio = RadioShield.ModuleA;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// initialize LR1110 with default settings
|
||||||
|
Serial.print(F("[LR1110] Initializing ... "));
|
||||||
|
int state = radio.begin();
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the function that will be called
|
||||||
|
// when new packet is received
|
||||||
|
radio.setPacketReceivedAction(setFlag);
|
||||||
|
|
||||||
|
// start listening for LoRa packets
|
||||||
|
Serial.print(F("[LR1110] Starting to listen ... "));
|
||||||
|
state = radio.startReceive();
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if needed, 'listen' mode can be disabled by calling
|
||||||
|
// any of the following methods:
|
||||||
|
//
|
||||||
|
// radio.standby()
|
||||||
|
// radio.sleep()
|
||||||
|
// radio.transmit();
|
||||||
|
// radio.receive();
|
||||||
|
// radio.scanChannel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// flag to indicate that a packet was received
|
||||||
|
volatile bool receivedFlag = false;
|
||||||
|
|
||||||
|
// this function is called when a complete packet
|
||||||
|
// is received by the module
|
||||||
|
// IMPORTANT: this function MUST be 'void' type
|
||||||
|
// and MUST NOT have any arguments!
|
||||||
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
|
ICACHE_RAM_ATTR
|
||||||
|
#endif
|
||||||
|
void setFlag(void) {
|
||||||
|
// we got a packet, set the flag
|
||||||
|
receivedFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// check if the flag is set
|
||||||
|
if(receivedFlag) {
|
||||||
|
// reset flag
|
||||||
|
receivedFlag = false;
|
||||||
|
|
||||||
|
// you can read received data as an Arduino String
|
||||||
|
String str;
|
||||||
|
int state = radio.readData(str);
|
||||||
|
|
||||||
|
// you can also read received data as byte array
|
||||||
|
/*
|
||||||
|
byte byteArr[8];
|
||||||
|
int numBytes = radio.getPacketLength();
|
||||||
|
int state = radio.readData(byteArr, numBytes);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
// packet was successfully received
|
||||||
|
Serial.println(F("[LR1110] Received packet!"));
|
||||||
|
|
||||||
|
// print data of the packet
|
||||||
|
Serial.print(F("[LR1110] Data:\t\t"));
|
||||||
|
Serial.println(str);
|
||||||
|
|
||||||
|
// print RSSI (Received Signal Strength Indicator)
|
||||||
|
Serial.print(F("[LR1110] RSSI:\t\t"));
|
||||||
|
Serial.print(radio.getRSSI());
|
||||||
|
Serial.println(F(" dBm"));
|
||||||
|
|
||||||
|
// print SNR (Signal-to-Noise Ratio)
|
||||||
|
Serial.print(F("[LR1110] SNR:\t\t"));
|
||||||
|
Serial.print(radio.getSNR());
|
||||||
|
Serial.println(F(" dB"));
|
||||||
|
|
||||||
|
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
|
||||||
|
// packet was received, but is malformed
|
||||||
|
Serial.println(F("CRC error!"));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// some other error occurred
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
RadioLib LR11x0 Blocking Transmit Example
|
||||||
|
|
||||||
|
This example transmits packets using LR1110 LoRa radio module.
|
||||||
|
Each packet contains up to 256 bytes of data, in the form of:
|
||||||
|
- Arduino String
|
||||||
|
- null-terminated char array (C-string)
|
||||||
|
- arbitrary binary data (byte array)
|
||||||
|
|
||||||
|
Other modules from LR11x0 family can also be used.
|
||||||
|
|
||||||
|
For default module settings, see the wiki page
|
||||||
|
https://github.com/jgromes/RadioLib/wiki/Default-configuration#lr11x0---lora-modem
|
||||||
|
|
||||||
|
For full API reference, see the GitHub Pages
|
||||||
|
https://jgromes.github.io/RadioLib/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// include the library
|
||||||
|
#include <RadioLib.h>
|
||||||
|
|
||||||
|
// LR1110 has the following connections:
|
||||||
|
// NSS pin: 10
|
||||||
|
// DIO1 pin: 2
|
||||||
|
// NRST pin: 3
|
||||||
|
// BUSY pin: 9
|
||||||
|
LR1110 radio = new Module(10, 2, 3, 9);
|
||||||
|
|
||||||
|
// or using RadioShield
|
||||||
|
// https://github.com/jgromes/RadioShield
|
||||||
|
//LR1110 radio = RadioShield.ModuleA;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// initialize LR1110 with default settings
|
||||||
|
Serial.print(F("[LR1110] Initializing ... "));
|
||||||
|
int state = radio.begin();
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
delay(1000);
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// some modules have an external RF switch
|
||||||
|
|
||||||
|
// controlled via two pins (RX enable, TX enable)
|
||||||
|
// to enable automatic control of the switch,
|
||||||
|
// call the following method
|
||||||
|
// RX enable: 4
|
||||||
|
// TX enable: 5
|
||||||
|
/*
|
||||||
|
radio.setRfSwitchPins(4, 5);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// counter to keep track of transmitted packets
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Serial.print(F("[LR1110] Transmitting packet ... "));
|
||||||
|
|
||||||
|
// you can transmit C-string or Arduino string up to
|
||||||
|
// 256 characters long
|
||||||
|
// NOTE: transmit() is a blocking method!
|
||||||
|
// See example LR11x0_Transmit_Interrupt for details
|
||||||
|
// on non-blocking transmission method.
|
||||||
|
String str = "Hello World! #" + String(count++);
|
||||||
|
int state = radio.transmit(str);
|
||||||
|
|
||||||
|
// you can also transmit byte array up to 256 bytes long
|
||||||
|
/*
|
||||||
|
byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF};
|
||||||
|
int state = radio.transmit(byteArr, 8);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
// the packet was successfully transmitted
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
|
||||||
|
// print measured data rate
|
||||||
|
Serial.print(F("[LR1110] Datarate:\t"));
|
||||||
|
Serial.print(radio.getDataRate());
|
||||||
|
Serial.println(F(" bps"));
|
||||||
|
|
||||||
|
} else if (state == RADIOLIB_ERR_PACKET_TOO_LONG) {
|
||||||
|
// the supplied packet was longer than 256 bytes
|
||||||
|
Serial.println(F("too long!"));
|
||||||
|
|
||||||
|
} else if (state == RADIOLIB_ERR_TX_TIMEOUT) {
|
||||||
|
// timeout occured while transmitting packet
|
||||||
|
Serial.println(F("timeout!"));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// some other error occurred
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait for a second before transmitting again
|
||||||
|
delay(1000);
|
||||||
|
}
|
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
RadioLib LR11x0 Transmit with Interrupts Example
|
||||||
|
|
||||||
|
This example transmits LoRa packets with one second delays
|
||||||
|
between them. Each packet contains up to 256 bytes
|
||||||
|
of data, in the form of:
|
||||||
|
- Arduino String
|
||||||
|
- null-terminated char array (C-string)
|
||||||
|
- arbitrary binary data (byte array)
|
||||||
|
|
||||||
|
Other modules from LR11x0 family can also be used.
|
||||||
|
|
||||||
|
For default module settings, see the wiki page
|
||||||
|
https://github.com/jgromes/RadioLib/wiki/Default-configuration#lr11x0---lora-modem
|
||||||
|
|
||||||
|
For full API reference, see the GitHub Pages
|
||||||
|
https://jgromes.github.io/RadioLib/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// include the library
|
||||||
|
#include <RadioLib.h>
|
||||||
|
|
||||||
|
// LR1110 has the following connections:
|
||||||
|
// NSS pin: 10
|
||||||
|
// DIO1 pin: 2
|
||||||
|
// NRST pin: 3
|
||||||
|
// BUSY pin: 9
|
||||||
|
LR1110 radio = new Module(10, 2, 3, 9);
|
||||||
|
|
||||||
|
// or using RadioShield
|
||||||
|
// https://github.com/jgromes/RadioShield
|
||||||
|
//LR1110 radio = RadioShield.ModuleA;
|
||||||
|
|
||||||
|
// save transmission state between loops
|
||||||
|
int transmissionState = RADIOLIB_ERR_NONE;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// initialize LR1110 with default settings
|
||||||
|
Serial.print(F("[LR1110] Initializing ... "));
|
||||||
|
int state = radio.begin();
|
||||||
|
if (state == RADIOLIB_ERR_NONE) {
|
||||||
|
Serial.println(F("success!"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(state);
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the function that will be called
|
||||||
|
// when packet transmission is finished
|
||||||
|
radio.setPacketSentAction(setFlag);
|
||||||
|
|
||||||
|
// start transmitting the first packet
|
||||||
|
Serial.print(F("[LR1110] Sending first packet ... "));
|
||||||
|
|
||||||
|
// you can transmit C-string or Arduino string up to
|
||||||
|
// 256 characters long
|
||||||
|
transmissionState = radio.startTransmit("Hello World!");
|
||||||
|
|
||||||
|
// you can also transmit byte array up to 256 bytes long
|
||||||
|
/*
|
||||||
|
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
|
||||||
|
0x89, 0xAB, 0xCD, 0xEF};
|
||||||
|
state = radio.startTransmit(byteArr, 8);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// flag to indicate that a packet was sent
|
||||||
|
volatile bool transmittedFlag = false;
|
||||||
|
|
||||||
|
// this function is called when a complete packet
|
||||||
|
// is transmitted by the module
|
||||||
|
// IMPORTANT: this function MUST be 'void' type
|
||||||
|
// and MUST NOT have any arguments!
|
||||||
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
|
ICACHE_RAM_ATTR
|
||||||
|
#endif
|
||||||
|
void setFlag(void) {
|
||||||
|
// we sent a packet, set the flag
|
||||||
|
transmittedFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// counter to keep track of transmitted packets
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// check if the previous transmission finished
|
||||||
|
if(transmittedFlag) {
|
||||||
|
// reset flag
|
||||||
|
transmittedFlag = false;
|
||||||
|
|
||||||
|
if (transmissionState == RADIOLIB_ERR_NONE) {
|
||||||
|
// packet was successfully sent
|
||||||
|
Serial.println(F("transmission finished!"));
|
||||||
|
|
||||||
|
// NOTE: when using interrupt-driven transmit method,
|
||||||
|
// it is not possible to automatically measure
|
||||||
|
// transmission data rate using getDataRate()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.print(F("failed, code "));
|
||||||
|
Serial.println(transmissionState);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean up after transmission is finished
|
||||||
|
// this will ensure transmitter is disabled,
|
||||||
|
// RF switch is powered down etc.
|
||||||
|
radio.finishTransmit();
|
||||||
|
|
||||||
|
// wait a second before transmitting again
|
||||||
|
delay(1000);
|
||||||
|
|
||||||
|
// send another one
|
||||||
|
Serial.print(F("[LR1110] Sending another packet ... "));
|
||||||
|
|
||||||
|
// you can transmit C-string or Arduino string up to
|
||||||
|
// 256 characters long
|
||||||
|
String str = "Hello World! #" + String(count++);
|
||||||
|
transmissionState = radio.startTransmit(str);
|
||||||
|
|
||||||
|
// you can also transmit byte array up to 256 bytes long
|
||||||
|
/*
|
||||||
|
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
|
||||||
|
0x89, 0xAB, 0xCD, 0xEF};
|
||||||
|
transmissionState = radio.startTransmit(byteArr, 8);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,9 @@ ArduinoHal KEYWORD1
|
||||||
# modules
|
# modules
|
||||||
CC1101 KEYWORD1
|
CC1101 KEYWORD1
|
||||||
LLCC68 KEYWORD1
|
LLCC68 KEYWORD1
|
||||||
|
LR1110 KEYWORD1
|
||||||
|
LR1120 KEYWORD1
|
||||||
|
LR1121 KEYWORD1
|
||||||
nRF24 KEYWORD1
|
nRF24 KEYWORD1
|
||||||
RF69 KEYWORD1
|
RF69 KEYWORD1
|
||||||
RFM22 KEYWORD1
|
RFM22 KEYWORD1
|
||||||
|
|
|
@ -68,6 +68,7 @@
|
||||||
|
|
||||||
#include "modules/CC1101/CC1101.h"
|
#include "modules/CC1101/CC1101.h"
|
||||||
#include "modules/LLCC68/LLCC68.h"
|
#include "modules/LLCC68/LLCC68.h"
|
||||||
|
#include "modules/LR11x0/LR1110.h"
|
||||||
#include "modules/nRF24/nRF24.h"
|
#include "modules/nRF24/nRF24.h"
|
||||||
#include "modules/RF69/RF69.h"
|
#include "modules/RF69/RF69.h"
|
||||||
#include "modules/RFM2x/RFM22.h"
|
#include "modules/RFM2x/RFM22.h"
|
||||||
|
|
75
src/modules/LR11x0/LR1110.cpp
Normal file
75
src/modules/LR11x0/LR1110.cpp
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
#include "LR1110.h"
|
||||||
|
#if !RADIOLIB_EXCLUDE_LR11X0
|
||||||
|
|
||||||
|
LR1110::LR1110(Module* mod) : LR11x0(mod) {
|
||||||
|
chipType = RADIOLIB_LR11X0_HW_LR1110;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t LR1110::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, float tcxoVoltage) {
|
||||||
|
// execute common part
|
||||||
|
int16_t state = LR11x0::begin(bw, sf, cr, syncWord, preambleLength, tcxoVoltage);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// configure publicly accessible settings
|
||||||
|
state = setFrequency(freq);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
state = setOutputPower(power);
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t LR1110::beginGFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, float tcxoVoltage) {
|
||||||
|
// execute common part
|
||||||
|
int16_t state = LR11x0::beginGFSK(br, freqDev, rxBw, preambleLength, tcxoVoltage);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// configure publicly accessible settings
|
||||||
|
state = setFrequency(freq);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
state = setOutputPower(power);
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t LR1110::setFrequency(float freq) {
|
||||||
|
return(this->setFrequency(freq, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t LR1110::setFrequency(float freq, bool calibrate, float band) {
|
||||||
|
RADIOLIB_CHECK_RANGE(freq, 150.0, 960.0, RADIOLIB_ERR_INVALID_FREQUENCY);
|
||||||
|
|
||||||
|
// calibrate image rejection
|
||||||
|
if(calibrate) {
|
||||||
|
int16_t state = LR11x0::calibImage(freq - band, freq + band);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set frequency
|
||||||
|
return(LR11x0::setRfFrequency((uint32_t)(freq*1000000.0f)));
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t LR1110::setOutputPower(int8_t power, bool forceHighPower) {
|
||||||
|
// determine whether to use HP or LP PA and check range accordingly
|
||||||
|
bool useHp = forceHighPower || (power > 14);
|
||||||
|
if(useHp) {
|
||||||
|
RADIOLIB_CHECK_RANGE(power, -9, 22, RADIOLIB_ERR_INVALID_OUTPUT_POWER);
|
||||||
|
useHp = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
RADIOLIB_CHECK_RANGE(power, -17, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER);
|
||||||
|
useHp = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO how and when to configure OCP?
|
||||||
|
|
||||||
|
// update PA config - always use VBAT for high-power PA
|
||||||
|
int16_t state = LR11x0::setPaConfig((uint8_t)useHp, (uint8_t)useHp, 0x04, 0x07);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// set output power
|
||||||
|
state = LR11x0::setTxParams(power, RADIOLIB_LR11X0_PA_RAMP_48U);
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
95
src/modules/LR11x0/LR1110.h
Normal file
95
src/modules/LR11x0/LR1110.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
#if !defined(_RADIOLIB_LR1110_H)
|
||||||
|
#define _RADIOLIB_LR1110_H
|
||||||
|
|
||||||
|
#include "../../TypeDef.h"
|
||||||
|
|
||||||
|
#if !RADIOLIB_EXCLUDE_LR11X0
|
||||||
|
|
||||||
|
#include "../../Module.h"
|
||||||
|
#include "LR11x0.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\class LR1110
|
||||||
|
\brief Derived class for %LR1110 modules.
|
||||||
|
*/
|
||||||
|
class LR1110: public LR11x0 {
|
||||||
|
public:
|
||||||
|
/*!
|
||||||
|
\brief Default constructor.
|
||||||
|
\param mod Instance of Module that will be used to communicate with the radio.
|
||||||
|
*/
|
||||||
|
LR1110(Module* mod);
|
||||||
|
|
||||||
|
// basic methods
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Initialization method for LoRa modem.
|
||||||
|
\param freq Carrier frequency in MHz. Defaults to 434.0 MHz.
|
||||||
|
\param bw LoRa bandwidth in kHz. Defaults to 125.0 kHz.
|
||||||
|
\param sf LoRa spreading factor. Defaults to 9.
|
||||||
|
\param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7).
|
||||||
|
\param syncWord 1-byte LoRa sync word. Defaults to RADIOLIB_LR11X0_LORA_SYNC_WORD_PRIVATE (0x12).
|
||||||
|
\param power Output power in dBm. Defaults to 10 dBm.
|
||||||
|
\param preambleLength LoRa preamble length in symbols. Defaults to 8 symbols.
|
||||||
|
\param tcxoVoltage TCXO reference voltage to be set. Defaults to 1.6 V.
|
||||||
|
If you are seeing -706/-707 error codes, it likely means you are using non-0 value for module with XTAL.
|
||||||
|
To use XTAL, either set this value to 0, or set LR11x0::XTAL to true.
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_LR11X0_LORA_SYNC_WORD_PRIVATE, int8_t power = 10, uint16_t preambleLength = 8, float tcxoVoltage = 1.6);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Initialization method for FSK modem.
|
||||||
|
\param freq Carrier frequency in MHz. Defaults to 434.0 MHz.
|
||||||
|
\param br FSK bit rate in kbps. Defaults to 4.8 kbps.
|
||||||
|
\param freqDev Frequency deviation from carrier frequency in kHz. Defaults to 5.0 kHz.
|
||||||
|
\param rxBw Receiver bandwidth in kHz. Defaults to 156.2 kHz.
|
||||||
|
\param power Output power in dBm. Defaults to 10 dBm.
|
||||||
|
\param preambleLength FSK preamble length in bits. Defaults to 16 bits.
|
||||||
|
\param tcxoVoltage TCXO reference voltage to be set. Defaults to 1.6 V.
|
||||||
|
If you are seeing -706/-707 error codes, it likely means you are using non-0 value for module with XTAL.
|
||||||
|
To use XTAL, either set this value to 0, or set LR11x0::XTAL to true.
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t beginGFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 156.2, int8_t power = 10, uint16_t preambleLength = 16, float tcxoVoltage = 1.6);
|
||||||
|
|
||||||
|
// configuration methods
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz.
|
||||||
|
Will also perform calibrations.
|
||||||
|
\param freq Carrier frequency to be set in MHz.
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t setFrequency(float freq);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz.
|
||||||
|
\param freq Carrier frequency to be set in MHz.
|
||||||
|
\param calibrate Run image calibration.
|
||||||
|
\param band Half bandwidth for image calibration. For example,
|
||||||
|
if carrier is 434 MHz and band is set to 4 MHz, then the image will be calibrate
|
||||||
|
for band 430 - 438 MHz. Unused if calibrate is set to false, defaults to 4 MHz
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t setFrequency(float freq, bool calibrate, float band = 4);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Sets output power. Allowed values are in range from -9 to 22 dBm (high-power PA) or -17 to 14 dBm (low-power PA).
|
||||||
|
\param power Output power to be set in dBm.
|
||||||
|
\param forceHighPower Force using the high-power PA. If set to false, PA will be determined automatically
|
||||||
|
based on configured output power, preferring the low-power PA. If set to true, only high-power PA will be used.
|
||||||
|
Defaults to false.
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t setOutputPower(int8_t power, bool forceHighPower = false);
|
||||||
|
|
||||||
|
#if !RADIOLIB_GODMODE
|
||||||
|
private:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
2255
src/modules/LR11x0/LR11x0.cpp
Normal file
2255
src/modules/LR11x0/LR11x0.cpp
Normal file
File diff suppressed because it is too large
Load diff
1018
src/modules/LR11x0/LR11x0.h
Normal file
1018
src/modules/LR11x0/LR11x0.h
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue