[SX126x] Added TCXO control method
This commit is contained in:
parent
2d75670c9c
commit
ccaf51a915
5 changed files with 75 additions and 5 deletions
|
@ -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!"));
|
||||
}
|
||||
|
||||
|
|
22
keywords.txt
22
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue