SX127x - Updated comments

This commit is contained in:
Jan Gromeš 2018-07-11 17:56:26 +02:00
parent 2e85c23cbd
commit 10f32c8b5c
16 changed files with 62 additions and 5 deletions

View file

@ -25,6 +25,13 @@ void setup() {
// initialize SX1278 with default settings // initialize SX1278 with default settings
Serial.print(F("[SX1278] Initializing ... ")); Serial.print(F("[SX1278] Initializing ... "));
// carrier frequency: 434.0 MHz
// bandwidth: 125.0 kHz
// spreading factor: 9
// coding rate: 7
// sync word: 0x12
// output power: 17 dBm
// node address in EEPROM starts at: 0
byte state = lora.begin(); byte state = lora.begin();
if(state == ERR_NONE) { if(state == ERR_NONE) {
Serial.println(F("success!")); Serial.println(F("success!"));

View file

@ -26,6 +26,13 @@ void setup() {
// initialize SX1278 with default settings // initialize SX1278 with default settings
Serial.print(F("[SX1278] Initializing ... ")); Serial.print(F("[SX1278] Initializing ... "));
// carrier frequency: 434.0 MHz
// bandwidth: 125.0 kHz
// spreading factor: 9
// coding rate: 7
// sync word: 0x12
// output power: 17 dBm
// node address in EEPROM starts at: 0
byte state = lora.begin(); byte state = lora.begin();
if(state == ERR_NONE) { if(state == ERR_NONE) {
Serial.println(F("success!")); Serial.println(F("success!"));

View file

@ -52,6 +52,7 @@ uint8_t SX1272::setFrequency(float freq) {
return(ERR_INVALID_FREQUENCY); return(ERR_INVALID_FREQUENCY);
} }
// set frequency and if successful, save the new setting
uint8_t state = SX1272::setFrequencyRaw(freq); uint8_t state = SX1272::setFrequencyRaw(freq);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_freq = freq; SX127x::_freq = freq;
@ -73,6 +74,7 @@ uint8_t SX1272::setBandwidth(float bw) {
return(ERR_INVALID_BANDWIDTH); return(ERR_INVALID_BANDWIDTH);
} }
// set bandwidth and if successful, save the new setting
uint8_t state = SX1272::setBandwidthRaw(newBandwidth); uint8_t state = SX1272::setBandwidthRaw(newBandwidth);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_bw = bw; SX127x::_bw = bw;
@ -111,6 +113,7 @@ uint8_t SX1272::setSpreadingFactor(uint8_t sf) {
return(ERR_INVALID_SPREADING_FACTOR); return(ERR_INVALID_SPREADING_FACTOR);
} }
// set spreading factor and if successful, save the new setting
uint8_t state = SX1272::setSpreadingFactorRaw(newSpreadingFactor); uint8_t state = SX1272::setSpreadingFactorRaw(newSpreadingFactor);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_sf = sf; SX127x::_sf = sf;
@ -140,6 +143,7 @@ uint8_t SX1272::setCodingRate(uint8_t cr) {
return(ERR_INVALID_CODING_RATE); return(ERR_INVALID_CODING_RATE);
} }
// set coding rate and if successful, save the new setting
uint8_t state = SX1272::setCodingRateRaw(newCodingRate); uint8_t state = SX1272::setCodingRateRaw(newCodingRate);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_cr = cr; SX127x::_cr = cr;
@ -149,10 +153,12 @@ uint8_t SX1272::setCodingRate(uint8_t cr) {
} }
uint8_t SX1272::setOutputPower(int8_t power) { uint8_t SX1272::setOutputPower(int8_t power) {
// check allowed power range
if((power < -1) || (power > 20)) { if((power < -1) || (power > 20)) {
return(ERR_INVALID_OUTPUT_POWER); return(ERR_INVALID_OUTPUT_POWER);
} }
// set mode to standby
SX127x::standby(); SX127x::standby();
uint8_t state; uint8_t state;
@ -172,7 +178,8 @@ uint8_t SX1272::setOutputPower(int8_t power) {
state |= _mod->SPIsetRegValue(SX127X_REG_PA_CONFIG, power - 5, 3, 0); state |= _mod->SPIsetRegValue(SX127X_REG_PA_CONFIG, power - 5, 3, 0);
state |= _mod->SPIsetRegValue(SX1272_REG_PA_DAC, SX127X_PA_BOOST_ON, 2, 0); state |= _mod->SPIsetRegValue(SX1272_REG_PA_DAC, SX127X_PA_BOOST_ON, 2, 0);
} }
// configuration successful, save new setting
if(state == ERR_NONE) { if(state == ERR_NONE) {
_power = power; _power = power;
} }

View file

@ -45,10 +45,13 @@
class SX1272: public SX127x { class SX1272: public SX127x {
public: public:
// constructor
SX1272(Module* mod); SX1272(Module* mod);
// basic methods
uint8_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint16_t addrEeprom = 0); uint8_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint16_t addrEeprom = 0);
// configuration methods
uint8_t setFrequency(float freq); uint8_t setFrequency(float freq);
uint8_t setBandwidth(float bw); uint8_t setBandwidth(float bw);
uint8_t setSpreadingFactor(uint8_t sf); uint8_t setSpreadingFactor(uint8_t sf);

View file

@ -25,6 +25,7 @@ uint8_t SX1273::setSpreadingFactor(uint8_t sf) {
return(ERR_INVALID_SPREADING_FACTOR); return(ERR_INVALID_SPREADING_FACTOR);
} }
// set spreading factor and if successful, save the new setting
uint8_t state = setSpreadingFactorRaw(newSpreadingFactor); uint8_t state = setSpreadingFactorRaw(newSpreadingFactor);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_sf = sf; SX127x::_sf = sf;

View file

@ -6,8 +6,10 @@
class SX1273: public SX1272 { class SX1273: public SX1272 {
public: public:
// constructor
SX1273(Module* mod); SX1273(Module* mod);
// configuration methods
uint8_t setSpreadingFactor(uint8_t sf); uint8_t setSpreadingFactor(uint8_t sf);
}; };

View file

@ -10,6 +10,7 @@ uint8_t SX1276::setFrequency(float freq) {
return(ERR_INVALID_FREQUENCY); return(ERR_INVALID_FREQUENCY);
} }
// set frequency and if successful, save the new setting
uint8_t state = SX1278::setFrequencyRaw(freq); uint8_t state = SX1278::setFrequencyRaw(freq);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_freq = freq; SX127x::_freq = freq;

