From 6a4634fbb297bb9cf3e61070ce1b087882a4c8a2 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 21 May 2019 13:41:13 +0200 Subject: [PATCH] [SX126x] Added automatic block calibration --- src/modules/SX126x.cpp | 71 +++++++++++++----------------------------- src/modules/SX126x.h | 4 +-- 2 files changed, 23 insertions(+), 52 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 8938cea9..aa857e42 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -27,7 +27,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, uint1 } // configure settings not accessible by API - state = config(); + state = config(SX126X_PACKET_TYPE_LORA); if(state != ERR_NONE) { return(state); } @@ -80,7 +80,7 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, uint16_t preambleL } // configure settings not accessible by API - state = configFSK(); + state = config(SX126X_PACKET_TYPE_GFSK); if(state != ERR_NONE) { return(state); } @@ -1069,7 +1069,7 @@ int16_t SX126x::setFrequencyRaw(float freq, bool calibrate) { return(ERR_NONE); } -int16_t SX126x::config() { +int16_t SX126x::config(uint8_t modem) { // set DIO2 as IRQ uint8_t* data = new uint8_t[1]; data[0] = SX126X_DIO2_AS_IRQ; @@ -1091,8 +1091,8 @@ int16_t SX126x::config() { return(state); } - // set LoRa mode - data[0] = SX126X_PACKET_TYPE_LORA; + // set modem + data[0] = modem; state = SPIwriteCommand(SX126X_CMD_SET_PACKET_TYPE, data, 1); if(state != ERR_NONE) { return(state); @@ -1123,57 +1123,28 @@ int16_t SX126x::config() { // clear IRQ state = clearIrqStatus(); state |= setDioIrqParams(SX126X_IRQ_NONE, SX126X_IRQ_NONE); + if(state != ERR_NONE) { + return(state); + } + + // calibrate all blocks + delete[] data; + data = new uint8_t[1]; + data[0] = SX126X_CALIBRATE_ALL; + state = SPIwriteCommand(SX126X_CMD_CALIBRATE, data, 1); + if(state != ERR_NONE) { + return(state); + } + + // wait for calibration completion + delayMicroseconds(1); + while(digitalRead(_mod->getRx())); delete[] data; return(ERR_NONE); } -int16_t SX126x::configFSK() { - // set DIO2 as IRQ - uint8_t* data = new uint8_t[1]; - data[0] = SX126X_DIO2_AS_IRQ; - int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1); - if(state != ERR_NONE) { - return(state); - } - - // set regulator mode - data[0] = SX126X_REGULATOR_DC_DC; - state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1); - if(state != ERR_NONE) { - return(state); - } - - // reset buffer base address - state = setBufferBaseAddress(); - if(state != ERR_NONE) { - return(state); - } - - // set FSK mode - data[0] = SX126X_PACKET_TYPE_GFSK; - state = SPIwriteCommand(SX126X_CMD_SET_PACKET_TYPE, data, 1); - if(state != ERR_NONE) { - return(state); - } - - // set Rx/Tx fallback mode to STDBY_RC - data[0] = SX126X_RX_TX_FALLBACK_MODE_STDBY_RC; - state = SPIwriteCommand(SX126X_CMD_SET_RX_TX_FALLBACK_MODE, data, 1); - if(state != ERR_NONE) { - return(state); - } - - // clear IRQ - state = clearIrqStatus(); - state |= setDioIrqParams(SX126X_IRQ_NONE, SX126X_IRQ_NONE); - - delete[] data; - - return(state); -} - int16_t SX126x::SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) { return(SX126x::SPItransfer(cmd, true, data, NULL, numBytes, waitForBusy)); } diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 0375938a..ed7c29e8 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -134,6 +134,7 @@ #define SX126X_CALIBRATE_RC13M_ON 0b00000010 // 1 1 enabled #define SX126X_CALIBRATE_RC64K_OFF 0b00000000 // 0 0 64 kHz RC osc. calibration: disabled #define SX126X_CALIBRATE_RC64K_ON 0b00000001 // 0 0 enabled +#define SX126X_CALIBRATE_ALL 0b01111111 // 6 0 calibrate all blocks //SX126X_CMD_CALIBRATE_IMAGE #define SX126X_CAL_IMG_430_MHZ_1 0x6B @@ -408,8 +409,7 @@ class SX126x: public PhysicalLayer { float _dataRate; - int16_t config(); - int16_t configFSK(); + int16_t config(uint8_t modem); // common low-level SPI interface int16_t SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true);