/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
(C)2013 Semtech
- Introduction
The aim of this project is to show examples of the LoRaWAN specification endpoint firmware implementation.
REMARK 1: The Semtech implementation is a EU868 band Class A and Class C endpoint implementation fully compatible with LoRaWAN 1.0 specification.
REMARK 2: The Class C normal operation has been tested using the Actility servers.
REMARK 3: The Class C Multicast messages handling is not yet tested.
Note:
The IBM 'LoRaWAN in C' implementation supports the Class A profile and partial Class B support (beacon synchronization).
A port of the IBM 'LoRaWAN in C' can be found on MBED Semtech Team page project LoRaWAN-lmic-app
- System schematic and definitions
The available supported hardware platforms schematics and LoRaMac specification can be found in the Doc directory.
- Acknowledgements
The mbed (https://mbed.org/) project was used at the beginning as source of inspiration.
This program uses the AES algorithm implementation (http://www.gladman.me.uk/) by Brian Gladman.
This program uses the CMAC algorithm implementation (http://www.cse.chalmers.se/research/group/dcs/masters/contikisec/) by Lander Casado, Philippas Tsigas.
- Dependencies
This program depends on specific hardware platforms. Currently the supported platforms are:
- Bleeper-72
MCU : STM32L151RD - 384K FLASH, 48K RAM, Timers, SPI, I2C,
USART,
USB 2.0 full-speed device/host/OTG controller,
DAC, ADC, DMA
RADIO : SX1272
ANTENNA : Connector for external antenna
BUTTONS : 1 Reset, 16 position encoder
LEDS : 3
SENSORS : Temperature
GPS : Possible through pin header GPS module connection
SDCARD : Yes
EXTENSION HEADER : Yes, 12 pins
REMARK : None.
- Bleeper-76
MCU : STM32L151RD - 384K FLASH, 48K RAM, Timers, SPI, I2C,
USART,
USB 2.0 full-speed device/host/OTG controller,
DAC, ADC, DMA
RADIO : SX1276
ANTENNA : Connector for external antennas (LF+HF)
BUTTONS : 1 Reset, 16 position encoder
LEDS : 3
SENSORS : Temperature
GPS : Possible through pin header GPS module connection
SDCARD : No
EXTENSION HEADER : Yes, 12 pins
REMARK : None.
- LoRaMote
MCU : STM32L151CB - 128K FLASH, 10K RAM, Timers, SPI, I2C,
USART,
USB 2.0 full-speed device/host/OTG controller,
DAC, ADC, DMA
RADIO : SX1272
ANTENNA : Printed circuit antenna
BUTTONS : No
LEDS : 3
SENSORS : Proximity, Magnetic, 3 axis Accelerometer, Pressure,
Temperature
GPS : Yes, UP501 module
SDCARD : No
EXTENSION HEADER : Yes, 20 pins
REMARK : The MCU and Radio are on an IMST iM880A module
- SensorNode
MCU : STM32L151C8 - 64K FLASH, 10K RAM, Timers, SPI, I2C,
USART,
USB 2.0 full-speed device/host/OTG controller,
DAC, ADC, DMA
RADIO : SX1276
ANTENNA : Printed circuit antenna
BUTTONS : Power ON/OFF, General purpose button
LEDS : 3
SENSORS : Proximity, Magnetic, 3 axis Accelerometer, Pressure,
Temperature
GPS : Yes, SIM39EA module
SDCARD : No
EXTENSION No
REMARK : The MCU and Radio are on an NYMTEK Cherry-LCC module
- SK-iM880A ( IMST starter kit )
MCU : STM32L151CB - 128K FLASH, 10K RAM, Timers, SPI, I2C,
USART,
USB 2.0 full-speed device/host/OTG controller,
DAC, ADC, DMA
RADIO : SX1272
ANTENNA : Connector for external antenna
BUTTONS : 1 Reset, 3 buttons + 2 DIP-Switch
LEDS : 3
SENSORS : Potentiometer
GPS : Possible through pin header GPS module connection
SDCARD : No
EXTENSION HEADER : Yes, all IMST iM880A module pins
REMARK : None
- Usage
Projects for CooCox-CoIDE (partial), Ride7 and Keil Integrated Development Environments are available.
One project is available per application and for each hardware platform in each development environment. Different targets/configurations have been created in the different projects in order to select different options such as the usage or not of a bootloader and the radio frequency band to be used.
- Changelog
2015-08-07, v3.3
-
General
- Added the support for LoRaWAN Class C devices.
- Implemented the radios errata note workarounds. SX1276 errata 2.3 "Receiver Spurious Reception of a LoRa Signal" is not yet implemented.
- Increased FSK SyncWord timeout value in order to listen for longer time if a down link is available or not. Makes FSK downlink more reliable.
- Increased the UART USB FIFO buffer size in order to handle bigger chunks of data.
-
LoRaWAN
- Renamed data rates as per LoRaWAN specification.
- Added the support for LoRaWAN Class C devices.
- Handling of the MAC commands was done incorrectly the condition to verify the length of the buffer has changed from < to <=.
- Added the possibility to change the channel mask and number of repetitions trough SRV_MAC_LINK_ADR_REQ command when ADR is disabled.
- Corrected Rx1DrOffset management. In previous version DR1 was missing for all offsets.
- Changed confirmed messages function to use default datarate when ADR control is off.
- After a Join accept the node falls back to the default datarate. Enables the user to Join a network using a different datarate from its own default one.
- Corrected default FSK channel frequency.
- Solved a firmware freezing when one of the following situations arrived in OnRxDone callback: bad address, bad MIC, bad frame. (Pull request #10)
- Moved the MAC commands processing to the right places. FOpts field before the Payload and Port 0 just after the decryption. (Pull request #9)
- Weird conditions to check datarate on cmd mac SRV_MAC_NEW_CHANNEL_REQ (Pull request #7)
- Ignore join accept message if already joined (Pull request #6)
- Channel index verification should use OR on SRV_MAC_NEW_CHANNEL_REQ command (Pull request #5)
- Corrected the CFList management on JoinAccept. The for loop indexes were wrong. (Pull request #4)
- Correction of AES key size (Pull request #3)
2015-04-30, v3.2
-
General
- Updated LoRaMac implementation according to LoRaWAN R1.0 specification
- General cosmetics corrections
- Added the support of packed structures when using IAR tool chain
- Timers: Added a function to get the time in us.
- Timers: Added a typedef for time variables (TimerTime_t)
- Radios: Changed the TimeOnAir radio function to return a uint32_t value instead of a double. The value is in us.
- Radios: Corrected the 250 kHz bandwidth choice for the FSK modem
- GPS: Added a function that returns if the GPS has a fix or not.
- GPS: Changed the GetPosition functions to return a latitude and longitude of 0 and altitude of 65535 when no GPS fix.
-
LoRaWAN
- Removed support for previous LoRaMac/LoRaWAN specifications
- Added missing MAC commands and updated others when necessary
-
Corrected the Port 0 MAC commands decryption
-
Changed the way the upper layer is notified. Now it is only notified when all the operations are finished.
When a ClassA Tx cycle starts a timer is launched to check every second if everything is finished.
-
Added a new parameter to LoRaMacEventFlags structure that indicates on which Rx window the data has been received.
-
Added a new parameter to LoRaMacEventFlags structure that indicates if there is applicative data on the received payload.
-
Corrected ADR MAC command behaviour
-
DutyCycle enforcement implementation (EU868 PHY only)
REMARK 1 The regulatory duty cycle enforcement is enabled by default which means that for lower data rates the node may not transmit a new frame as quickly as requested. The formula used to compute the node idle time is
Toff = TimeOnAir / DutyCycle - TxTimeOnAir
Eaxample: A device just transmitted a 0.5 s long frame on one default channel. This channel is in a sub-band allowing 1% duty-cycle. Therefore this whole sub-band (868 MHz - 868.6 MHz) will be unavailable for 49.5 s.
REMARK 2 The duty cycle enforcement can be disabled for test purposes by calling the LoRaMacSetDutyCycleOn function with false parameter.
-
Implemented aggregated duty cycle management
-
Added a function to create new channels
-
Implemented the missing features on the JoinAccept MAC command
-
Updated LoRaMacJoinDecrypt function to handle the CFList field.
-
- Due to duty cycle management the applicative API has changed. All applications must be updated accordingly.
- Added the possibility to chose to use either public or private networks
2015-01-30, v3.1
-
General
-
Started to add support for CooCox CoIDE Integrated Development Environment. Currently only LoRaMote and SensorNode platform projects are available.
-
Updated GCC compiler linker scripts.
-
Added the support of different tool chains for the HardFault_Handler function.
-
Corrected Radio drivers I&Q signals inversion to be possible in Rx and in Tx. Added some missing radio state machine initialization.
-
Changed the RSSI values type from int8_t to int16_t. We can have RSSI values below -128 dBm.
-
Corrected SNR computation on RxDone interrupt.
-
Updated radio API to support FHSS and CAD handling.
-
Corrected in SetRxConfig function the FSK modem preamble register name.
-
Added an invalid bandwidth to the Bandwidths table in order to avoid an error when selecting 250 kHz bandwidth when using FSK modem.
-
Corrected RTC alarm setup which could be set to an invalid date.
-
Added another timer in order increment the tick counter without blocking the normal timer count.
-
Added the possibility to switch between low power timers and normal timers on the fly.
-
I2C driver corrected the 2 bytes internal address management. Corrected buffer read function when more that 1 byte was to be read. Added a function to wait for the I2C bus to become IDLE.
-
Added an I2C EEPROM driver.
-
Corrected and improved USB Virtual COM Port management files. Corrected the USB CDC and USB UART drivers.
-
Added the possibility to analyze a hard fault interrupt.
-
-
LoRaMac
- Corrected RxWindow2 Datarate management.
- SrvAckRequested variable was never reset.
- Corrected tstIndoor applications for LoRaMac R3.0 support.
- LoRaMac added the possibility to configure almost all the MAC parameters.
- Corrected the LoRaMacSetNextChannel function.
- Corrected the port 0 MAC command decoding.
- Changed all structures declarations to be packed.
- Corrected the Acknowledgement retries management when only 1 trial is needed. Before the device was issuing at least 2 trials.
- Corrected server mac new channel req answer.
- Added the functions to read the Up and Down Link sequence counters.
- Corrected SRV_MAC_RX2_SETUP_REQ frequency handling. Added a 100 multiplication.
- Corrected SRV_MAC_NEW_CHANNEL_REQ. Removed the DutyCycle parameter decoding.
- Automatically activate the channel once it is created.
- Corrected NbRepTimeoutTimer initial value. RxWindow2Delay already contains RxWindow1Delay in it.
2014-07-18, v3.0
-
General
- Added to Radio API the possibility to select the modem.
- Corrected RSSI reading formulas as well as changed the RSSI and SNR values from double to int8_t type.
- Changed radio callbacks events to timeout when it is a timeout event and error when it is a CRC error.
- Radio API updated.
- Updated ping-pong applications.
- Updated tx-cw applications.
- Updated LoRaMac applications in order to handle LoRaMac returned functions calls status.
- Updated LoRaMac applications to toggle LED2 each time there is an application payload down link.
- Updated tstIndoor application to handle correctly more than 6 channels.
- Changed the MPL3115 altitude variable from unsigned to signed value.
- Replaced the usage of pow(2, n) by defining POW2 functions. Saves ~2 KBytes of code.
- Corrected an issue potentially arriving when LOW_POWER_MODE_ENABLE wasn't defined. A timer interrupt could be generated while the TimerList could already be emptied.
-
LoRaMac
-
Implemented LoRaMac specification R3.0 changes.
-
MAC commands implemented
- LinkCheckReq YES
- LinkCheckAns YES
- LinkADRReq YES
- LinkADRAns YES
- DutyCycleReq YES
- DutyCycleAns YES
- Rx2SetupReq YES
- Rx2SetupAns YES
- DevStatusReq YES
- DevStatusAns YES
- JoinReq YES
- JoinAccept YES
- NewChannelReq YES
- NewChannelAns YES
-
Features implemented
-
Possibility to shut-down the device YES
Possible by issuing DutyCycleReq MAC command.
-
Duty cycle management enforcement NO
-
Acknowledgements retries YES
-
Unconfirmed messages retries YES
-
-
2014-07-10, v2.3.RC2
- General
- Corrected all radios antenna switch low power mode handling.
- SX1276: Corrected antenna switch control.
2014-06-06, v2.3.RC1
-
General
-
Added the support for SX1276 radio.
-
Radio continuous reception mode correction.
-
Radio driver RxDone callback function API has changed ( size parameter is no more a pointer). Previous function prototype:
void ( *RxDone )( uint8_t *payload, uint16_t *size, double rssi, double snr, uint8_t rawSnr );
New function prototype:
void ( *RxDone )( uint8_t *payload, uint16_t size, double rssi, double snr, uint8_t rawSnr );
-
Added Bleeper-76 and SensorNode platforms support.
-
Added to the radio drivers a function that generates a random value from RSSI readings.
-
Added a project to transmit a continuous wave and a project to measure the the radio sensitivity.
-
Added a bootloader project for the LoRaMote and SensorNode platforms.
-
The LoRaMac application for Bleeper platforms now sends the Selector and LED status plus the sensors values.
-
The application payload for the Bleeper platforms is as follows:
LoRaMac port 1:
{ 0xX0/0xX1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } ---------- ---------- ---------- ---------- ---- | | | | | SELECTOR/LED PRESSURE TEMPERATURE ALTITUDE BATTERY MSB nibble = SELECTOR (barometric) LSB bit = LED
-
-
Redefined rand() and srand() standard C functions. These functions are redefined in order to get the same behaviour across different compiler tool chains implementations.
-
GPS driver improvements. Made independent of the board platform.
-
Simplified the RTC management.
-
Added a function to the timer driver that checks if a timer is already in the list or not.
-
Added the UART Overrun bit exception handling to the UART driver.
-
Removed dependency of spi-board files to the "__builtin_ffs" function. This function is only available on GNU compiler tool suite. Removed --gnu compiler option from Keil projects. Added own __ffs function implementation to utilities.h file.
-
Removed obsolete class1 devices support.
-
Known bugs correction.
-
-
LoRaMac
-
MAC commands implemented
- LinkCheckReq YES
- LinkCheckAns YES
- LinkADRReq YES
- LinkADRAns YES
- DutyCycleReq YES (LoRaMac specification R2.2.1)
- DutyCycleAns YES (LoRaMac specification R2.2.1)
- Rx2SetupReq YES (LoRaMac specification R2.2.1)
- Rx2SetupAns YES (LoRaMac specification R2.2.1)
- DevStatusReq YES
- DevStatusAns YES
- JoinReq YES
- JoinAccept YES (LoRaMac specification R2.2.1)
- NewChannelReq YES (LoRaMac specification R2.2.1)
- NewChannelAns YES (LoRaMac specification R2.2.1)
-
Features implemented
-
Possibility to shut-down the device YES
Possible by issuing DutyCycleReq MAC command.
-
Duty cycle management enforcement NO
-
Acknowledgements retries WORK IN PROGRESS
Not fully debugged. Disabled by default.
-
Unconfirmed messages retries WORK IN PROGRESS (LoRaMac specification R2.2.1)
-
-
Implemented LoRaMac specification R2.2.1 changes.
-
Due to new specification the LoRaMacInitNwkIds LoRaMac API function had to be modified.
Previous function prototype:
void LoRaMacInitNwkIds( uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey );
New function prototype:
void LoRaMacInitNwkIds( uint32_t netID, uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey );
-
Changed the LoRaMac channels management.
-
LoRaMac channels definition has been moved to LoRaMac-board.h file located in each specific board directory.
-
2014-04-07, v2.2
- General
-
Added IMST SK-iM880A starter kit board support to the project.
- The application payload for the SK-iM880A platform is as follows:
LoRaMac port 3:
{ 0x00/0x01, 0x00, 0x00, 0x00 } ---------- ----- ---------- | | | LED POTI VDD
-
Ping-Pong applications have been split per supported board.
-
Corrected the SX1272 output power management. Added a variable to store the current Radio channel. Added missing FSK bit definition.
-
Made fifo functions coding style coherent with the project.
-
UART driver is now independent of the used MCU
-
2014-03-28, v2.1
-
General
- The timers and RTC management has been rewritten.
- Improved the UART and UP501 GPS drivers.
- Corrected GPIO pin names management.
- Corrected the antenna switch management in the SX1272 driver.
- Added to the radio driver the possibility to choose the preamble length and rxSingle symbol timeout in reception.
- Added Hex coder selector driver for the Bleeper board.
- Changed copyright Unicode character to (C) in all source files.
-
LoRaMac
- MAC commands implemented
- LinkCheckReq YES
- LinkCheckAns YES
- LinkADRReq YES
- LinkADRAns YES
- DevStatusReq YES
- DevStatusAns YES
- JoinReq YES
- JoinAccept YES
- Added acknowledgements retries management. Split the LoRaMacSendOnChannel function in LoRaMacPrepareFrame and LoRaMacSendFrameOnChannel. LoRaMacSendOnChannel now calls the 2 newly defined functions.
**WARNING**: By default the acknowledgement retries specific code isn't enabled. The current http://iot.semtech.com server version doesn't support it.
- Corrected issues on JoinRequest and JoinAccept MAC commands. Added LORAMAC_EVENT_INFO_STATUS_MAC_ERROR event info status.
- MAC commands implemented
2014-02-21, v2.0
- General
- The LoRaMac applications now sends the LED status plus the sensors values.
For the LoRaMote platform the application also sends the GPS coordinates.
-
The application payload for the Bleeper platform is as follows:
LoRaMac port 1:
{ 0x00/0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } ---------- ---------- ---------- ---------- ---- | | | | | LED PRESSURE TEMPERATURE ALTITUDE BATTERY (barometric)
-
The application payload for the LoRaMote platform is as follows:
LoRaMac port 2:
{ 0x00/0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } ---------- ---------- ---------- ---------- ---- ---------------- ---------------- ---------- | | | | | | | | LED PRESSURE TEMPERATURE ALTITUDE BATTERY LATITUDE LONGITUDE ALTITUDE (barometric) (gps)
-
- Adapted applications to the new MAC layer API.
- Added sensors drivers implementation.
- Corrected new or known issues.
- The LoRaMac applications now sends the LED status plus the sensors values.
For the LoRaMote platform the application also sends the GPS coordinates.
- LoRaMac
- MAC commands implemented
- LinkCheckReq YES
- LinkCheckAns YES
- LinkADRReq YES
- LinkADRAns YES
- DevStatusReq YES
- DevStatusAns YES
- JoinReq YES (Not tested)
- JoinAccept YES (Not tested)
- New MAC layer application API implementation.
- MAC commands implemented
- Timers and RTC.
- Still some issues. They will be corrected on next revisions of the firmware.
2014-01-24, v1.1
- LoRaMac
-
MAC commands implemented
- LinkCheckReq NO
- LinkCheckAns NO
- LinkADRReq YES
- LinkADRAns YES
- DevStatusReq YES
- DevStatusAns YES
-
Implemented an application LED control If the server sends on port 1 an application payload of one byte with the following contents:
0: LED off 1: LED on
The node transmits periodically on port 1 the LED status on 1st byte and the message "Hello World!!!!" the array looks like:
{ 0, 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '!', '!', '!' }
-
- Timers and RTC.
- Corrected issues existing in the previous version
- Known bugs are:
- There is an issue when launching an asynchronous Timer. Will be solved in a future version
2014-01-20, v1.1.RC1
-
Added Doc directory. The directory contains:
- LoRa MAC specification
- Bleeper board schematic
-
LoRaMac has been updated according to Release1 of the specification. Main changes are:
- MAC API changed.
- Frame format.
- ClassA first ADR implementation.
- MAC commands implemented
- LinkCheckReq NO
- LinkCheckAns NO
- LinkADRReq YES
- LinkADRAns NO
- DevStatusReq NO
- DevStatusAns NO
-
Timers and RTC rewriting. Known bugs are:
- The Radio wakeup time is taken in account for all timings.
- When opening the second reception window the microcontroller sometimes doesn't enter in low power mode.
2013-11-28, v1.0
- Initial version of the LoRa MAC node firmware implementation.