Skip to content

Commit 57e28d1

Browse files
committed
Add receive callback mode using DIO0
1 parent d27bc56 commit 57e28d1

File tree

6 files changed

+129
-6
lines changed

6 files changed

+129
-6
lines changed

API.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ Returns `1` on success, `0` on failure.
2424
Override the default `NSS` and `NRESET` pins used by the library. **Must** be called before `LoRa.begin()`.
2525

2626
```arduino
27-
LoRa.setPins(ss, reset);
27+
LoRa.setPins(ss, reset, dio0);
2828
```
2929
* `ss` new slave select pin to use, defaults to `10`
3030
* `reset` new reset pin to use, defaults to `9`
31+
* `dio0` new DIO0 pin to use, defaults to `2`
3132

3233
### End
3334

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ An [Arduino](http://arduino.cc/) library for sending and receiving data using [L
2121
| MOSI | MOSI |
2222
| NSS | 10 |
2323
| NRESET | 9 |
24+
| DIO0 | 2 |
2425

2526

26-
`NSS` and `NRESET` pins can be changed by using `LoRa.setPins(ss, reset)`.
27+
`NSS`, `NRESET`, and `DIO0` pins can be changed by using `LoRa.setPins(ss, reset, dio0)`. `DIO0` pin is optional, it is only needed for receive callback mode.
2728

2829
## Installation
2930

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <SPI.h>
2+
#include <LoRa.h>
3+
4+
void setup() {
5+
Serial.begin(9600);
6+
while (!Serial);
7+
8+
Serial.println("LoRa Receiver Callback");
9+
10+
if (!LoRa.begin(915E6)) {
11+
Serial.println("Starting LoRa failed!");
12+
while (1);
13+
}
14+
15+
// register the receive callback
16+
LoRa.onReceive(onReceive);
17+
18+
// put the radio into receive mode
19+
LoRa.receive();
20+
}
21+
22+
void loop() {
23+
// do nothing
24+
}
25+
26+
void onReceive(int packetSize) {
27+
// received a packet
28+
Serial.print("Received packet '");
29+
30+
// read packet
31+
for (int i = 0; i < packetSize; i++) {
32+
Serial.print((char)LoRa.read());
33+
}
34+
35+
// print RSSI of packet
36+
Serial.print("' with RSSI ");
37+
Serial.println(LoRa.packetRssi());
38+
}
39+

keywords.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ read KEYWORD2
2828
peek KEYWORD2
2929
flush KEYWORD2
3030

31+
onReceive KEYWORD2
32+
receive KEYWORD2
33+
idle KEYWORD2
34+
sleep KEYWORD2
35+
3136
setPins KEYWORD2
3237
dumpRegisters KEYWORD2
3338

src/LoRa.cpp

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
#define REG_RX_NB_BYTES 0x13
1616
#define REG_PKT_RSSI_VALUE 0x1a
1717
#define REG_PAYLOAD_LENGTH 0x22
18+
#define REG_DIO_MAPPING_1 0x40
1819
#define REG_VERSION 0x42
1920

2021
// modes
2122
#define MODE_LONG_RANGE_MODE 0x80
2223
#define MODE_SLEEP 0x00
2324
#define MODE_STDBY 0x01
2425
#define MODE_TX 0x03
26+
#define MODE_RX_CONTINUOUS 0x05
2527
#define MODE_RX_SINGLE 0x06
2628

2729
// PA config
@@ -35,9 +37,10 @@
3537

3638
LoRaClass::LoRaClass() :
3739
_spiSettings(10E6, MSBFIRST, SPI_MODE0),
38-
_ss(10), _reset(9),
40+
_ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN),
3941
_frequency(0),
40-
_packetIndex(0)
42+
_packetIndex(0),
43+
_onReceive(NULL)
4144
{
4245
}
4346

@@ -225,10 +228,39 @@ void LoRaClass::flush()
225228
{
226229
}
227230

228-
void LoRaClass::setPins(int ss, int reset)
231+
void LoRaClass::onReceive(void(*callback)(int))
232+
{
233+
_onReceive = callback;
234+
235+
if (callback) {
236+
writeRegister(REG_DIO_MAPPING_1, 0x00);
237+
238+
attachInterrupt(digitalPinToInterrupt(_dio0), LoRaClass::onDio0Rise, RISING);
239+
} else {
240+
detachInterrupt(digitalPinToInterrupt(_dio0));
241+
}
242+
}
243+
244+
void LoRaClass::receive()
245+
{
246+
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
247+
}
248+
249+
void LoRaClass::idle()
250+
{
251+
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY);
252+
}
253+
254+
void LoRaClass::sleep()
255+
{
256+
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
257+
}
258+
259+
void LoRaClass::setPins(int ss, int reset, int dio0)
229260
{
230261
_ss = ss;
231262
_reset = reset;
263+
_dio0 = dio0;
232264
}
233265

234266
void LoRaClass::dumpRegisters(Stream& out)
@@ -241,6 +273,30 @@ void LoRaClass::dumpRegisters(Stream& out)
241273
}
242274
}
243275

276+
void LoRaClass::handleDio0Rise()
277+
{
278+
int irqFlags = readRegister(REG_IRQ_FLAGS);
279+
280+
// clear IRQ's
281+
writeRegister(REG_IRQ_FLAGS, irqFlags);
282+
283+
// received a packet
284+
_packetIndex = 0;
285+
286+
// read packet length
287+
int packetLength = readRegister(REG_RX_NB_BYTES);
288+
289+
// set FIFO address to current RX address
290+
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));
291+
292+
if (_onReceive) {
293+
_onReceive(packetLength);
294+
}
295+
296+
// reset FIFO address
297+
writeRegister(REG_FIFO_ADDR_PTR, 0);
298+
}
299+
244300
uint8_t LoRaClass::readRegister(uint8_t address)
245301
{
246302
return singleTransfer(address & 0x7f, 0x00);
@@ -267,4 +323,9 @@ uint8_t LoRaClass::singleTransfer(uint8_t address, uint8_t value)
267323
return response;
268324
}
269325

326+
void LoRaClass::onDio0Rise()
327+
{
328+
LoRa.handleDio0Rise();
329+
}
330+
270331
LoRaClass LoRa;

src/LoRa.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
#include <Arduino.h>
55
#include <SPI.h>
66

7+
#define LORA_DEFAULT_SS_PIN 10
8+
#define LORA_DEFAULT_RESET_PIN 9
9+
#define LORA_DEFAULT_DIO0_PIN 2
10+
711
class LoRaClass : public Stream {
812
public:
913
LoRaClass();
@@ -27,21 +31,33 @@ class LoRaClass : public Stream {
2731
virtual int peek();
2832
virtual void flush();
2933

30-
void setPins(int ss, int reset);
34+
void onReceive(void(*callback)(int));
35+
36+
void receive();
37+
void idle();
38+
void sleep();
39+
40+
void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN);
3141

3242
void dumpRegisters(Stream& out);
3343

3444
private:
45+
void handleDio0Rise();
46+
3547
uint8_t readRegister(uint8_t address);
3648
void writeRegister(uint8_t address, uint8_t value);
3749
uint8_t singleTransfer(uint8_t address, uint8_t value);
3850

51+
static void onDio0Rise();
52+
3953
private:
4054
SPISettings _spiSettings;
4155
int _ss;
4256
int _reset;
57+
int _dio0;
4358
int _frequency;
4459
int _packetIndex;
60+
void (*_onReceive)(int);
4561
};
4662

4763
extern LoRaClass LoRa;

0 commit comments

Comments
 (0)