[SX126x] Changed pin mapping, added reset, changed LoRa sync word to 1B

This commit is contained in:
jgromes 2019-12-27 13:21:21 +01:00
parent beb160f705
commit 55aff74a81
13 changed files with 68 additions and 38 deletions

View file

@ -18,8 +18,9 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 lora = new Module(10, 2, 9); SX1262 lora = new Module(10, 2, 3, 9);
// or using RadioShield // or using RadioShield
// https://github.com/jgromes/RadioShield // https://github.com/jgromes/RadioShield

View file

@ -19,8 +19,9 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 fsk = new Module(10, 2, 9); SX1262 fsk = new Module(10, 2, 3, 9);
// or using RadioShield // or using RadioShield
// https://github.com/jgromes/RadioShield // https://github.com/jgromes/RadioShield

View file

@ -23,9 +23,9 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// DIO2 pin: 3 // NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 lora = new Module(10, 2, 9); SX1262 lora = new Module(10, 2, 3, 9);
// or using RadioShield // or using RadioShield
// https://github.com/jgromes/RadioShield // https://github.com/jgromes/RadioShield

View file

@ -24,8 +24,9 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 lora = new Module(10, 2, 9); SX1262 lora = new Module(10, 2, 3, 9);
// or using RadioShield // or using RadioShield
// https://github.com/jgromes/RadioShield // https://github.com/jgromes/RadioShield

View file

@ -27,14 +27,16 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 loraSX1262 = new Module(10, 2, 9); SX1262 loraSX1262 = new Module(10, 2, 3, 9);
// SX12628 has different connections: // SX12628 has different connections:
// NSS pin: 8 // NSS pin: 8
// DIO1 pin: 4 // DIO1 pin: 4
// NRST pin: 5
// BUSY pin: 6 // BUSY pin: 6
SX1268 loraSX1268 = new Module(8, 4, 6); SX1268 loraSX1268 = new Module(8, 4, 5, 6);
// or using RadioShield // or using RadioShield
// https://github.com/jgromes/RadioShield // https://github.com/jgromes/RadioShield

View file

