Skip to content

Commit d7bdd93

Browse files
committed
Fix TX and RX operation using interrupt by modified _statusIrq to volatile
1 parent f718541 commit d7bdd93

File tree

13 files changed

+97
-35
lines changed

13 files changed

+97
-35
lines changed

examples/SX126x/SX126x_LoRa_receiver_continuous/SX126x_LoRa_receiver_continuous.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void setup() {
2626
LoRa.setFrequency(915000000);
2727

2828
// Set RX gain to boosted gain
29-
Serial.println("Set RX gain to power saving gain");
29+
Serial.println("Set RX gain to boosted gain");
3030
LoRa.setRxGain(SX126X_RX_GAIN_BOOSTED);
3131

3232
// Configure modulation parameter including spreading factor (SF), bandwidth (BW), and coding rate (CR)

examples/SX126x/SX126x_LoRa_receiver_listen/SX126x_LoRa_receiver_listen.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void setup() {
2626
LoRa.setFrequency(915000000);
2727

2828
// Set RX gain to boosted gain
29-
Serial.println("Set RX gain to power saving gain");
29+
Serial.println("Set RX gain to boosted gain");
3030
LoRa.setRxGain(SX126X_RX_GAIN_BOOSTED);
3131

3232
// Configure modulation parameter including spreading factor (SF), bandwidth (BW), and coding rate (CR)

examples/SX126x/SX126x_driver_rx/SX126x_driver_rx.ino

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ void settingFunction() {
115115
sx126x_writeRegister(SX126X_REG_LORA_SYNC_WORD_MSB, sw, 2);
116116
}
117117

118-
uint16_t receiveFunction(char* msg, uint8_t &len, uint32_t timeout) {
118+
uint16_t receiveFunction(char* message, uint8_t &len, uint32_t timeout) {
119119

120120
Serial.println("\n-- RECEIVE FUNCTION --");
121121

@@ -162,7 +162,7 @@ uint16_t receiveFunction(char* msg, uint8_t &len, uint32_t timeout) {
162162
Serial.println("Get received length and buffer base address");
163163
uint8_t payloadLengthRx, rxStartBufferPointer;
164164
sx126x_getRxBufferStatus(&payloadLengthRx, &rxStartBufferPointer);
165-
uint8_t message[payloadLengthRx];
165+
uint8_t msgUint8[payloadLengthRx];
166166

167167
// Get and display packet status
168168
Serial.println("Get received packet status");
@@ -181,11 +181,11 @@ uint16_t receiveFunction(char* msg, uint8_t &len, uint32_t timeout) {
181181
// Read message from buffer
182182
Serial.println("Read message from buffer");
183183
Serial.print("Message in bytes : [ ");
184-
sx126x_readBuffer(rxStartBufferPointer, message, payloadLengthRx);
184+
sx126x_readBuffer(rxStartBufferPointer, msgUint8, payloadLengthRx);
185185
len = payloadLengthRx;
186186
for (uint8_t i=0; i<len; i++){
187-
msg[i] = (char) message[i];
188-
Serial.print((uint8_t) message[i]);
187+
message[i] = (char) msgUint8[i];
188+
Serial.print(msgUint8[i]);
189189
Serial.print(" ");
190190
}
191191
Serial.println("]");
@@ -199,7 +199,7 @@ void setup() {
199199
// Begin serial communication
200200
Serial.begin(38400);
201201

202-
// Seetings for LoRa communication
202+
// Settings for LoRa communication
203203
settingFunction();
204204
}
205205

examples/SX126x/SX126x_driver_tx/SX126x_driver_tx.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ void setup() {
197197
// Begin serial communication
198198
Serial.begin(38400);
199199

200-
// Seetings for LoRa communication
200+
// Settings for LoRa communication
201201
settingFunction();
202202
}
203203

examples/SX127x/SX127x_LoRa_receiver_callback/SX127x_LoRa_receiver_callback.ino

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
SX127x LoRa;
44

5-
// receive data length and pointer
6-
const uint8_t packetLength = 15;
7-
uint8_t packetData[packetLength];
8-
volatile bool flag = false;
5+
// receive data container and length
6+
const uint8_t maxLength = 15;
7+
volatile uint8_t packetLength = 0;
8+
uint8_t packetData[maxLength];
99

1010
void setup() {
1111

@@ -25,7 +25,7 @@ void setup() {
2525
LoRa.setFrequency(915E6);
2626

2727
// Set RX gain to boosted gain
28-
Serial.println("Set RX gain to power saving gain");
28+
Serial.println("Set RX gain to boosted gain");
2929
LoRa.setRxGain(SX127X_RX_GAIN_BOOSTED);
3030

3131
// Configure modulation parameter including spreading factor (SF), bandwidth (BW), and coding rate (CR)
@@ -56,7 +56,7 @@ void setup() {
5656

5757
void loop() {
5858

59-
if (flag) {
59+
if (packetLength) {
6060
// Print received package
6161
Serial.write(packetData, packetLength - 1);
6262
Serial.print(" ");
@@ -70,17 +70,18 @@ void loop() {
7070
Serial.println(" dB");
7171
Serial.println();
7272

73-
// Reset flag
74-
flag = false;
73+
// Reset receive data container length
74+
packetLength = 0;
7575
}
7676
}
7777

7878
void getReceiveData() {
7979

80-
// set flag
81-
flag = true;
82-
// Store received data
83-
for (uint8_t i=0; i<packetLength; i++) {
84-
packetData[i] = LoRa.read();
80+
// set received length
81+
packetLength = LoRa.available();
82+
if (packetLength > maxLength) {
83+
packetLength = maxLength;
8584
}
85+
// Store received data
86+
LoRa.read(packetData, packetLength);
8687
}

examples/SX127x/SX127x_LoRa_receiver_timeout/SX127x_LoRa_receiver_timeout.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void setup() {
2020
LoRa.setFrequency(915E6);
2121

2222
// Set RX gain to boosted gain
23-
Serial.println("Set RX gain to power saving gain");
23+
Serial.println("Set RX gain to boosted gain");
2424
LoRa.setRxGain(SX127X_RX_GAIN_BOOSTED);
2525

2626
// Configure modulation parameter including spreading factor (SF), bandwidth (BW), and coding rate (CR)

examples/SX127x/SX127x_LoRa_transmitter/SX127x_LoRa_transmitter.ino

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ void setup() {
2929
Serial.println("Set frequency to 915 Mhz");
3030
LoRa.setFrequency(915E6);
3131

32-
// Set RX gain. RX gain option are power saving gain or boosted gain
33-
Serial.println("Set RX gain to power saving gain");
32+
// Set TX power, this function will set PA config with optimal setting for requested TX power
33+
Serial.println("Set TX power to +17 dBm");
3434
LoRa.setTxPower(17, SX127X_TX_POWER_PA_BOOST); // TX power +17 dBm using PA boost pin
3535

3636
// Configure modulation parameter including spreading factor (SF), bandwidth (BW), and coding rate (CR)

examples/SX127x/SX127x_driver_rx/SX127x_driver_rx.ino

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <SX127x_driver.h>
22

33
// Pin setting
4-
int8_t nssPin = 10, resetPin = 9, irqPin = 2, rxenPin = 7, txenPin = 8;
4+
int8_t nssPin = 10, resetPin = 9, irqPin = 2, rxenPin = -1, txenPin = -1;
55

66
// RF frequency setting
77
uint32_t frequency = 915000000;
@@ -37,6 +37,10 @@ void settingFunction() {
3737
Serial.println("Setting pins");
3838
sx127x_setPins(nssPin);
3939
pinMode(irqPin, INPUT);
40+
if (txenPin != -1 && rxenPin != -1) {
41+
pinMode(txenPin, OUTPUT);
42+
pinMode(rxenPin, OUTPUT);
43+
}
4044

4145
// Reset RF module by setting resetPin to LOW and begin SPI communication
4246
sx127x_reset(resetPin);
@@ -64,6 +68,15 @@ void settingFunction() {
6468
Serial.print(frequency / 1000000);
6569
Serial.println(" MHz");
6670

71+
// Set rx gain to selected gain
72+
Serial.print("Set RX gain to ");
73+
if (boost == SX127X_RX_GAIN_POWER_SAVING) Serial.println("power saving gain");
74+
else if (boost == SX127X_RX_GAIN_BOOSTED) Serial.println("boosted gain");
75+
uint8_t LnaBoostHf = boost ? 0x03 : 0x00;
76+
uint8_t AgcOn = level == SX127X_RX_GAIN_AUTO ? 0x01 : 0x00;
77+
sx127x_writeRegister(SX127X_REG_LNA, LnaBoostHf | (level << 5));
78+
sx127x_writeBits(SX127X_REG_MODEM_CONFIG_3, AgcOn, 2, 1);
79+
6780
// Set modulation param and packet param
6881
Serial.println("Set modulation with predefined parameters");
6982
Serial.println("Set packet with predefined parameters");
@@ -107,6 +120,12 @@ uint8_t receiveFunction(char* message, uint8_t &length) {
107120
Serial.println("Attach interrupt on IRQ pin");
108121
attachInterrupt(digitalPinToInterrupt(irqPin), checkReceiveDone, RISING);
109122

123+
// Set txen and rxen pin state for receiving packet
124+
if (txenPin != -1 && rxenPin != -1) {
125+
digitalWrite(txenPin, LOW);
126+
digitalWrite(rxenPin, HIGH);
127+
}
128+
110129
// Receive message
111130
Serial.println("Receiving message...");
112131
sx127x_writeRegister(SX127X_REG_OP_MODE, SX127X_LORA_MODEM | SX127X_MODE_RX_CONTINUOUS);
@@ -126,6 +145,9 @@ uint8_t receiveFunction(char* message, uint8_t &length) {
126145
uint8_t irqStat = sx127x_readRegister(SX127X_REG_IRQ_FLAGS);
127146
sx127x_writeRegister(SX127X_REG_IRQ_FLAGS, SX127X_IRQ_RX_DONE);
128147
Serial.println("Clear IRQ status");
148+
if (rxenPin != -1) {
149+
digitalWrite(rxenPin, LOW);
150+
}
129151

130152
// Get FIFO address of received message and configure address pointer
131153
reg = sx127x_readRegister(SX127X_REG_FIFO_RX_CURRENT_ADDR);
@@ -140,6 +162,15 @@ uint8_t receiveFunction(char* message, uint8_t &length) {
140162
Serial.print(length);
141163
Serial.println(")");
142164

165+
// Get and display packet status
166+
Serial.println("Get received packet status");
167+
float rssi = ((int16_t) sx127x_readRegister(SX127X_REG_PKT_RSSI_VALUE) - SX127X_RSSI_OFFSET_HF);
168+
float snr = (int8_t) sx127x_readRegister(SX127X_REG_PKT_SNR_VALUE) / 4.0;
169+
Serial.print("Packet status: RSSI = ");
170+
Serial.print(rssi);
171+
Serial.print(" | SNR = ");
172+
Serial.println(snr);
173+
143174
// Read message from buffer
144175
Serial.print("Message in bytes : [ ");
145176
for (uint8_t i = 0; i < length; i++) {

examples/SX127x/SX127x_driver_tx/SX127x_driver_tx.ino

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#include <SX127x_driver.h>
22

33
// Pin setting
4-
int8_t nssPin = 10, resetPin = 9, irqPin = 2, rxenPin = 7, txenPin = 8;
4+
int8_t nssPin = 10, resetPin = 9, irqPin = 2, rxenPin = -1, txenPin = -1;
55

66
// RF frequency setting
77
uint32_t frequency = 915000000;
88

99
// PA and TX power setting
10+
uint8_t paConfig = 0xC0;
1011
uint8_t txPower = 17;
1112
uint8_t paPin = SX127X_TX_POWER_PA_BOOST;
1213

@@ -37,6 +38,10 @@ void settingFunction() {
3738
Serial.println("Setting pins");
3839
sx127x_setPins(nssPin);
3940
pinMode(irqPin, INPUT);
41+
if (txenPin != -1 && rxenPin != -1) {
42+
pinMode(txenPin, OUTPUT);
43+
pinMode(rxenPin, OUTPUT);
44+
}
4045

4146
// Reset RF module by setting resetPin to LOW and begin SPI communication
4247
sx127x_reset(resetPin);
@@ -64,6 +69,15 @@ void settingFunction() {
6469
Serial.print(frequency / 1000000);
6570
Serial.println(" MHz");
6671

72+
// Set tx power to selected TX power
73+
Serial.print("Set TX power to ");
74+
Serial.print(txPower, DEC);
75+
Serial.println(" dBm");
76+
uint8_t outputPower = txPower - 2;
77+
uint8_t paDac = txPower > 17 ? 0x07 : 0x04;
78+
sx127x_writeRegister(SX127X_REG_PA_DAC, paDac);
79+
sx127x_writeRegister(SX127X_REG_PA_CONFIG, paConfig | outputPower);
80+
6781
// Set modulation param and packet param
6882
Serial.println("Set modulation with predefined parameters");
6983
Serial.println("Set packet with predefined parameters");
@@ -137,6 +151,12 @@ uint8_t transmitFunction(char* message, uint8_t length) {
137151
Serial.println("Attach interrupt on IRQ pin");
138152
attachInterrupt(digitalPinToInterrupt(irqPin), checkTransmitDone, RISING);
139153

154+
// Set txen and rxen pin state for transmitting packet
155+
if (txenPin != -1 && rxenPin != -1) {
156+
digitalWrite(txenPin, HIGH);
157+
digitalWrite(rxenPin, LOW);
158+
}
159+
140160
// Transmit message
141161
Serial.println("Transmitting message...");
142162
sx127x_writeRegister(SX127X_REG_OP_MODE, SX127X_LORA_MODEM | SX127X_MODE_TX);
@@ -159,6 +179,9 @@ uint8_t transmitFunction(char* message, uint8_t length) {
159179
uint8_t irqStat = sx127x_readRegister(SX127X_REG_IRQ_FLAGS);
160180
sx127x_writeRegister(SX127X_REG_IRQ_FLAGS, 0xFF);
161181
Serial.println("Clear IRQ status");
182+
if (txenPin != -1) {
183+
digitalWrite(txenPin, LOW);
184+
}
162185

163186
// return interrupt status
164187
return irqStat;

src/SX126x.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ void (*SX126x::_onTransmit)();
44

55
void (*SX126x::_onReceive)();
66

7-
uint16_t SX126x::_statusIrq = 0xFFFF;
7+
volatile uint16_t SX126x::_statusIrq = 0xFFFF;
88

99
uint32_t SX126x::_transmitTime = 0;
1010

@@ -745,7 +745,9 @@ void SX126x::_interruptTx()
745745
detachInterrupt(_irqStatic);
746746

747747
// store IRQ status
748-
sx126x_getIrqStatus(&_statusIrq);
748+
uint16_t buf;
749+
sx126x_getIrqStatus(&buf);
750+
_statusIrq = buf;
749751

750752
// call onTransmit function
751753
if (_onTransmit) {
@@ -761,7 +763,9 @@ void SX126x::_interruptRx()
761763
sx126x_fixRxTimeout();
762764

763765
// store IRQ status
764-
sx126x_getIrqStatus(&_statusIrq);
766+
uint16_t buf;
767+
sx126x_getIrqStatus(&buf);
768+
_statusIrq = buf;
765769

766770
// get received payload length and buffer index
767771
sx126x_getRxBufferStatus(&_payloadTxRx, &_bufferIndex);
@@ -775,7 +779,9 @@ void SX126x::_interruptRx()
775779
void SX126x::_interruptRxContinuous()
776780
{
777781
// store IRQ status
778-
sx126x_getIrqStatus(&_statusIrq);
782+
uint16_t buf;
783+
sx126x_getIrqStatus(&buf);
784+
_statusIrq = buf;
779785

780786
// clear IRQ status
781787
sx126x_clearIrqStatus(0x03FF);

0 commit comments

Comments
 (0)