diff --git a/README.md b/README.md index dbe288bc..e726a7ad 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ RadioLib was originally created as a driver for [__RadioShield__](https://github * __SX126x__ series LoRa modules (SX1261, SX1262, SX1268) * __SX127x__ series LoRa modules (SX1272, SX1273, SX1276, SX1277, SX1278, SX1279) * __SX128x__ series LoRa/GFSK/BLE/FLRC modules (SX1280, SX1281, SX1282) -* __SX1231__ FSK/OOK radio module +* __SX123x__ FSK/OOK radio modules (SX1231, SX1233) ### Supported protocols and digital modes: * [__AX.25__](https://www.sigidwiki.com/wiki/PACKET) using 2-FSK or AFSK for modules: diff --git a/examples/SX1231/SX1231_Receive/SX1231_Receive.ino b/examples/SX123x/SX123x_Receive_Blocking/SX123x_Receive_Blocking.ino similarity index 92% rename from examples/SX1231/SX1231_Receive/SX1231_Receive.ino rename to examples/SX123x/SX123x_Receive_Blocking/SX123x_Receive_Blocking.ino index 9071e310..f79d3546 100644 --- a/examples/SX1231/SX1231_Receive/SX1231_Receive.ino +++ b/examples/SX123x/SX123x_Receive_Blocking/SX123x_Receive_Blocking.ino @@ -1,9 +1,10 @@ /* - RadioLib SX1231 Blocking Receive Example + RadioLib SX123x Blocking Receive Example This example receives packets using SX1231 FSK radio module. + Other modules from SX123x family can also be used. - NOTE: SX1231 offers the same features as RF69 and has the same + NOTE: SX123x modules offer the same features as RF69 and have the same interface. Please see RF69 examples for examples on AES, address filtering, interrupts and settings. diff --git a/examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino b/examples/SX123x/SX123x_Transmit_Blocking/SX123x_Transmit_Blocking.ino similarity index 92% rename from examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino rename to examples/SX123x/SX123x_Transmit_Blocking/SX123x_Transmit_Blocking.ino index 02a883b4..e311737e 100644 --- a/examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino +++ b/examples/SX123x/SX123x_Transmit_Blocking/SX123x_Transmit_Blocking.ino @@ -1,9 +1,10 @@ /* - RadioLib SX1231 Blocking Transmit Example + RadioLib SX123x Blocking Transmit Example This example transmits packets using SX1231 FSK radio module. + Other modules from SX123x family can also be used. - NOTE: SX1231 offers the same features as RF69 and has the same + NOTE: SX123x modules offer the same features as RF69 and have the same interface. Please see RF69 examples for examples on AES, address filtering, interrupts and settings. diff --git a/keywords.txt b/keywords.txt index 24369e17..981d2133 100644 --- a/keywords.txt +++ b/keywords.txt @@ -28,6 +28,7 @@ Si4431 KEYWORD1 Si4432 KEYWORD1 SIM800 KEYWORD1 SX1231 KEYWORD1 +SX1233 KEYWORD1 SX1261 KEYWORD1 SX1262 KEYWORD1 SX1268 KEYWORD1 diff --git a/src/RadioLib.h b/src/RadioLib.h index df54fc51..0e3d7f6d 100644 --- a/src/RadioLib.h +++ b/src/RadioLib.h @@ -84,7 +84,8 @@ #include "modules/Si443x/Si4430.h" #include "modules/Si443x/Si4431.h" #include "modules/Si443x/Si4432.h" -#include "modules/SX1231/SX1231.h" +#include "modules/SX123x/SX1231.h" +#include "modules/SX123x/SX1233.h" #include "modules/SX126x/SX1261.h" #include "modules/SX126x/SX1262.h" #include "modules/SX126x/SX1268.h" diff --git a/src/modules/SX1231/SX1231.cpp b/src/modules/SX123x/SX1231.cpp similarity index 91% rename from src/modules/SX1231/SX1231.cpp rename to src/modules/SX123x/SX1231.cpp index 7cce2cce..8d38edaf 100644 --- a/src/modules/SX1231/SX1231.cpp +++ b/src/modules/SX123x/SX1231.cpp @@ -16,7 +16,7 @@ int16_t SX1231::begin(float freq, float br, float freqDev, float rxBw, int8_t po bool flagFound = false; while((i < 10) && !flagFound) { int16_t version = getChipVersion(); - if((version == 0x21) || (version == 0x22) || (version == 0x23)) { + if((version == RADIOLIB_SX123X_CHIP_REVISION_2_A) || (version == RADIOLIB_SX123X_CHIP_REVISION_2_B) || (version == RADIOLIB_SX123X_CHIP_REVISION_2_C)) { flagFound = true; this->chipRevision = version; } else { @@ -74,8 +74,8 @@ int16_t SX1231::begin(float freq, float br, float freqDev, float rxBw, int8_t po return(state); } - // SX1231 V2a only - if(this->chipRevision == RADIOLIB_SX1231_CHIP_REVISION_2_A) { + // SX123x V2a only + if(this->chipRevision == RADIOLIB_SX123X_CHIP_REVISION_2_A) { // modify default OOK threshold value state = this->mod->SPIsetRegValue(RADIOLIB_SX1231_REG_TEST_OOK, RADIOLIB_SX1231_OOK_DELTA_THRESHOLD); RADIOLIB_ASSERT(state); diff --git a/src/modules/SX1231/SX1231.h b/src/modules/SX123x/SX1231.h similarity index 97% rename from src/modules/SX1231/SX1231.h rename to src/modules/SX123x/SX1231.h index e9631a87..569a8403 100644 --- a/src/modules/SX1231/SX1231.h +++ b/src/modules/SX123x/SX1231.h @@ -8,9 +8,9 @@ #include "../../Module.h" #include "../RF69/RF69.h" -#define RADIOLIB_SX1231_CHIP_REVISION_2_A 0x21 -#define RADIOLIB_SX1231_CHIP_REVISION_2_B 0x22 -#define RADIOLIB_SX1231_CHIP_REVISION_2_C 0x23 +#define RADIOLIB_SX123X_CHIP_REVISION_2_A 0x21 +#define RADIOLIB_SX123X_CHIP_REVISION_2_B 0x22 +#define RADIOLIB_SX123X_CHIP_REVISION_2_C 0x23 // RADIOLIB_SX1231 specific register map #define RADIOLIB_SX1231_REG_TEST_OOK 0x6E diff --git a/src/modules/SX123x/SX1233.cpp b/src/modules/SX123x/SX1233.cpp new file mode 100644 index 00000000..cece36ba --- /dev/null +++ b/src/modules/SX123x/SX1233.cpp @@ -0,0 +1,124 @@ +#include "SX1233.h" +#if !RADIOLIB_EXCLUDE_SX1233 + +SX1233::SX1233(Module* mod) : SX1231(mod) { + +} + +int16_t SX1233::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + + // try to find the SX1233 chip + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + int16_t version = getChipVersion(); + if((version == 0x21) || (version == 0x22) || (version == 0x23)) { + flagFound = true; + this->chipRevision = version; + } else { + RADIOLIB_DEBUG_PRINTLN("SX1231 not found! (%d of 10 tries) RF69_REG_VERSION == 0x%04X, expected 0x0021 / 0x0022 / 0x0023", i + 1, version); + this->mod->hal->delay(10); + i++; + } + } + + if(!flagFound) { + RADIOLIB_DEBUG_PRINTLN("No SX1233 found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tSX1233"); + + // configure settings not accessible by API + int16_t state = config(); + RADIOLIB_ASSERT(state); + RADIOLIB_DEBUG_PRINTLN("M\tRF69"); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + // configure bitrate + this->rxBandwidth = 125.0; + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + // configure default RX bandwidth + state = setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + // configure default frequency deviation + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + // configure default TX output power + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + // configure default preamble length + state = setPreambleLength(preambleLen); + RADIOLIB_ASSERT(state); + + // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library + uint8_t syncWord[] = {0x2D, 0x01}; + state = setSyncWord(syncWord, 2); + RADIOLIB_ASSERT(state); + + // set default packet length mode + state = variablePacketLengthMode(); + if (state != RADIOLIB_ERR_NONE) { + return(state); + } + + // SX123x V2a only + if(this->chipRevision == RADIOLIB_SX123X_CHIP_REVISION_2_A) { + // modify default OOK threshold value + state = this->mod->SPIsetRegValue(RADIOLIB_SX1231_REG_TEST_OOK, RADIOLIB_SX1231_OOK_DELTA_THRESHOLD); + RADIOLIB_ASSERT(state); + + // enable OCP with 95 mA limit + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OCP, RADIOLIB_RF69_OCP_ON | RADIOLIB_RF69_OCP_TRIM, 4, 0); + RADIOLIB_ASSERT(state); + } + + return(RADIOLIB_ERR_NONE); +} + +int16_t SX1233::setBitRate(float br) { + // check high bit-rate operation + uint8_t pllBandwidth = RADIOLIB_SX1233_PLL_BW_LOW_BIT_RATE; + if((fabs(br - 500.0f) < 0.1) || (fabs(br - 600.0f) < 0.1)) { + pllBandwidth = RADIOLIB_SX1233_PLL_BW_HIGH_BIT_RATE; + } else { + // datasheet says 1.2 kbps should be the smallest possible, but 0.512 works fine + RADIOLIB_CHECK_RANGE(br, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + } + + + // check bitrate-bandwidth ratio + if(!(br < 2000 * this->rxBandwidth)) { + return(RADIOLIB_ERR_INVALID_BIT_RATE_BW_RATIO); + } + + // set mode to standby + setMode(RADIOLIB_RF69_STANDBY); + + // set PLL bandwidth + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX1233_REG_TEST_PLL, pllBandwidth, 7, 0); + RADIOLIB_ASSERT(state); + + // set bit rate + uint16_t bitRate = 32000 / br; + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_BITRATE_MSB, (bitRate & 0xFF00) >> 8, 7, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_BITRATE_LSB, bitRate & 0x00FF, 7, 0); + if(state == RADIOLIB_ERR_NONE) { + this->bitRate = br; + } + return(state); +} + +#endif diff --git a/src/modules/SX123x/SX1233.h b/src/modules/SX123x/SX1233.h new file mode 100644 index 00000000..b8f078ef --- /dev/null +++ b/src/modules/SX123x/SX1233.h @@ -0,0 +1,59 @@ +#if !defined(_RADIOLIB_SX1233_H) +#define _RADIOLIB_SX1233_H + +#include "../../TypeDef.h" + +#if !RADIOLIB_EXCLUDE_SX1233 + +#include "../../Module.h" +#include "../RF69/RF69.h" +#include "SX1231.h" + +// RADIOLIB_SX1233 specific register map +#define RADIOLIB_SX1233_REG_TEST_PLL 0x5F + +// RADIOLIB_SX1233_REG_TEST_PLL +#define RADIOLIB_SX1233_PLL_BW_HIGH_BIT_RATE 0x0C +#define RADIOLIB_SX1233_PLL_BW_LOW_BIT_RATE 0x08 + +/*! + \class SX1233 + \brief Control class for %SX1233 module. Overrides some methods from SX1231/RF69 due to different register values. +*/ +class SX1233: public SX1231 { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1233(Module* mod); + + /*! + \brief Initialization method. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param br Bit rate to be used in kbps. Defaults to 4.8 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 5.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 125.0 kHz. + \param power Output power in dBm. Defaults to 10 dBm. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16); + + /*! + \brief Sets bit rate. Allowed values range from 0.5 to 300.0 kbps. + SX1233 also allows 500 kbps and 600 kbps operation. + \param br Bit rate to be set in kbps. + \returns \ref status_codes + */ + int16_t setBitRate(float br); + +#if !RADIOLIB_GODMODE + private: +#endif + uint8_t chipRevision = 0; +}; + +#endif + +#endif