LoRaWAN end device MAC layer for SX1272 and SX1276. Supports LoRaWAN-1.0 and LoRaWAN-1.1

Dependencies:   sx12xx_hal

Dependents:   LoRaWAN-SanJose_Bootcamp LoRaWAN-grove-cayenne LoRaWAN-classC-demo LoRaWAN-grove-cayenne ... more

radio chip selection

Radio chip driver is not included, because two options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

application project requirements

This library requires mbed TLS to be enabled.
The file mbed_app.json must be present in the project using this library:

{
    "macros": [ "MBEDTLS_CMAC_C" ]
}

regional PHY selection

All end device configuration is done in Commissioning.h, define desired radio frequency band of operation in this header file.
Commissioning.h is located in the application using this library.

end device provisioning

End device is provisioned by editing Commissioning.h in the application which is using this library
To use LoRaWAN-1.0 OTA: make sure LORAWAN_ROOT_APPKEY is undefined.
To use LoRaWAN-1.1 OTA, define LORAWAN_ROOT_APPKEY.
To select OTA operation, define LORAWAN_JOIN_EUI, then LORAWAN_DEVICE_EUI must be defined, along with root key(s).
To select ABP operation, undefine LORAWAN_JOIN_EUI: then define session keys

LoRaWAN 1.0 nameLoRaWAN 1.1 nameComissioning.h defnedescription
OTADevEUIDevEUILORAWAN_DEVICE_EUIuniquely identifies end device
OTAAppEUIJoinEUILORAWAN_JOIN_EUI
OTAAppKeyNwkKeyLORAWAN_ROOT_NWKKEYroot key for network server
OTA(note 1)AppKeyLORAWAN_ROOT_APPKEYroot key for application server
ABPNwkSKey(note 3)LORAWAN_FNwkSIntKeynetwork session key
ABP(note 2)SNwkSIntKeyLORAWAN_SNwkSIntKeymac layer network integrity key
ABP(note 2)NwkSEncKeyLORAWAN_NwkSEncKeynetwork session encryption key
ABP(note 2)FNwkSIntKeyLORAWAN_FNwkSIntKeyforwarding network session integrity key
ABPAppSKeyAppSKeyLORAWAN_APPSKEYapplication session encryption key

(note 1): LoRaWAN-1.0 OTA uses a single root key for both network server and application server.

In LoRaWAN-1.0 OTA: the single root AppKey is used to generate NwkSkey and AppSKey.
(note 2): In LoRaWAN-1.0 (both OTA and ABP) SNwkSIntKey, NwkSEncKey. FNwkSIntKey are of same value and are collectively known as NwkSKey.
(note 3): LoRaWAN-1.0 uses single network session key, LoRaWAN-1.1 uses 3 network session keys. Both use a unique application session key.


In LoRaWAN-1.1 OTA: the root NwkKey is used to generate SNwkSIntKey, NwkSEncKey, FNwkSIntKey
In LoRaWAN-1.1 OTA: the root AppKey is used to generate AppSKey


in ABP mode, the DevAddr, and session keys are fixed (never change), and frame counters never reset to zero.
ABP operation has no concept of: root keys, or DevEUI or JoinEUI/AppEUI.
in OTA mode, the DevAddr and session keys are assigned at join procedure, and frame counters reset at join.

eeprom

This library includes eeprom driver to support non-volatile storage required by LoRaWAN specification.
Currently eeprom is implemented for STM32L1 family and STM32L0 family.
Writing of values are wear-leveled to increase endurance; each write operation circulates across several memory locations. A read operation returns the highest value found. This simple method is used for sequence numbers which only increase.

value nameused in
DevNonceOTAfor Join request (note 1)
RJcount1OTAfor ReJoin Type 1 request
FCntUpABPuplink frame counter
NFCntDownABPdownlink frame counter
AFCntDownABPdownlink frame counter

AFCntDown is only used in LoRaWAN-1.1 when application payload is present in downlink and FPort > 0.
NFCntDown is used in LoRaWAN-1.1 when FPort is zero in downlink or application payload not present.
NFCntDown is the only downlink frame counter used in LoRaWAN-1.0
(note 1) OTA DevNonce is random number in LoRaWAN-1.0, therefore not stored in eeprom. DevNonce in LoRaWAN-1.1 is forever increasing (non-volatile) number upon each join request,.
RJcount0 is only stored in RAM because the value resets upon new session from JoinAccept, therefore not stored in eeprom.
Frame counters in OTA mode reset upon new session in join request, therefore are stored in RAM instead of eeprom for OTA.

radio driver support

When SX127x driver is used, both SX1272 and SX1276 are supported without defining at compile time. The chip is detected at start-up.
Supported radio platforms:


Alternately, when SX126x driver is imported, the SX126xDVK1xAS board is used.

low-speed clock oscillator selection

LoRaWAN uses 32768Hz crystal to permit low-power operation.
However, some mbed targets might revert to low-speed internal oscillator, which is not accurate enough for LoRaWAN operation.
An oscillator check is performed at initialization; program will not start if internal oscillator is used.
To force LSE watch crystal, add to mbed_app.json