View file

@ -6,8 +6,10 @@
class SX1276: public SX1278 { class SX1276: public SX1278 {
public: public:
// constructor
SX1276(Module* mod); SX1276(Module* mod);
// configuration methods
uint8_t setFrequency(float freq); uint8_t setFrequency(float freq);
}; };

View file

@ -10,6 +10,7 @@ uint8_t SX1277::setFrequency(float freq) {
return(ERR_INVALID_FREQUENCY); return(ERR_INVALID_FREQUENCY);
} }
// set frequency and if successful, save the new setting
uint8_t state = SX1278::setFrequencyRaw(freq); uint8_t state = SX1278::setFrequencyRaw(freq);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_freq = freq; SX127x::_freq = freq;
@ -38,6 +39,7 @@ uint8_t SX1277::setSpreadingFactor(uint8_t sf) {
return(ERR_INVALID_SPREADING_FACTOR); return(ERR_INVALID_SPREADING_FACTOR);
} }
// set spreading factor and if successful, save the new setting
uint8_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor); uint8_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_sf = sf; SX127x::_sf = sf;

View file

@ -6,8 +6,10 @@
class SX1277: public SX1278 { class SX1277: public SX1278 {
public: public:
// constructor
SX1277(Module* mod); SX1277(Module* mod);
// configuration methods
uint8_t setFrequency(float freq); uint8_t setFrequency(float freq);
uint8_t setSpreadingFactor(uint8_t sf); uint8_t setSpreadingFactor(uint8_t sf);
}; };

