|
@@ -19,10 +19,13 @@ void Sx1262::beginSPI() const
|
|
{
|
|
{
|
|
SPI.begin(Sx1262::getSclk(), Sx1262::getMiso(), Sx1262::getMosi(), Sx1262::getCs());
|
|
SPI.begin(Sx1262::getSclk(), Sx1262::getMiso(), Sx1262::getMosi(), Sx1262::getCs());
|
|
pinMode(Sx1262::getCs(), OUTPUT);
|
|
pinMode(Sx1262::getCs(), OUTPUT);
|
|
|
|
+ pinMode(Sx1262::getRst(), OUTPUT);
|
|
digitalWrite(Sx1262::getCs(), HIGH);
|
|
digitalWrite(Sx1262::getCs(), HIGH);
|
|
pinMode(Sx1262::getBusy(), INPUT);
|
|
pinMode(Sx1262::getBusy(), INPUT);
|
|
|
|
+ pinMode(Sx1262::getDio(1), INPUT);
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @brief Get the reset pin.
|
|
* @brief Get the reset pin.
|
|
* @return The reset pin number.
|
|
* @return The reset pin number.
|
|
@@ -101,15 +104,12 @@ uint8_t Sx1262::getBusy() const
|
|
*/
|
|
*/
|
|
void Sx1262::reset() const
|
|
void Sx1262::reset() const
|
|
{
|
|
{
|
|
- for (uint32_t delay = 0; delay < 0xFFF; delay++)
|
|
|
|
- {
|
|
|
|
- /// The reset pin operates with inverted logic
|
|
|
|
digitalWrite(_rst, LOW);
|
|
digitalWrite(_rst, LOW);
|
|
- }
|
|
|
|
- for (uint32_t delay = 0; delay < 0xFFFFF; delay++)
|
|
|
|
- {
|
|
|
|
|
|
+ delay(250);
|
|
digitalWrite(_rst, HIGH);
|
|
digitalWrite(_rst, HIGH);
|
|
- }
|
|
|
|
|
|
+ while (digitalRead(_busy) == HIGH) {
|
|
|
|
+ delay(1);
|
|
|
|
+ }
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -127,6 +127,12 @@ uint8_t Sx1262::regRead(uint16_t reg) const
|
|
SPI.transfer(SX126X_READ_REGISTER); ///< Write the register address with a read-enabled flag
|
|
SPI.transfer(SX126X_READ_REGISTER); ///< Write the register address with a read-enabled flag
|
|
SPI.transfer((reg >> 8) & 0xFF); ///< Write the register address bit [15:8]
|
|
SPI.transfer((reg >> 8) & 0xFF); ///< Write the register address bit [15:8]
|
|
SPI.transfer(reg & 0xFF); ///< Write the register address bit [7:0]
|
|
SPI.transfer(reg & 0xFF); ///< Write the register address bit [7:0]
|
|
|
|
+
|
|
|
|
+ if (reg == 0x0889) { //trash function
|
|
|
|
+ SPI.transfer(0x00);
|
|
|
|
+ SPI.transfer(0x00);
|
|
|
|
+ return 0x00;
|
|
|
|
+ }
|
|
// read SPI.transfert until it equals 0x00
|
|
// read SPI.transfert until it equals 0x00
|
|
if (SPI.transfer(0x00) == 0xAA) {
|
|
if (SPI.transfer(0x00) == 0xAA) {
|
|
ret = SPI.transfer(0x00); ///< Read the value at the register address
|
|
ret = SPI.transfer(0x00); ///< Read the value at the register address
|
|
@@ -176,11 +182,12 @@ void Sx1262::setOpMode(uint8_t opcode, uint8_t *payload, uint8_t size) const
|
|
usleep(10);
|
|
usleep(10);
|
|
}
|
|
}
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "SX1262", "setOpMode with opcode 0x%02X", opcode);
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "SX1262", "setOpMode with opcode 0x%02X", opcode);
|
|
- for (uint8_t i=0; i < size; i++) {
|
|
|
|
|
|
+ for (uint8_t i = 0; i < size; i++) {
|
|
USBSerial.print("0x");
|
|
USBSerial.print("0x");
|
|
- USBSerial.println(payload[i], HEX);
|
|
|
|
|
|
+ USBSerial.print(payload[i], HEX);
|
|
USBSerial.print(" ");
|
|
USBSerial.print(" ");
|
|
}
|
|
}
|
|
|
|
+ USBSerial.println();
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -277,7 +284,6 @@ void Sx1262::SetSleep() const
|
|
{
|
|
{
|
|
uint8_t *buffer = new uint8_t[1];
|
|
uint8_t *buffer = new uint8_t[1];
|
|
buffer[0] = 0x00;
|
|
buffer[0] = 0x00;
|
|
- logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "SX1262", "SetSleep with opcode 0x%02X and parameter 0x%02X", SX126X_SET_SLEEP, buffer[0]);
|
|
|
|
setOpMode(SX126X_SET_SLEEP, buffer, sizeof(buffer));
|
|
setOpMode(SX126X_SET_SLEEP, buffer, sizeof(buffer));
|
|
};
|
|
};
|
|
|
|
|
|
@@ -288,11 +294,9 @@ void Sx1262::SetSleep() const
|
|
void Sx1262::SetStandby() const
|
|
void Sx1262::SetStandby() const
|
|
{
|
|
{
|
|
uint8_t *buffer = new uint8_t[1];
|
|
uint8_t *buffer = new uint8_t[1];
|
|
- buffer[0] = 0x00;
|
|
|
|
|
|
+ buffer[0] = 0x00 ;
|
|
|
|
+ // return le number of bytes written in the array buffer
|
|
setOpMode(SX126X_SET_STANDBY, buffer , 1);
|
|
setOpMode(SX126X_SET_STANDBY, buffer , 1);
|
|
- logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "SX1262", "SetStandby with opcode 0x%02X and parameter 0x%02X", SX126X_SET_STANDBY, buffer[0]);
|
|
|
|
- getStatusCommand(SX126X_GET_STATUS);
|
|
|
|
-
|
|
|
|
};
|
|
};
|
|
|
|
|
|
void Sx1262::SetFS() const
|
|
void Sx1262::SetFS() const
|
|
@@ -336,19 +340,16 @@ void Sx1262::GetPacketType() const
|
|
void Sx1262::SetRfFrequency(uint32_t freq) const
|
|
void Sx1262::SetRfFrequency(uint32_t freq) const
|
|
{
|
|
{
|
|
uint8_t *buffer = new uint8_t[4];
|
|
uint8_t *buffer = new uint8_t[4];
|
|
|
|
+ /*
|
|
buffer[0] = (freq >> 24) & 0xFF;
|
|
buffer[0] = (freq >> 24) & 0xFF;
|
|
buffer[1] = (freq >> 16) & 0xFF;
|
|
buffer[1] = (freq >> 16) & 0xFF;
|
|
buffer[2] = (freq >> 8) & 0xFF;
|
|
buffer[2] = (freq >> 8) & 0xFF;
|
|
buffer[3] = freq & 0xFF;
|
|
buffer[3] = freq & 0xFF;
|
|
- logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "SX1262", "SetRfFrequency with opcode 0x%02X and parameters :", SX126X_SET_RF_FREQUENCY);
|
|
|
|
- USBSerial.print("0x");
|
|
|
|
- USBSerial.print(buffer[0], HEX);
|
|
|
|
- USBSerial.print(" 0x");
|
|
|
|
- USBSerial.print(buffer[1], HEX);
|
|
|
|
- USBSerial.print(" 0x");
|
|
|
|
- USBSerial.print(buffer[2], HEX);
|
|
|
|
- USBSerial.print(" 0x");
|
|
|
|
- USBSerial.print(buffer[3], HEX);
|
|
|
|
|
|
+ */
|
|
|
|
+ buffer[3] = 0x80;
|
|
|
|
+ buffer[2] = 0x66;
|
|
|
|
+ buffer[1] = 0x58;
|
|
|
|
+ buffer[0] = 0x36;
|
|
setOpMode(SX126X_SET_RF_FREQUENCY, buffer, 4);
|
|
setOpMode(SX126X_SET_RF_FREQUENCY, buffer, 4);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -416,9 +417,17 @@ void Sx1262::SetBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddress)
|
|
* @brief Set WriteBuffer
|
|
* @brief Set WriteBuffer
|
|
* Table 13-26: WriteBuffer SPI Transaction in datasheee
|
|
* Table 13-26: WriteBuffer SPI Transaction in datasheee
|
|
*/
|
|
*/
|
|
-void Sx1262::WriteBuffer(uint8_t *buffer, uint8_t size) const
|
|
|
|
-{
|
|
|
|
- setOpMode(SX126X_WRITE_BUFFER, buffer, size);
|
|
|
|
|
|
+void Sx1262::WriteBuffer(const char* buffer) const
|
|
|
|
+{
|
|
|
|
+ size_t length = strlen(buffer);
|
|
|
|
+ // on veut ajouter un byte 0x00 au début de notre buffer
|
|
|
|
+ // qui indique l'offset du buffer pour écriture
|
|
|
|
+ uint8_t *payload = new uint8_t[length];
|
|
|
|
+ payload[0] = 0x00;
|
|
|
|
+ for (uint8_t i = 1; i <= length; i++) {
|
|
|
|
+ payload[i] = buffer[i-1];
|
|
|
|
+ }
|
|
|
|
+ setOpMode(SX126X_WRITE_BUFFER, (uint8_t*)payload, length+1);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -426,9 +435,11 @@ void Sx1262::WriteBuffer(uint8_t *buffer, uint8_t size) const
|
|
*/
|
|
*/
|
|
void Sx1262::SetModulationParams(uint32_t bitrate, uint8_t pulseShape, uint8_t bandwidht, uint32_t fdev) const
|
|
void Sx1262::SetModulationParams(uint32_t bitrate, uint8_t pulseShape, uint8_t bandwidht, uint32_t fdev) const
|
|
{
|
|
{
|
|
|
|
+ // Table 13-43: Bitrate - GFSK ModParam1, ModParam2 & ModParam3
|
|
|
|
+ uint32_t newBr = (SX126X_CRYSTAL_FREQ * 1000000.0 * 32.0) / (bitrate * 1000.0);
|
|
uint8_t *buffer = new uint8_t[8];
|
|
uint8_t *buffer = new uint8_t[8];
|
|
- buffer[0] = (bitrate >> 16) & 0xFF;
|
|
|
|
- buffer[1] = (bitrate >> 8) & 0xFF;
|
|
|
|
|
|
+ buffer[0] = (newBr >> 16) & 0xFF;
|
|
|
|
+ buffer[1] = (newBr >> 8) & 0xFF;
|
|
buffer[2] = bitrate & 0xFF;
|
|
buffer[2] = bitrate & 0xFF;
|
|
buffer[3] = pulseShape;
|
|
buffer[3] = pulseShape;
|
|
buffer[4] = bandwidht;
|
|
buffer[4] = bandwidht;
|
|
@@ -441,9 +452,9 @@ void Sx1262::SetModulationParams(uint32_t bitrate, uint8_t pulseShape, uint8_t b
|
|
/*
|
|
/*
|
|
* @brief SetPacketParams
|
|
* @brief SetPacketParams
|
|
*/
|
|
*/
|
|
-void Sx1262::SetPacketParams(uint16_t preambleLength, uint8_t PreambleDetectorLength, uint8_t SyncWordLength, uint8_t AddrComp, uint8_t PacketType, uint8_t PayloadLength, uint8_t CRCType) const
|
|
|
|
|
|
+void Sx1262::SetPacketParams(uint16_t preambleLength, uint8_t PreambleDetectorLength, uint8_t SyncWordLength, uint8_t AddrComp, uint8_t PacketType, uint8_t PayloadLength, uint8_t CRCType, uint8_t Whitening) const
|
|
{
|
|
{
|
|
- uint8_t *buffer = new uint8_t[8];
|
|
|
|
|
|
+ uint8_t *buffer = new uint8_t[9];
|
|
buffer[0] = (preambleLength >> 8) & 0xFF;
|
|
buffer[0] = (preambleLength >> 8) & 0xFF;
|
|
buffer[1] = preambleLength & 0xFF;
|
|
buffer[1] = preambleLength & 0xFF;
|
|
buffer[2] = PreambleDetectorLength;
|
|
buffer[2] = PreambleDetectorLength;
|
|
@@ -452,9 +463,21 @@ void Sx1262::SetPacketParams(uint16_t preambleLength, uint8_t PreambleDetectorLe
|
|
buffer[5] = PacketType;
|
|
buffer[5] = PacketType;
|
|
buffer[6] = PayloadLength;
|
|
buffer[6] = PayloadLength;
|
|
buffer[7] = CRCType;
|
|
buffer[7] = CRCType;
|
|
- setOpMode(SX126X_SET_PKT_PARAMS, buffer, 8);
|
|
|
|
|
|
+ buffer[8] = 0x00;
|
|
|
|
+ setOpMode(SX126X_SET_PKT_PARAMS, buffer, 9);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * @brief SetDIO2AsRfSwitchCtrl
|
|
|
|
+ */
|
|
|
|
+void Sx1262::SetDIO2AsRfSwitchCtrl(uint8_t enable) const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[1];
|
|
|
|
+ buffer[0] = enable;
|
|
|
|
+ setOpMode(SX126X_SET_DIO2_AS_RF_SWITCH_CTRL, buffer, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* @brief SetDIO3AsTCXOCtrl
|
|
* @brief SetDIO3AsTCXOCtrl
|
|
*/
|
|
*/
|
|
@@ -471,8 +494,118 @@ void Sx1262::SetDIO3AsTCXOCtrl(uint8_t tcxoVoltage, uint32_t timeout) const
|
|
/*
|
|
/*
|
|
* @brief SetTx
|
|
* @brief SetTx
|
|
*/
|
|
*/
|
|
-void Sx1262::SetTx() const
|
|
|
|
|
|
+void Sx1262::SetTx(uint32_t timeout) const
|
|
{
|
|
{
|
|
- uint8_t *buffer = new uint8_t[0];
|
|
|
|
- setOpMode(SX126X_SET_TX, buffer, 0);
|
|
|
|
-}
|
|
|
|
|
|
+ uint8_t *buffer = new uint8_t[3];
|
|
|
|
+ buffer[0] = (timeout >> 16) & 0xFF;
|
|
|
|
+ buffer[1] = (timeout >> 8) & 0xFF;
|
|
|
|
+ buffer[2] = timeout & 0xFF;
|
|
|
|
+ setOpMode(SX126X_SET_TX, buffer, 3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief GetDeviceErrors
|
|
|
|
+ */
|
|
|
|
+void Sx1262::GetDeviceErrors() const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[3];
|
|
|
|
+ buffer[0] = 0x00;
|
|
|
|
+ buffer[1] = 0x00;
|
|
|
|
+ buffer[2] = 0x00;
|
|
|
|
+ setOpMode(SX126X_GET_DEVICE_ERRORS, buffer, 3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief ClearDeviceErrors
|
|
|
|
+ */
|
|
|
|
+void Sx1262::ClearDeviceErrors() const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[2];
|
|
|
|
+ buffer[0] = 0x00;
|
|
|
|
+ buffer[1] = 0x00;
|
|
|
|
+ setOpMode(SX126X_CLR_DEVICE_ERRORS, buffer, 2);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief SetRxTxFallbackMode
|
|
|
|
+ */
|
|
|
|
+void Sx1262::SetRxTxFallbackMode(uint8_t fallback_mode) const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[1];
|
|
|
|
+ buffer[0] = fallback_mode;
|
|
|
|
+ setOpMode(SX126X_SET_RX_TX_FALLBACK_MODE, buffer, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief ClearIRQStatus
|
|
|
|
+ */
|
|
|
|
+void Sx1262::ClearIRQStatus() const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[2];
|
|
|
|
+ buffer[0] = 0x43;
|
|
|
|
+ buffer[1] = 0xff;
|
|
|
|
+ setOpMode(SX126X_CLR_IRQ_STATUS, buffer, 2);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief SetDioIrqParams
|
|
|
|
+ */
|
|
|
|
+void Sx1262::SetDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask) const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[8];
|
|
|
|
+ buffer[0] = (irqMask >> 8) & 0xFF;
|
|
|
|
+ buffer[1] = irqMask & 0xFF;
|
|
|
|
+ buffer[2] = (dio1Mask >> 8) & 0xFF;
|
|
|
|
+ buffer[3] = dio1Mask & 0xFF;
|
|
|
|
+ buffer[4] = (dio2Mask >> 8) & 0xFF;
|
|
|
|
+ buffer[5] = dio2Mask & 0xFF;
|
|
|
|
+ buffer[6] = (dio3Mask >> 8) & 0xFF;
|
|
|
|
+ buffer[7] = dio3Mask & 0xFF;
|
|
|
|
+ setOpMode(SX126X_SET_DIO_IRQ_PARAMS, buffer, 8);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief Calibrate
|
|
|
|
+ */
|
|
|
|
+void Sx1262::Calibrate() const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[1];
|
|
|
|
+ buffer[0] = 0x7f;
|
|
|
|
+ setOpMode(SX126X_CALIBRATE, buffer, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* @brief CalibrateImage */
|
|
|
|
+void Sx1262::CalibrateImage(uint8_t freq1, uint8_t freq2) const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[2];
|
|
|
|
+ buffer[0] = freq1;
|
|
|
|
+ buffer[1] = freq2;
|
|
|
|
+ setOpMode(SX126X_CALIBRATE_IMAGE, buffer, 2);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief SetRegulatorMode
|
|
|
|
+ */
|
|
|
|
+void Sx1262::SetRegulatorMode(uint8_t mode) const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[1];
|
|
|
|
+ buffer[0] = mode;
|
|
|
|
+ setOpMode(SX126X_SET_REGULATOR_MODE, buffer, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * @brief SetCadParams
|
|
|
|
+ */
|
|
|
|
+void Sx1262::SetCadParams(uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout) const
|
|
|
|
+{
|
|
|
|
+ uint8_t *buffer = new uint8_t[6];
|
|
|
|
+ buffer[0] = cadSymbolNum;
|
|
|
|
+ buffer[1] = cadDetPeak;
|
|
|
|
+ buffer[2] = cadDetMin;
|
|
|
|
+ buffer[3] = cadExitMode;
|
|
|
|
+ buffer[4] = (cadTimeout >> 16) & 0xFF;
|
|
|
|
+ buffer[5] = (cadTimeout >> 8) & 0xFF;
|
|
|
|
+ buffer[6] = cadTimeout & 0xFF;
|
|
|
|
+ setOpMode(SX126X_SET_CAD_PARAMS, buffer, 6);
|
|
|
|
+}
|
|
|
|
+
|