{
    "macros": [ "MBEDTLS_CMAC_C" ],
    "target_overrides": {
        "<your-target>": {
            "target.lse_available": true
        }
    }
}
Committer:
Wayne Roberts
Date:
Mon Aug 20 14:09:49 2018 -0700
Revision:
12:0f28f2e7c35e
Parent:
7:4b6f960dcca2
add 8 hybrid channel sets for us915 band

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:6b3ac9c5a042 1
Wayne Roberts 0:6b3ac9c5a042 2 #include "LoRaMacPrivate.h"
Wayne Roberts 0:6b3ac9c5a042 3
Wayne Roberts 0:6b3ac9c5a042 4 #define TX_POWER_30_DBM 0
Wayne Roberts 0:6b3ac9c5a042 5 #define TX_POWER_28_DBM 1
Wayne Roberts 0:6b3ac9c5a042 6 #define TX_POWER_26_DBM 2
Wayne Roberts 0:6b3ac9c5a042 7 #define TX_POWER_24_DBM 3
Wayne Roberts 0:6b3ac9c5a042 8 #define TX_POWER_22_DBM 4
Wayne Roberts 0:6b3ac9c5a042 9 #define TX_POWER_20_DBM 5
Wayne Roberts 0:6b3ac9c5a042 10 #define TX_POWER_18_DBM 6
Wayne Roberts 0:6b3ac9c5a042 11 #define TX_POWER_16_DBM 7
Wayne Roberts 0:6b3ac9c5a042 12 #define TX_POWER_14_DBM 8
Wayne Roberts 0:6b3ac9c5a042 13 #define TX_POWER_12_DBM 9
Wayne Roberts 0:6b3ac9c5a042 14 #define TX_POWER_10_DBM 10
Wayne Roberts 0:6b3ac9c5a042 15
Wayne Roberts 0:6b3ac9c5a042 16 #define LORAMAC_MIN_TX_POWER TX_POWER_10_DBM
Wayne Roberts 0:6b3ac9c5a042 17 #define LORAMAC_MAX_TX_POWER TX_POWER_30_DBM
Wayne Roberts 0:6b3ac9c5a042 18 #define LORAMAC_DEFAULT_TX_POWER TX_POWER_20_DBM
Wayne Roberts 0:6b3ac9c5a042 19
Wayne Roberts 0:6b3ac9c5a042 20 #define LORA_MAX_NB_CHANNELS 72
Wayne Roberts 0:6b3ac9c5a042 21 //
Wayne Roberts 0:6b3ac9c5a042 22 // Enables at least the usage of the 2 datarates.
Wayne Roberts 0:6b3ac9c5a042 23 #define JOIN_TRIAL_LIMIT 2
Wayne Roberts 0:6b3ac9c5a042 24
Wayne Roberts 0:6b3ac9c5a042 25 #define LORAMAC_TX_MIN_DATARATE DR_0
Wayne Roberts 0:6b3ac9c5a042 26 #define LORAMAC_TX_MAX_DATARATE DR_4
Wayne Roberts 0:6b3ac9c5a042 27 #define LORAMAC_DEFAULT_DATARATE DR_1
Wayne Roberts 0:6b3ac9c5a042 28
Wayne Roberts 0:6b3ac9c5a042 29 #define LORAMAC_RX_MIN_DATARATE DR_8
Wayne Roberts 0:6b3ac9c5a042 30 #define LORAMAC_RX_MAX_DATARATE DR_13
Wayne Roberts 0:6b3ac9c5a042 31 #define LORAMAC_MIN_RX1_DR_OFFSET 0
Wayne Roberts 0:6b3ac9c5a042 32 #define LORAMAC_MAX_RX1_DR_OFFSET 3
Wayne Roberts 0:6b3ac9c5a042 33 #define LORAMAC_FIRST_RX1_CHANNEL ( (uint32_t) 923.3e6 )
Wayne Roberts 0:6b3ac9c5a042 34 #define LORAMAC_LAST_RX1_CHANNEL ( (uint32_t) 927.5e6 )
Wayne Roberts 0:6b3ac9c5a042 35 #define LORAMAC_STEPWIDTH_RX1_CHANNEL ( (uint32_t) 600e3 )
Wayne Roberts 0:6b3ac9c5a042 36
Wayne Roberts 0:6b3ac9c5a042 37 #define RX_WND_2_CHANNEL { 923300000, DR_8 }
Wayne Roberts 0:6b3ac9c5a042 38
Wayne Roberts 3:eb174e10afbb 39 #define DEFAULT_ADR_ACK_LIMIT 64
Wayne Roberts 3:eb174e10afbb 40 #define DEFAULT_ADR_ACK_DELAY 32
Wayne Roberts 3:eb174e10afbb 41
Wayne Roberts 7:4b6f960dcca2 42 #define REGION_LBT_RSSI_THRESHOLD_DBM 0
Wayne Roberts 7:4b6f960dcca2 43 #define REGION_LBT_CHANNEL_FREE_TIME_us 0 /* no LBT in USA */
Wayne Roberts 7:4b6f960dcca2 44
Wayne Roberts 0:6b3ac9c5a042 45 extern uint16_t ChannelsMaskRemaining[];
Wayne Roberts 0:6b3ac9c5a042 46
Wayne Roberts 0:6b3ac9c5a042 47 uint8_t CountNbEnabled125kHzChannels( uint16_t *channelsMask );
Wayne Roberts 0:6b3ac9c5a042 48 bool ValidateChannelMask( uint16_t* channelsMask );
Wayne Roberts 0:6b3ac9c5a042 49