[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.
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!"));
}

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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();