Merge pull request #17 from beegee-tokyo/master
Function to set DIO2 of SX126x chips to be used as RF antenna switch
This commit is contained in:
commit
ee86ff8253
5 changed files with 48 additions and 9 deletions
|
@ -104,6 +104,7 @@ setGdo1Action KEYWORD2
|
||||||
# SX126x-specific
|
# SX126x-specific
|
||||||
setDio2Action KEYWORD2
|
setDio2Action KEYWORD2
|
||||||
setTCXO KEYWORD2
|
setTCXO KEYWORD2
|
||||||
|
setDio2AsRfSwitch KEYWORD2
|
||||||
|
|
||||||
# ESP8266
|
# ESP8266
|
||||||
join KEYWORD2
|
join KEYWORD2
|
||||||
|
|
|
@ -461,6 +461,11 @@
|
||||||
*/
|
*/
|
||||||
#define ERR_SPI_CMD_FAILED -707
|
#define ERR_SPI_CMD_FAILED -707
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief SX126x scan channel not possible because DIO2 is used as RF antenna switch.
|
||||||
|
*/
|
||||||
|
#define ERR_DIO2_UNAVAIL_CAD_FAILED -708
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\}
|
\}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -180,7 +180,7 @@ size_t ESP8266::receive(uint8_t* data, size_t len, uint32_t timeout) {
|
||||||
return(i);
|
return(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ESP8266::getNumBytes(uint32_t timeout, size_t minBytes) {
|
size_t ESP8266::getNumBytes(uint32_t timeout, size_t minBytes) {
|
||||||
// wait for available data
|
// wait for available data
|
||||||
uint32_t start = millis();
|
uint32_t start = millis();
|
||||||
while(_mod->ModuleSerial->available() < (int16_t)minBytes) {
|
while(_mod->ModuleSerial->available() < (int16_t)minBytes) {
|
||||||
|
|
|
@ -33,6 +33,11 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, uint1
|
||||||
}
|
}
|
||||||
|
|
||||||
// configure publicly accessible settings
|
// configure publicly accessible settings
|
||||||
|
state = setDio2AsRfSwitch(false);
|
||||||
|
if(state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
state = setSpreadingFactor(sf);
|
state = setSpreadingFactor(sf);
|
||||||
if(state != ERR_NONE) {
|
if(state != ERR_NONE) {
|
||||||
return(state);
|
return(state);
|
||||||
|
@ -86,6 +91,11 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, uint16_t preambleL
|
||||||
}
|
}
|
||||||
|
|
||||||
// configure publicly accessible settings
|
// configure publicly accessible settings
|
||||||
|
state = setDio2AsRfSwitch(false);
|
||||||
|
if(state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
state = setBitRate(br);
|
state = setBitRate(br);
|
||||||
if(state != ERR_NONE) {
|
if(state != ERR_NONE) {
|
||||||
return(state);
|
return(state);
|
||||||
|
@ -274,6 +284,11 @@ int16_t SX126x::scanChannel() {
|
||||||
return(ERR_WRONG_MODEM);
|
return(ERR_WRONG_MODEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_dio2RfSwitch) {
|
||||||
|
// If DIO2 is used as RF switch this function does not work
|
||||||
|
return(ERR_DIO2_UNAVAIL_CAD_FAILED);
|
||||||
|
}
|
||||||
|
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
int16_t state = standby();
|
int16_t state = standby();
|
||||||
if(state != ERR_NONE) {
|
if(state != ERR_NONE) {
|
||||||
|
@ -1058,18 +1073,27 @@ int16_t SX126x::setFrequencyRaw(float freq) {
|
||||||
return(ERR_NONE);
|
return(ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::config(uint8_t modem) {
|
int16_t SX126x::setDio2AsRfSwitch(bool enable) {
|
||||||
// set DIO2 as IRQ
|
uint8_t data[1];
|
||||||
uint8_t* data = new uint8_t[1];
|
if (enable) {
|
||||||
|
// set DIO2 as RF switch
|
||||||
|
data[0] = SX126X_DIO2_AS_RF_SWITCH;
|
||||||
|
} else {
|
||||||
data[0] = SX126X_DIO2_AS_IRQ;
|
data[0] = SX126X_DIO2_AS_IRQ;
|
||||||
|
}
|
||||||
int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1);
|
int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1);
|
||||||
if(state != ERR_NONE) {
|
|
||||||
|
if (state == ERR_NONE) {
|
||||||
|
_dio2RfSwitch = enable;
|
||||||
|
}
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t SX126x::config(uint8_t modem) {
|
||||||
// set regulator mode
|
// set regulator mode
|
||||||
|
uint8_t* data = new uint8_t[1];
|
||||||
data[0] = SX126X_REGULATOR_DC_DC;
|
data[0] = SX126X_REGULATOR_DC_DC;
|
||||||
state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1);
|
int16_t state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1);
|
||||||
if(state != ERR_NONE) {
|
if(state != ERR_NONE) {
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
|
@ -678,6 +678,13 @@ class SX126x: public PhysicalLayer {
|
||||||
*/
|
*/
|
||||||
float getSNR();
|
float getSNR();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Set DIO2 to function as RF switch (default in Semtech example designs).
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t setDio2AsRfSwitch(bool enable = true);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// SX1276x SPI command implementations
|
// SX1276x SPI command implementations
|
||||||
int16_t setTx(uint32_t timeout = 0);
|
int16_t setTx(uint32_t timeout = 0);
|
||||||
|
@ -720,6 +727,8 @@ class SX126x: public PhysicalLayer {
|
||||||
|
|
||||||
float _dataRate;
|
float _dataRate;
|
||||||
|
|
||||||
|
bool _dio2RfSwitch = false;
|
||||||
|
|
||||||
int16_t config(uint8_t modem);
|
int16_t config(uint8_t modem);
|
||||||
|
|
||||||
// common low-level SPI interface
|
// common low-level SPI interface
|
||||||
|
|
Loading…
Add table
Reference in a new issue