View file

@ -52,6 +52,7 @@ uint8_t SX1278::setFrequency(float freq) {
return(ERR_INVALID_FREQUENCY); return(ERR_INVALID_FREQUENCY);
} }
// set frequency and if successful, save the new setting
uint8_t state = SX1278::setFrequencyRaw(freq); uint8_t state = SX1278::setFrequencyRaw(freq);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_freq = freq; SX127x::_freq = freq;
@ -85,6 +86,7 @@ uint8_t SX1278::setBandwidth(float bw) {
return(ERR_INVALID_BANDWIDTH); return(ERR_INVALID_BANDWIDTH);
} }
// set bandwidth and if successful, save the new setting
uint8_t state = SX1278::setBandwidthRaw(newBandwidth); uint8_t state = SX1278::setBandwidthRaw(newBandwidth);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_bw = bw; SX127x::_bw = bw;
@ -123,6 +125,7 @@ uint8_t SX1278::setSpreadingFactor(uint8_t sf) {
return(ERR_INVALID_SPREADING_FACTOR); return(ERR_INVALID_SPREADING_FACTOR);
} }
// set spreading factor and if successful, save the new setting
uint8_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor); uint8_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_sf = sf; SX127x::_sf = sf;
@ -152,6 +155,7 @@ uint8_t SX1278::setCodingRate(uint8_t cr) {
return(ERR_INVALID_CODING_RATE); return(ERR_INVALID_CODING_RATE);
} }
// set coding rate and if successful, save the new setting
uint8_t state = SX1278::setCodingRateRaw(newCodingRate); uint8_t state = SX1278::setCodingRateRaw(newCodingRate);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_cr = cr; SX127x::_cr = cr;
@ -165,6 +169,7 @@ uint8_t SX1278::setOutputPower(int8_t power) {
return(ERR_INVALID_OUTPUT_POWER); return(ERR_INVALID_OUTPUT_POWER);
} }
// set mode to standby
SX127x::standby(); SX127x::standby();
uint8_t state; uint8_t state;
@ -184,7 +189,8 @@ uint8_t SX1278::setOutputPower(int8_t power) {
state |= _mod->SPIsetRegValue(SX127X_REG_PA_CONFIG, SX1278_MAX_POWER | (power + 2), 6, 0); state |= _mod->SPIsetRegValue(SX127X_REG_PA_CONFIG, SX1278_MAX_POWER | (power + 2), 6, 0);
state |= _mod->SPIsetRegValue(SX1278_REG_PA_DAC, SX127X_PA_BOOST_ON, 2, 0); state |= _mod->SPIsetRegValue(SX1278_REG_PA_DAC, SX127X_PA_BOOST_ON, 2, 0);
} }
// configuration successful, save new setting
if(state == ERR_NONE) { if(state == ERR_NONE) {
_power = power; _power = power;
} }

View file

@ -63,10 +63,13 @@
class SX1278: public SX127x { class SX1278: public SX127x {
public: public:
// constructor
SX1278(Module* mod); SX1278(Module* mod);
// basic methods
uint8_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint16_t addrEeprom = 0); uint8_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint16_t addrEeprom = 0);
// configuration methods
uint8_t setFrequency(float freq); uint8_t setFrequency(float freq);
uint8_t setBandwidth(float bw); uint8_t setBandwidth(float bw);
uint8_t setSpreadingFactor(uint8_t sf); uint8_t setSpreadingFactor(uint8_t sf);

View file