@ -19,8 +19,9 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 lora = new Module(10, 2, 9); SX1262 lora = new Module(10, 2, 3, 9);
// or using RadioShield // or using RadioShield
// https://github.com/jgromes/RadioShield // https://github.com/jgromes/RadioShield
@ -35,7 +36,7 @@ void setup() {
// bandwidth: 125.0 kHz // bandwidth: 125.0 kHz
// spreading factor: 9 // spreading factor: 9
// coding rate: 7 // coding rate: 7
// sync word: 0x1424 (private network) // sync word: 0x12 (private network)
// output power: 14 dBm // output power: 14 dBm
// current limit: 60 mA // current limit: 60 mA
// preamble length: 8 symbols // preamble length: 8 symbols

View file

@ -20,8 +20,9 @@
// SX1262 has the following connections: // SX1262 has the following connections:
// NSS pin: 10 // NSS pin: 10
// DIO1 pin: 2 // DIO1 pin: 2
// NRST pin: 3
// BUSY pin: 9 // BUSY pin: 9
SX1262 lora = new Module(10, 2, 9); SX1262 lora = new Module(10, 2, 3, 9);
// save transmission state between loops // save transmission state between loops
int transmissionState = ERR_NONE; int transmissionState = ERR_NONE;

View file

@ -4,7 +4,7 @@ SX1262::SX1262(Module* mod) : SX126x(mod) {
} }
int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) {
// execute common part // execute common part
int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage);
if(state != ERR_NONE) { if(state != ERR_NONE) {

View file

@ -32,7 +32,7 @@ class SX1262: public SX126x {
\param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7).
\param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x1424). \param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x12).
\param power Output power in dBm. Defaults to 14 dBm. \param power Output power in dBm. Defaults to 14 dBm.
@ -44,7 +44,7 @@ class SX1262: public SX126x {
\returns \ref status_codes \returns \ref status_codes
*/ */
int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint16_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6);
/*! /*!
\brief Initialization method for FSK modem. \brief Initialization method for FSK modem.

View file

@ -4,7 +4,7 @@ SX1268::SX1268(Module* mod) : SX126x(mod) {
} }
int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) {
// execute common part // execute common part
int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage);
if(state != ERR_NONE) { if(state != ERR_NONE) {

View file

@ -35,7 +35,7 @@ class SX1268: public SX126x {
\param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7).
\param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x1424). \param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x12).
\param power Output power in dBm. Defaults to 14 dBm. \param power Output power in dBm. Defaults to 14 dBm.
@ -47,7 +47,7 @@ class SX1268: public SX126x {
\returns \ref status_codes \returns \ref status_codes
*/ */
int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint16_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6);
/*! /*!
\brief Initialization method for FSK modem. \brief Initialization method for FSK modem.

View file

@ -4,9 +4,14 @@ SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_CRYSTAL_FREQ, SX126X_DIV_EXPO
_mod = mod; _mod = mod;
} }
int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage) {
// set module properties // set module properties
_mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); _mod->init(RADIOLIB_USE_SPI);
Module::pinMode(_mod->getIrq(), INPUT);
Module::pinMode(_mod->getGpio(), INPUT);
// reset the module
reset();
// BW in kHz and SF are required in order to calculate LDRO for setModulationParams // BW in kHz and SF are required in order to calculate LDRO for setModulationParams
_bwKhz = bw; _bwKhz = bw;
@ -79,7 +84,11 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float
int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) {
// set module properties // set module properties
_mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); _mod->init(RADIOLIB_USE_SPI);
Module::pinMode(_mod->getIrq(), INPUT);
// reset the module
reset();
// initialize configuration variables (will be overwritten during public settings configuration) // initialize configuration variables (will be overwritten during public settings configuration)
_br = 21333; // 48.0 kbps _br = 21333; // 48.0 kbps
@ -159,6 +168,15 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit
return(state); return(state);
} }
void SX126x::reset() {
Module::pinMode(_mod->getRst(), OUTPUT);
Module::digitalWrite(_mod->getRst(), LOW);
delay(100);
Module::digitalWrite(_mod->getRst(), HIGH);
Module::pinMode(_mod->getRst(), INPUT);
delay(100);
}
int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) {
// set mode to standby // set mode to standby
int16_t state = standby(); int16_t state = standby();
@ -199,7 +217,7 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) {
// wait for packet transmission or timeout // wait for packet transmission or timeout
uint32_t start = micros(); uint32_t start = micros();
while(!digitalRead(_mod->getInt0())) { while(!digitalRead(_mod->getIrq())) {
if(micros() - start > timeout) { if(micros() - start > timeout) {
clearIrqStatus(); clearIrqStatus();
return(ERR_TX_TIMEOUT); return(ERR_TX_TIMEOUT);
@ -264,7 +282,7 @@ int16_t SX126x::receive(uint8_t* data, size_t len) {
// wait for packet reception or timeout // wait for packet reception or timeout
uint32_t start = micros(); uint32_t start = micros();
while(!digitalRead(_mod->getInt0())) { while(!digitalRead(_mod->getIrq())) {
if(micros() - start > timeout) { if(micros() - start > timeout) {
fixImplicitTimeout(); fixImplicitTimeout();
clearIrqStatus(); clearIrqStatus();
@ -333,7 +351,7 @@ int16_t SX126x::scanChannel() {
} }
// wait for channel activity detected or timeout // wait for channel activity detected or timeout
while(!digitalRead(_mod->getInt0())); while(!digitalRead(_mod->getIrq()));
// check CAD result // check CAD result
uint16_t cadResult = getIrqStatus(); uint16_t cadResult = getIrqStatus();
@ -370,7 +388,7 @@ int16_t SX126x::standby(uint8_t mode) {
} }
void SX126x::setDio1Action(void (*func)(void)) { void SX126x::setDio1Action(void (*func)(void)) {
attachInterrupt(digitalPinToInterrupt(_mod->getInt0()), func, RISING); attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING);
} }
int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
@ -438,7 +456,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
} }
// wait for BUSY to go low (= PA ramp up done) // wait for BUSY to go low (= PA ramp up done)
while(digitalRead(_mod->getInt1())); while(digitalRead(_mod->getGpio()));
return(state); return(state);
} }
@ -660,14 +678,14 @@ int16_t SX126x::setCodingRate(uint8_t cr) {
return(setModulationParams(_sf, _bw, _cr)); return(setModulationParams(_sf, _bw, _cr));
} }
int16_t SX126x::setSyncWord(uint16_t syncWord) { int16_t SX126x::setSyncWord(uint8_t syncWord) {
// check active modem // check active modem
if(getPacketType() != SX126X_PACKET_TYPE_LORA) { if(getPacketType() != SX126X_PACKET_TYPE_LORA) {
return(ERR_WRONG_MODEM); return(ERR_WRONG_MODEM);
} }
// update register // update register
uint8_t data[2] = {(uint8_t)((syncWord >> 8) & 0xFF), (uint8_t)(syncWord & 0xFF)}; uint8_t data[2] = {(uint8_t)((syncWord & 0xF0) | 0x04), (uint8_t)(((syncWord & 0x0F) << 4) | 0x04)};
return(writeRegister(SX126X_REG_LORA_SYNC_WORD_MSB, data, 2)); return(writeRegister(SX126X_REG_LORA_SYNC_WORD_MSB, data, 2));
} }
@ -1501,7 +1519,7 @@ int16_t SX126x::config(uint8_t modem) {
// wait for calibration completion // wait for calibration completion
delay(5); delay(5);
while(digitalRead(_mod->getInt1())); while(digitalRead(_mod->getGpio()));
return(ERR_NONE); return(ERR_NONE);
} }
@ -1537,7 +1555,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d
// ensure BUSY is low (state meachine ready) // ensure BUSY is low (state meachine ready)
RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... ")); RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... "));
uint32_t start = millis(); uint32_t start = millis();
while(digitalRead(_mod->getInt1())) { while(digitalRead(_mod->getGpio())) {
if(millis() - start >= timeout) { if(millis() - start >= timeout) {
return(ERR_SPI_CMD_TIMEOUT); return(ERR_SPI_CMD_TIMEOUT);
} }
@ -1604,11 +1622,11 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d
if(waitForBusy) { if(waitForBusy) {
delayMicroseconds(1); delayMicroseconds(1);
start = millis(); start = millis();
while(digitalRead(_mod->getInt1())) { while(digitalRead(_mod->getGpio())) {
if(millis() - start >= timeout) { if(millis() - start >= timeout) {
status = SX126X_STATUS_CMD_TIMEOUT; status = SX126X_STATUS_CMD_TIMEOUT;
break; break;
} }
} }
} }

View file

@ -325,8 +325,8 @@
// SX126X SPI register variables // SX126X SPI register variables
//SX126X_REG_LORA_SYNC_WORD_MSB + LSB //SX126X_REG_LORA_SYNC_WORD_MSB + LSB
#define SX126X_SYNC_WORD_PUBLIC 0x3444 #define SX126X_SYNC_WORD_PUBLIC 0x34 // actually 0x3444 NOTE: The low nibbles in each byte (0x_4_4) are masked out since apparently, they're reserved.
#define SX126X_SYNC_WORD_PRIVATE 0x1424 #define SX126X_SYNC_WORD_PRIVATE 0x12 // actually 0x1424 You couldn't make this up if you tried.
/*! /*!
@ -361,7 +361,7 @@ class SX126x: public PhysicalLayer {
\param cr LoRa coding rate denominator. Allowed values range from 5 to 8. \param cr LoRa coding rate denominator. Allowed values range from 5 to 8.
\param syncWord 2-byte LoRa sync word. \param syncWord 1-byte LoRa sync word.
\param currentLimit Current protection limit in mA. \param currentLimit Current protection limit in mA.
@ -371,7 +371,7 @@ class SX126x: public PhysicalLayer {
\returns \ref status_codes \returns \ref status_codes
*/ */
int16_t begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage); int16_t begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage);
/*! /*!
\brief Initialization method for FSK modem. \brief Initialization method for FSK modem.
@ -394,6 +394,11 @@ class SX126x: public PhysicalLayer {
*/ */
int16_t beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage); int16_t beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage);
/*!
\brief Reset method. Will reset the chip to the default state using RST pin.
*/
void reset();
/*! /*!
\brief Blocking binary transmit method. \brief Blocking binary transmit method.
Overloads for string-based transmissions are implemented in PhysicalLayer. Overloads for string-based transmissions are implemented in PhysicalLayer.
@ -571,7 +576,7 @@ class SX126x: public PhysicalLayer {
\returns \ref status_codes \returns \ref status_codes
*/ */
int16_t setSyncWord(uint16_t syncWord); int16_t setSyncWord(uint8_t syncWord);
/*! /*!
\brief Sets current protection limit. Can be set in 0.25 mA steps. \brief Sets current protection limit. Can be set in 0.25 mA steps.