[SX126x] Added TCXO control method

This commit is contained in:
jgromes 2019-05-20 08:49:05 +02:00
parent 2d75670c9c
commit ccaf51a915
5 changed files with 75 additions and 5 deletions

View file

@ -3,7 +3,7 @@
This example shows how to change all the properties of LoRa transmission. This example shows how to change all the properties of LoRa transmission.
RadioLib currently supports the following settings: 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 - carrier frequency
- bandwidth - bandwidth
- spreading factor - spreading factor
@ -12,6 +12,7 @@
- output power during transmission - output power during transmission
- CRC - CRC
- preamble length - preamble length
- TCXO voltage
Other modules from SX126x family can also be used. Other modules from SX126x family can also be used.
*/ */
@ -124,11 +125,20 @@ void setup() {
} }
// disable CRC // 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!")); Serial.println(F("Selected CRC is invalid for this module!"));
while (true); 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!")); Serial.println(F("All settings succesfully changed!"));
} }

View file

@ -14,11 +14,13 @@ CC1101 KEYWORD1
ESP8266 KEYWORD1 ESP8266 KEYWORD1
HC05 KEYWORD1 HC05 KEYWORD1
JDY08 KEYWORD1 JDY08 KEYWORD1
nRF24 KEYWORD1
RF69 KEYWORD1 RF69 KEYWORD1
RFM95 KEYWORD1 RFM95 KEYWORD1
RFM96 KEYWORD1 RFM96 KEYWORD1
RFM97 KEYWORD1 RFM97 KEYWORD1
RFM98 KEYWORD1 RFM98 KEYWORD1
SIM800 KEYWORD1
SX1231 KEYWORD1 SX1231 KEYWORD1
SX1261 KEYWORD1 SX1261 KEYWORD1
SX1262 KEYWORD1 SX1262 KEYWORD1
@ -98,6 +100,10 @@ getLQI KEYWORD2
setGdo0Action KEYWORD2 setGdo0Action KEYWORD2
setGdo1Action KEYWORD2 setGdo1Action KEYWORD2
# SX126x-specific
setDio2Action KEYWORD2
setTCXO KEYWORD2
# ESP8266 # ESP8266
join KEYWORD2 join KEYWORD2
reset KEYWORD2 reset KEYWORD2
@ -108,6 +114,11 @@ setPanId KEYWORD2
getPacketSource KEYWORD2 getPacketSource KEYWORD2
getPacketData KEYWORD2 getPacketData KEYWORD2
# nRF24
setTransmitAddress KEYWORD2
setReceivePipe KEYWORD2
disablePipe KEYWORD2
# HTTP # HTTP
get KEYWORD2 get KEYWORD2
post KEYWORD2 post KEYWORD2
@ -135,6 +146,10 @@ send KEYWORD2
receive KEYWORD2 receive KEYWORD2
getNumBytes KEYWORD2 getNumBytes KEYWORD2
# SIM800
sendSMS KEYWORD2
shutdown KEYWORD2
####################################### #######################################
# Constants (LITERAL1) # Constants (LITERAL1)
####################################### #######################################
@ -198,7 +213,12 @@ ITA2 LITERAL1
ERR_INVALID_RTTY_SHIFT LITERAL1 ERR_INVALID_RTTY_SHIFT LITERAL1
ERR_UNSUPPORTED_ENCODING 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_NUM_BROAD_ADDRS LITERAL1
ERR_INVALID_CRC LITERAL1 ERR_INVALID_CRC_CONFIGURATION LITERAL1
LORA_DETECTED LITERAL1 LORA_DETECTED LITERAL1
ERR_INVALID_TCXO_VOLTAGE LITERAL1

View file

@ -109,7 +109,8 @@
#define ERR_INVALID_NUM_BROAD_ADDRS -601 #define ERR_INVALID_NUM_BROAD_ADDRS -601
// SX126x-specific status codes // SX126x-specific status codes
#define ERR_INVALID_CRC -701 #define ERR_INVALID_CRC_CONFIGURATION -701
#define LORA_DETECTED -702 #define LORA_DETECTED -702
#define ERR_INVALID_TCXO_VOLTAGE -703
#endif #endif

View file

@ -733,7 +733,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool
} }
break; break;
default: default:
return(ERR_INVALID_CRC); return(ERR_INVALID_CRC_CONFIGURATION);
} }
setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp);
@ -772,6 +772,44 @@ float SX126x::getSNR() {
return(snrPkt/4.0); 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) { void SX126x::setTx(uint32_t timeout) {
uint8_t data[3] = {(uint8_t)((timeout >> 16) & 0xFF), (uint8_t)((timeout >> 8) & 0xFF), (uint8_t)(timeout & 0xFF)}; 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); SPIwriteCommand(SX126X_CMD_SET_TX, data, 3);

View file

@ -359,6 +359,7 @@ class SX126x: public PhysicalLayer {
int16_t disableAddressFiltering(); int16_t disableAddressFiltering();
int16_t setCRC(bool enableCRC); int16_t setCRC(bool enableCRC);
int16_t setCRC(uint8_t len, uint16_t initial = 0x1D0F, uint16_t polynomial = 0x1021, bool inverted = true); 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 getDataRate();
float getRSSI(); float getRSSI();
float getSNR(); float getSNR();