@ -10,6 +10,7 @@ uint8_t SX1279::setFrequency(float freq) {
return(ERR_INVALID_FREQUENCY); return(ERR_INVALID_FREQUENCY);
} }
// set frequency and if successful, save the new setting
uint8_t state = SX1278::setFrequencyRaw(freq); uint8_t state = SX1278::setFrequencyRaw(freq);
if(state == ERR_NONE) { if(state == ERR_NONE) {
SX127x::_freq = freq; SX127x::_freq = freq;

View file

@ -6,8 +6,10 @@
class SX1279: public SX1278 { class SX1279: public SX1278 {
public: public:
// constructor
SX1279(Module* mod); SX1279(Module* mod);
// configuration methods
uint8_t setFrequency(float freq); uint8_t setFrequency(float freq);
}; };

View file

@ -205,13 +205,17 @@ uint8_t SX127x::receive(Packet& pack) {
} }
uint8_t SX127x::scanChannel() { uint8_t SX127x::scanChannel() {
// set mode to standby
setMode(SX127X_STANDBY); setMode(SX127X_STANDBY);
// set DIO pin mapping
_mod->SPIsetRegValue(SX127X_REG_DIO_MAPPING_1, SX127X_DIO0_CAD_DONE | SX127X_DIO1_CAD_DETECTED, 7, 4); _mod->SPIsetRegValue(SX127X_REG_DIO_MAPPING_1, SX127X_DIO0_CAD_DONE | SX127X_DIO1_CAD_DETECTED, 7, 4);
clearIRQFlags(); clearIRQFlags();
// set mode to CAD
setMode(SX127X_CAD); setMode(SX127X_CAD);
// wait for channel activity detected or timeout
while(!_mod->getInt0State()) { while(!_mod->getInt0State()) {
if(_mod->getInt1State()) { if(_mod->getInt1State()) {
clearIRQFlags(); clearIRQFlags();
@ -219,21 +223,27 @@ uint8_t SX127x::scanChannel() {
} }
} }
// clear interrupt flags
clearIRQFlags(); clearIRQFlags();
return(CHANNEL_FREE); return(CHANNEL_FREE);
} }
uint8_t SX127x::sleep() { uint8_t SX127x::sleep() {
// set mode to sleep
return(setMode(SX127X_SLEEP)); return(setMode(SX127X_SLEEP));
} }
uint8_t SX127x::standby() { uint8_t SX127x::standby() {
// set mode to standby
return(setMode(SX127X_STANDBY)); return(setMode(SX127X_STANDBY));
} }
uint8_t SX127x::setSyncWord(uint8_t syncWord) { uint8_t SX127x::setSyncWord(uint8_t syncWord) {
// set mode to standby
setMode(SX127X_STANDBY); setMode(SX127X_STANDBY);
// write register
uint8_t state = _mod->SPIsetRegValue(SX127X_REG_SYNC_WORD, syncWord); uint8_t state = _mod->SPIsetRegValue(SX127X_REG_SYNC_WORD, syncWord);
if(state == ERR_NONE) { if(state == ERR_NONE) {
_syncWord = syncWord; _syncWord = syncWord;

View file

@ -167,20 +167,23 @@
class SX127x { class SX127x {
public: public:
// constructor
SX127x(Module* mod); SX127x(Module* mod);
// public member variables
float dataRate; float dataRate;
int8_t lastPacketRSSI; int8_t lastPacketRSSI;
float lastPacketSNR; float lastPacketSNR;
// basic methods
uint8_t begin(uint8_t syncWord, uint16_t addrEeprom); uint8_t begin(uint8_t syncWord, uint16_t addrEeprom);
uint8_t transmit(Packet& pack); uint8_t transmit(Packet& pack);
uint8_t receive(Packet& pack); uint8_t receive(Packet& pack);
uint8_t scanChannel(); uint8_t scanChannel();
uint8_t sleep(); uint8_t sleep();
uint8_t standby(); uint8_t standby();
// configuration methods
uint8_t setSyncWord(uint8_t syncWord); uint8_t setSyncWord(uint8_t syncWord);
protected: protected:
@ -195,9 +198,7 @@ class SX127x {
uint8_t tx(char* data, uint8_t length); uint8_t tx(char* data, uint8_t length);
uint8_t rxSingle(char* data, uint8_t* length); uint8_t rxSingle(char* data, uint8_t* length);
uint8_t setFrequencyRaw(float newFreq); uint8_t setFrequencyRaw(float newFreq);
uint8_t config(); uint8_t config();
private: private: