This program is guided to help establish a connection between two RFM95 900MHz LoRa radio modules using Maxim Integrated's Feather MCUs (MAX32630FTHR Mbed and the MAX32620FTHR Mbed). Once the radios are configured after powering on and if the radios are wired correctly, the two radios will self identify as either a master or a slave, and will then proceed to PING and PONG back and forth. Information about what is happening between the radios can be seen if the two boards are hooked up to a USB COM port through the included DAPLINK modules.

Dependencies:   BMI160 BufferedSerial SX1276GenericLib USBDeviceHT max32630fthr

Fork of MAX326xxFTHR_LoRa_RFM95 by Central Applications - Mbed Code repo

RFM95 LoRa Example Ping Pong Program

Getting Started

This program has the support for sx1276 (Adafruit RFM95W LoRa Radio Transceiver Breakout - 900 MHz) and (Adafruit LoRa Radio FeatherWing - RFM95W 900 MHz) to work with a few different mbed boards (see PinMap.h for supported boards). However, this specific program is set up to work with the following mbed boards and RFM95 915MHz LoRa radios and the given pin diagrams without modifications: MAX32620FTHR and MAX32630FTHR.

Configuring the LoRa Radio

The setup for the radio can be found in <<SX1276GenericPingPong/GenericPingPong.cpp>>, which can be found by navigating from the root directory. Setup for the radio starts on line #14 in <<SX1276GenericPingPong/GenericPingPong.cpp>>.

Choosing the Correct Frequency

This program was written with libraries compatible with RFM95 LoRa 900MHz Radio modules. The radio's frequency is able to be tuned dynamically, however this program configures the frequency by programming registers at device power on. The 900MHz module supports both 868MHz and 915MHz operation. Check local laws for which band around 900MHz is set aside for the scientific, commercial, and/or license free usage in your country. The supported frequencies can be found in <<SX1276GenericLib.lib/sx1276/sx1276.h>>

They are also listed below for convenience:

SX1276GenericLib.lib/sx1276/sx1276.h

typedef enum {
    RF_FREQUENCY_868_0 = 868000000, //Hz
    RF_FREQUENCY_868_1 = 868100000, //Hz
    RF_FREQUENCY_868_3 = 868300000, //Hz
    RF_FREQUENCY_868_5 = 868500000, //Hz
    RF_FREQUENCY_915_0 = 915000000, //Hz
    RF_FREQUENCY_915_1 = 915100000, //Hz
    RF_FREQUENCY_915_3 = 915300000, //Hz
    RF_FREQUENCY_915_5 = 915500000, //Hz
} rf_frequency_t;

Please chose a supported frequency above that is compatible with your RFM95 (or likewise single band compatible sx1276 radio) module and change line #22 in <<SX1276GenericPingPong/GenericPingPong.cpp>> to the correct enum above.

Wiring

This program is aimed at working without modifications with RFM95W LoRa 900MHz modules in both a Breakout board and a FeatherWing version.

FeatherWing setup

This wiring diagram is useful if your RFM95W LoRa 900MHz module is a Feather wing made by Adafruit.

Before jumpers are soldered in:

/media/uploads/dev_alexander/feather_pinouts.jpg

After jumpers are soldered in:

/media/uploads/dev_alexander/rfm95_feather_pinouts_drawn_in.jpg

Note: The default pin configurations for the radio in this program (found in <<PinMap.h>> under targets MAX32630FTHR and MAX32630FTHR ) can be changed to suite additional modifications built from a fork of this program repo. If this is the case, the diagrams above will need to be changed to suite the new pin map.

For more information, a detailed wiring guide for the RFM95W Featherwing can be found here.

Breakout Board

For a breakout board, the following wiring diagram will work with both the MAX32630FTHR and the MAX32630FTHR mbed boards if wired in the same locations:

Before the RFM95W is connected with wires:

/media/uploads/dev_alexander/rfm95_breakout_pinouts.jpg

After the RFM95W is connected with wires:

/media/uploads/dev_alexander/rfm95_breakout_pinouts_drawn_in.jpg

The representations of the connections above can be found in<<PinName.h>> under targets MAX32630FTHR and MAX32630FTHR.

This default pin configuration will set you up with a connection to the MCU.

For more information, a detailed wiring guide for the RFM95W Brakout Board can be found here.

Antenna

Since this is radio communication, we are going to need antennas to be attached to both of the Radios used in this example.

For more information on how to solder an antenna to the RFM95, please click here

Committer:
dev_alexander
Date:
Mon Jun 04 21:05:02 2018 +0000
Revision:
20:c57404b94a1d
Parent:
19:9f035b9e65ec
Deleted unused library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut64 0:c43b6919ae15 1 /*
Helmut64 17:98f2528e8399 2 * Copyright (c) 2018 Helmut Tschemernjak
Helmut64 0:c43b6919ae15 3 * 30826 Garbsen (Hannover) Germany
Helmut64 0:c43b6919ae15 4 * Licensed under the Apache License, Version 2.0);
Helmut64 0:c43b6919ae15 5 */
Helmut64 0:c43b6919ae15 6
Helmut64 0:c43b6919ae15 7
Helmut64 0:c43b6919ae15 8
Helmut64 0:c43b6919ae15 9 #ifdef TARGET_NUCLEO_L476RG
Helmut64 16:675f4d0ee9e9 10 #define FEATURE_LORA
Helmut64 16:675f4d0ee9e9 11
Helmut64 9:2f9e4be4d046 12 #elif TARGET_DISCO_L072CZ_LRWAN1
Helmut64 16:675f4d0ee9e9 13 #define FEATURE_LORA
Helmut64 16:675f4d0ee9e9 14
Helmut64 16:675f4d0ee9e9 15 #elif TARGET_STM32L432KC
Helmut64 16:675f4d0ee9e9 16 #define HELTEC_STM32L4
Helmut64 16:675f4d0ee9e9 17 #define FEATURE_LORA
Helmut64 16:675f4d0ee9e9 18 #define FEATURE_USBSERIAL
Helmut64 0:c43b6919ae15 19 #endif
Helmut64 0:c43b6919ae15 20
Helmut64 0:c43b6919ae15 21
Helmut64 0:c43b6919ae15 22
Helmut64 13:5a32a1922fbc 23 #if defined(TARGET_DISCO_L072CZ_LRWAN1)
Helmut64 17:98f2528e8399 24 #define LED LED2
Helmut64 0:c43b6919ae15 25
Helmut64 0:c43b6919ae15 26 #define LORA_SPI_MOSI PA_7
Helmut64 0:c43b6919ae15 27 #define LORA_SPI_MISO PA_6
Helmut64 0:c43b6919ae15 28 #define LORA_SPI_SCLK PB_3
Helmut64 0:c43b6919ae15 29 #define LORA_CS PA_15
Helmut64 0:c43b6919ae15 30 #define LORA_RESET PC_0
Helmut64 0:c43b6919ae15 31 #define LORA_DIO0 PB_4
Helmut64 0:c43b6919ae15 32 #define LORA_DIO1 PB_1
Helmut64 0:c43b6919ae15 33 #define LORA_DIO2 PB_0
Helmut64 13:5a32a1922fbc 34 #define LORA_DIO3 PC_13
Helmut64 0:c43b6919ae15 35 #define LORA_DIO4 PA_5
Helmut64 0:c43b6919ae15 36 #define LORA_DIO5 PA_4
Helmut64 0:c43b6919ae15 37 #define LORA_ANT_RX PA_1
Helmut64 0:c43b6919ae15 38 #define LORA_ANT_TX PC_2
Helmut64 0:c43b6919ae15 39 #define LORA_ANT_BOOST PC_1
Helmut64 0:c43b6919ae15 40 #define LORA_TCXO PA_12 // 32 MHz
Helmut64 0:c43b6919ae15 41
Helmut64 0:c43b6919ae15 42
Helmut64 0:c43b6919ae15 43
Helmut64 0:c43b6919ae15 44 #elif defined(TARGET_NUCLEO_L476RG) // using the RFM95 board
Helmut64 0:c43b6919ae15 45
Helmut64 0:c43b6919ae15 46 #define LORA_SPI_MOSI PC_12
Helmut64 0:c43b6919ae15 47 #define LORA_SPI_MISO PC_11
Helmut64 0:c43b6919ae15 48 #define LORA_SPI_SCLK PC_10
Helmut64 0:c43b6919ae15 49 #define LORA_CS PA_0
Helmut64 0:c43b6919ae15 50 #define LORA_RESET PA_1
Helmut64 0:c43b6919ae15 51 #define LORA_DIO0 PD_2 // DIO0=TxDone/RXDone
Helmut64 0:c43b6919ae15 52 #define LORA_DIO1 PB_7 //
Helmut64 0:c43b6919ae15 53 #define LORA_DIO2 PC_14 // DIO2=FhssChangeChannel
Helmut64 0:c43b6919ae15 54 #define LORA_DIO3 PC_15 // DIO3=CADDone
Helmut64 0:c43b6919ae15 55 #define LORA_DIO4 PH_0 // ????
Helmut64 0:c43b6919ae15 56 #define LORA_DIO5 NC // unused?
Helmut64 0:c43b6919ae15 57
Helmut64 16:675f4d0ee9e9 58 #elif defined (HELTEC_STM32L4)
Helmut64 16:675f4d0ee9e9 59
Helmut64 17:98f2528e8399 60 #define USER_BUTTON PH_3 // boot pin
Helmut64 17:98f2528e8399 61 #define LED PB_0 // red
Helmut64 17:98f2528e8399 62 #define LED2 PB_1 // green
Helmut64 18:d5527ce82e6b 63 #define LED1 LED
Helmut64 17:98f2528e8399 64
Helmut64 16:675f4d0ee9e9 65 #define POWER_VEXT PA_3
Helmut64 16:675f4d0ee9e9 66 #define POWER_VEXT_ON 0
Helmut64 16:675f4d0ee9e9 67 #define POWER_VEXT_OFF 1
Helmut64 16:675f4d0ee9e9 68
Helmut64 17:98f2528e8399 69
Helmut64 16:675f4d0ee9e9 70 #define LORA_SPI_MOSI PA_7
Helmut64 16:675f4d0ee9e9 71 #define LORA_SPI_MISO PA_6
Helmut64 18:d5527ce82e6b 72 #define LORA_SPI_SCLK PA_5
Helmut64 16:675f4d0ee9e9 73 #define LORA_CS PA_4
Helmut64 16:675f4d0ee9e9 74 #define LORA_RESET PA_1
Helmut64 16:675f4d0ee9e9 75 #define LORA_DIO0 PA_0 // DIO0=TxDone/RXDone/CADDone
Helmut64 16:675f4d0ee9e9 76 #define LORA_DIO1 NC //
Helmut64 16:675f4d0ee9e9 77 #define LORA_DIO2 NC //
Helmut64 16:675f4d0ee9e9 78 #define LORA_DIO3 NC //
Helmut64 16:675f4d0ee9e9 79 #define LORA_DIO4 NC //
Helmut64 16:675f4d0ee9e9 80 #define LORA_DIO5 NC //
Helmut64 16:675f4d0ee9e9 81
Helmut64 15:c70f65d606c4 82 #elif defined(TARGET_NUCLEO_L432KC) // using the RFM95 board
Helmut64 15:c70f65d606c4 83
Helmut64 17:98f2528e8399 84 // #define LED PB_3 // green
Helmut64 17:98f2528e8399 85 #define LED PB_5 // green
Helmut64 15:c70f65d606c4 86
Helmut64 17:98f2528e8399 87 #define LORA_SPI_MOSI PA_7
Helmut64 17:98f2528e8399 88 #define LORA_SPI_MISO PA_6
Helmut64 17:98f2528e8399 89 #define LORA_SPI_SCLK PB_5
Helmut64 17:98f2528e8399 90 #define LORA_CS PA_4
Helmut64 15:c70f65d606c4 91 #define LORA_RESET PA_1
Helmut64 17:98f2528e8399 92 #define LORA_DIO0 PA_0 // DIO0=TxDone/RXDone/CADDone
Helmut64 15:c70f65d606c4 93 #define LORA_DIO1 NC //
Helmut64 15:c70f65d606c4 94 #define LORA_DIO2 NC //
Helmut64 15:c70f65d606c4 95 #define LORA_DIO3 NC //
Helmut64 15:c70f65d606c4 96 #define LORA_DIO4 NC //
Helmut64 16:675f4d0ee9e9 97 #define LORA_DIO5 NC //
Helmut64 16:675f4d0ee9e9 98
Helmut64 17:98f2528e8399 99
dev_alexander 19:9f035b9e65ec 100 #elif defined(TARGET_NUCLEO_F411RE) // using the RFM95 board
dev_alexander 19:9f035b9e65ec 101
dev_alexander 19:9f035b9e65ec 102 #define LED LED1 // green
dev_alexander 19:9f035b9e65ec 103
dev_alexander 19:9f035b9e65ec 104 #define LORA_SPI_MOSI PC_12
dev_alexander 19:9f035b9e65ec 105 #define LORA_SPI_MISO PC_11
dev_alexander 19:9f035b9e65ec 106 #define LORA_SPI_SCLK PC_10
dev_alexander 19:9f035b9e65ec 107 #define LORA_CS PA_0
dev_alexander 19:9f035b9e65ec 108 #define LORA_RESET PA_1
dev_alexander 19:9f035b9e65ec 109 #define LORA_DIO0 PD_2 // DIO0=TxDone/RXDone
dev_alexander 19:9f035b9e65ec 110 #define LORA_DIO1 PB_7 //
dev_alexander 19:9f035b9e65ec 111 #define LORA_DIO2 PC_14 // DIO2=FhssChangeChannel
dev_alexander 19:9f035b9e65ec 112 #define LORA_DIO3 PC_15 // DIO3=CADDone
dev_alexander 19:9f035b9e65ec 113 #define LORA_DIO4 PH_0 // ????
dev_alexander 19:9f035b9e65ec 114 #define LORA_DIO5 NC // unused?
dev_alexander 19:9f035b9e65ec 115
dev_alexander 19:9f035b9e65ec 116
dev_alexander 19:9f035b9e65ec 117 #elif defined(TARGET_MAX32630FTHR) // using the RFM95 board
dev_alexander 19:9f035b9e65ec 118
dev_alexander 19:9f035b9e65ec 119 // #define LED PB_3 // green
dev_alexander 19:9f035b9e65ec 120 #define LED LED2 // green
dev_alexander 19:9f035b9e65ec 121
dev_alexander 19:9f035b9e65ec 122 #define LORA_SPI_MOSI P5_1
dev_alexander 19:9f035b9e65ec 123 #define LORA_SPI_MISO P5_2
dev_alexander 19:9f035b9e65ec 124 #define LORA_SPI_SCLK P5_0
dev_alexander 19:9f035b9e65ec 125 #define LORA_CS P3_0
dev_alexander 19:9f035b9e65ec 126 #define LORA_RESET P3_1
dev_alexander 19:9f035b9e65ec 127 #define LORA_DIO0 P3_2 // DIO0=TxDone/RXDone/CADDone
dev_alexander 19:9f035b9e65ec 128 #define LORA_DIO1 NC //
dev_alexander 19:9f035b9e65ec 129 #define LORA_DIO2 NC //
dev_alexander 19:9f035b9e65ec 130 #define LORA_DIO3 NC //
dev_alexander 19:9f035b9e65ec 131 #define LORA_DIO4 NC //
dev_alexander 19:9f035b9e65ec 132 #define LORA_DIO5 NC //
dev_alexander 19:9f035b9e65ec 133
dev_alexander 19:9f035b9e65ec 134 #elif defined(TARGET_MAX32620FTHR) // using the RFM95 board
dev_alexander 19:9f035b9e65ec 135
dev_alexander 19:9f035b9e65ec 136 // #define LED PB_3 // green
dev_alexander 19:9f035b9e65ec 137 #define LED LED2 // green
dev_alexander 19:9f035b9e65ec 138
dev_alexander 19:9f035b9e65ec 139 #define LORA_SPI_MOSI P5_1
dev_alexander 19:9f035b9e65ec 140 #define LORA_SPI_MISO P5_2
dev_alexander 19:9f035b9e65ec 141 #define LORA_SPI_SCLK P5_0
dev_alexander 19:9f035b9e65ec 142 #define LORA_CS P3_0
dev_alexander 19:9f035b9e65ec 143 #define LORA_RESET P3_1
dev_alexander 19:9f035b9e65ec 144 #define LORA_DIO0 P3_2 // DIO0=TxDone/RXDone/CADDone
dev_alexander 19:9f035b9e65ec 145 #define LORA_DIO1 NC //
dev_alexander 19:9f035b9e65ec 146 #define LORA_DIO2 NC //
dev_alexander 19:9f035b9e65ec 147 #define LORA_DIO3 NC //
dev_alexander 19:9f035b9e65ec 148 #define LORA_DIO4 NC //
dev_alexander 19:9f035b9e65ec 149 #define LORA_DIO5 NC //
dev_alexander 19:9f035b9e65ec 150
dev_alexander 19:9f035b9e65ec 151
dev_alexander 19:9f035b9e65ec 152
Helmut64 16:675f4d0ee9e9 153 #else
Helmut64 16:675f4d0ee9e9 154
Helmut64 16:675f4d0ee9e9 155 #error "unknown board"
Helmut64 16:675f4d0ee9e9 156
Helmut64 0:c43b6919ae15 157 #endif