diff --git a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino index c93b488f..441db9c3 100644 --- a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino +++ b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino @@ -3,7 +3,7 @@ This example shows how to change all the properties of LoRa transmission. RadioLib currently supports the following settings: - - pins (SPI slave select, digital IO 0, digital IO 1) + - pins (SPI slave select, DIO1, DIO2, BUSY pin) - carrier frequency - bandwidth - spreading factor @@ -12,6 +12,7 @@ - output power during transmission - CRC - preamble length + - TCXO voltage Other modules from SX126x family can also be used. */ @@ -124,11 +125,20 @@ void setup() { } // disable CRC - if (loraSX1268.setCRC(false) == ERR_INVALID_CRC) { + if (loraSX1268.setCRC(false) == ERR_INVALID_CRC_CONFIGURATION) { Serial.println(F("Selected CRC is invalid for this module!")); while (true); } + // Some SX126x have TCXO (temprature compensated crystal + // oscillator). To configure TCXO reference voltage, + // the following method can be used. + if (loraSX1268.setTCXO(2.4) == ERR_INVALID_TCXO_VOLTAGE) { + Serial.println(F("Selected TCXO voltage is invalid for this module!")); + while (true); + } + + Serial.println(F("All settings succesfully changed!")); } diff --git a/keywords.txt b/keywords.txt index 90aef2d7..7f96ac03 100644 --- a/keywords.txt +++ b/keywords.txt @@ -14,11 +14,13 @@ CC1101 KEYWORD1 ESP8266 KEYWORD1 HC05 KEYWORD1 JDY08 KEYWORD1 +nRF24 KEYWORD1 RF69 KEYWORD1 RFM95 KEYWORD1 RFM96 KEYWORD1 RFM97 KEYWORD1 RFM98 KEYWORD1 +SIM800 KEYWORD1 SX1231 KEYWORD1 SX1261 KEYWORD1 SX1262 KEYWORD1 @@ -98,6 +100,10 @@ getLQI KEYWORD2 setGdo0Action KEYWORD2 setGdo1Action KEYWORD2 +# SX126x-specific +setDio2Action KEYWORD2 +setTCXO KEYWORD2 + # ESP8266 join KEYWORD2 reset KEYWORD2 @@ -108,6 +114,11 @@ setPanId KEYWORD2 getPacketSource KEYWORD2 getPacketData KEYWORD2 +# nRF24 +setTransmitAddress KEYWORD2 +setReceivePipe KEYWORD2 +disablePipe KEYWORD2 + # HTTP get KEYWORD2 post KEYWORD2 @@ -135,6 +146,10 @@ send KEYWORD2 receive KEYWORD2 getNumBytes KEYWORD2 +# SIM800 +sendSMS KEYWORD2 +shutdown KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### @@ -198,7 +213,12 @@ ITA2 LITERAL1 ERR_INVALID_RTTY_SHIFT LITERAL1 ERR_UNSUPPORTED_ENCODING LITERAL1 +ERR_INVALID_DATA_RATE LITERAL1 +ERR_INVALID_ADDRESS_WIDTH LITERAL1 +ERR_INVALID_PIPE_NUMBER LITERAL1 + ERR_INVALID_NUM_BROAD_ADDRS LITERAL1 -ERR_INVALID_CRC LITERAL1 +ERR_INVALID_CRC_CONFIGURATION LITERAL1 LORA_DETECTED LITERAL1 +ERR_INVALID_TCXO_VOLTAGE LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index 7cc0a70b..8fadb264 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -109,7 +109,8 @@ #define ERR_INVALID_NUM_BROAD_ADDRS -601 // SX126x-specific status codes -#define ERR_INVALID_CRC -701 +#define ERR_INVALID_CRC_CONFIGURATION -701 #define LORA_DETECTED -702 +#define ERR_INVALID_TCXO_VOLTAGE -703 #endif diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 3f9827b8..edeafe2e 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -733,7 +733,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool } break; default: - return(ERR_INVALID_CRC); + return(ERR_INVALID_CRC_CONFIGURATION); } setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); @@ -772,6 +772,44 @@ float SX126x::getSNR() { return(snrPkt/4.0); } +int16_t SX126x::setTCXO(float voltage, uint32_t timeout) { + // set mode to standby + standby(); + + // check alowed voltage values + uint8_t data[4]; + if(abs(voltage - 1.6) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_1_6; + } else if(abs(voltage - 1.7) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_1_7; + } else if(abs(voltage - 1.8) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_1_8; + } else if(abs(voltage - 2.2) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_2_2; + } else if(abs(voltage - 2.4) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_2_4; + } else if(abs(voltage - 2.7) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_2_7; + } else if(abs(voltage - 3.0) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_3_0; + } else if(abs(voltage - 3.3) <= 0.001) { + data[0] = SX126X_DIO3_OUTPUT_3_3; + } else { + return(ERR_INVALID_TCXO_VOLTAGE); + } + + // calculate timeout + uint32_t timeoutValue = (float)timeout / 15.625; + data[1] = (uint8_t)((timeoutValue >> 16) & 0xFF) + data[2] = (uint8_t)((timeoutValue >> 8) & 0xFF) + data[3] = (uint8_t)(timeoutValue & 0xFF) + + // enable TCXO control on DIO3 + SPIwriteCommand(SX126X_CMD_SET_DIO3_AS_TCXO_CTRL, data, 4); + + return(ERR_NONE); +} + void SX126x::setTx(uint32_t timeout) { uint8_t data[3] = {(uint8_t)((timeout >> 16) & 0xFF), (uint8_t)((timeout >> 8) & 0xFF), (uint8_t)(timeout & 0xFF)}; SPIwriteCommand(SX126X_CMD_SET_TX, data, 3); diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 39344996..d3da4c00 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -359,6 +359,7 @@ class SX126x: public PhysicalLayer { int16_t disableAddressFiltering(); int16_t setCRC(bool enableCRC); int16_t setCRC(uint8_t len, uint16_t initial = 0x1D0F, uint16_t polynomial = 0x1021, bool inverted = true); + int16_t setTCXO(float voltage, uint32_t timeout = 5000); float getDataRate(); float getRSSI(); float getSNR();