LMIC for MOTE_L152RC

Dependents:   lmic_transmit

LoRa WAN in C for NA-mote 72

Currently version 1.5


LoRaWAN network configuration for end-device

The following three pieces of information uniquely identifies end-device to network to allow over-the-air activation. These are stored in the end-device prior to join procedure.

AppEUI

Uniquely identifies application provider of end-device.

Least-significant byte first, 8 bytes. Use LMIC_reverse_memcpy() for AppEUI to keep same byte order as that on lora server.

example C code

static const u1_t APPEUI[8]  = { 0x01, 0x00, 0x01, 0x00, 0x00, 0x0C, 0x25, 0x00 };

This is copied into LMIC by os_getArtEui() callback function in application.

DevEUI

End-device ID, unique to each end-node.

Least-significant byte first, 8 bytes. Use LMIC_reverse_memcpy() for DevEUI to keep same byte order as that on lora server.

example C code

static const u1_t DEVEUI[8]  = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x25, 0x00 }; 

This is copied into LMIC by os_getDevEui() callback function in application.

AppKey (aka DevKey)

128-bit (16byte) AES key.

example C code

static const u1_t DEVKEY[16] = { 0xe4, 0x72, 0x71, 0xc5, 0xf5, 0x30, 0xa9, 0x9f, 0xcf, 0xc4, 0x0e, 0xab, 0xea, 0xd7, 0x19, 0x42 };

This is copied into LMIC by os_getDevKey() callback function in application.

Using over-the air activation, the end-device (LMIC) performs a join procedure every time it starts for first time, or has lost session context information. When join procedure has successfully completed, the end-device will have a network session key (NwkSKey) and an application session key (AppSKey), which are used for encryption and message integrity check.


configuration with http://us01-iot.semtech.com/

  • log in to server
  • click on Applications
  • find your application and click it
  • go to configure motes
  • to create a mote, you may enter a new DevEUI
    • you may copy-paste the 16byte application key from an already existing mote, if you desire.

Information

DevEUI is entered in reverse order into C-code from that shown on server (unique device ID).

AppEUI is entered in reverse order into C-code from that shown on server.

AppEUI is equivalent to "Application"

transmit power limits

FCC Part 15 rules permit one watt of transmit power when more than 50 channels are used. When received by a 64-channel gateway, the maximum power may be used.

However, if end-device is sending to a 8-channel gateway (single SX1301), the maximum transmit power permitted is +20dBm.

To configure LMIC for use with 8-channel gateway, CHNL_HYBRID should be defined in in config.h, and should be undefined for use with 64-channel gateway.

CHNL_HYBRID125KHz500KHz
defined valuechannelschannel
00 to 764
18 to 1565
216 to 2366
324 to 3167
432 to 3968
540 to 4769
648 to 5570
756 to 6371
undef0 to 6364 to 71
Committer:
dudmuck
Date:
Tue Jun 02 19:04:29 2015 +0000
Revision:
0:f2716e543d97
lmic-v1.5 for MOTE_L152RC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:f2716e543d97 1 /*******************************************************************************
dudmuck 0:f2716e543d97 2 * Copyright (c) 2014-2015 IBM Corporation.
dudmuck 0:f2716e543d97 3 * All rights reserved. This program and the accompanying materials
dudmuck 0:f2716e543d97 4 * are made available under the terms of the Eclipse Public License v1.0
dudmuck 0:f2716e543d97 5 * which accompanies this distribution, and is available at
dudmuck 0:f2716e543d97 6 * http://www.eclipse.org/legal/epl-v10.html
dudmuck 0:f2716e543d97 7 *
dudmuck 0:f2716e543d97 8 * Contributors:
dudmuck 0:f2716e543d97 9 * IBM Zurich Research Lab - initial API, implementation and documentation
dudmuck 0:f2716e543d97 10 *******************************************************************************/
dudmuck 0:f2716e543d97 11
dudmuck 0:f2716e543d97 12 #ifndef _hal_hpp_
dudmuck 0:f2716e543d97 13 #define _hal_hpp_
dudmuck 0:f2716e543d97 14
dudmuck 0:f2716e543d97 15 /*
dudmuck 0:f2716e543d97 16 * initialize hardware (IO, SPI, TIMER, IRQ).
dudmuck 0:f2716e543d97 17 */
dudmuck 0:f2716e543d97 18 void hal_init (void);
dudmuck 0:f2716e543d97 19
dudmuck 0:f2716e543d97 20 /*
dudmuck 0:f2716e543d97 21 * drive radio NSS pin (0=low, 1=high).
dudmuck 0:f2716e543d97 22 */
dudmuck 0:f2716e543d97 23 void hal_pin_nss (u1_t val);
dudmuck 0:f2716e543d97 24
dudmuck 0:f2716e543d97 25 /*
dudmuck 0:f2716e543d97 26 * drive radio RX/TX pins (0=rx, 1=tx).
dudmuck 0:f2716e543d97 27 */
dudmuck 0:f2716e543d97 28 //void hal_pin_rxtx (u1_t val);
dudmuck 0:f2716e543d97 29 void hal_opmode(u1_t mode, u1_t pa_boost);
dudmuck 0:f2716e543d97 30
dudmuck 0:f2716e543d97 31 /*
dudmuck 0:f2716e543d97 32 * control radio RST pin (0=low, 1=high, 2=floating)
dudmuck 0:f2716e543d97 33 */
dudmuck 0:f2716e543d97 34 void hal_pin_rst (u1_t val);
dudmuck 0:f2716e543d97 35
dudmuck 0:f2716e543d97 36 /*
dudmuck 0:f2716e543d97 37 * perform 8-bit SPI transaction with radio.
dudmuck 0:f2716e543d97 38 * - write given byte 'outval'
dudmuck 0:f2716e543d97 39 * - read byte and return value
dudmuck 0:f2716e543d97 40 */
dudmuck 0:f2716e543d97 41 u1_t hal_spi (u1_t outval);
dudmuck 0:f2716e543d97 42
dudmuck 0:f2716e543d97 43 /*
dudmuck 0:f2716e543d97 44 * disable all CPU interrupts.
dudmuck 0:f2716e543d97 45 * - might be invoked nested
dudmuck 0:f2716e543d97 46 * - will be followed by matching call to hal_enableIRQs()
dudmuck 0:f2716e543d97 47 */
dudmuck 0:f2716e543d97 48 void hal_disableIRQs (void);
dudmuck 0:f2716e543d97 49
dudmuck 0:f2716e543d97 50 /*
dudmuck 0:f2716e543d97 51 * enable CPU interrupts.
dudmuck 0:f2716e543d97 52 */
dudmuck 0:f2716e543d97 53 void hal_enableIRQs (void);
dudmuck 0:f2716e543d97 54
dudmuck 0:f2716e543d97 55 /*
dudmuck 0:f2716e543d97 56 * put system and CPU in low-power mode, sleep until interrupt.
dudmuck 0:f2716e543d97 57 */
dudmuck 0:f2716e543d97 58 void hal_sleep (void);
dudmuck 0:f2716e543d97 59
dudmuck 0:f2716e543d97 60 /*
dudmuck 0:f2716e543d97 61 * return 32-bit system time in ticks.
dudmuck 0:f2716e543d97 62 */
dudmuck 0:f2716e543d97 63 u4_t hal_ticks (void);
dudmuck 0:f2716e543d97 64
dudmuck 0:f2716e543d97 65 /*
dudmuck 0:f2716e543d97 66 * busy-wait until specified timestamp (in ticks) is reached.
dudmuck 0:f2716e543d97 67 */
dudmuck 0:f2716e543d97 68 void hal_waitUntil (u4_t time);
dudmuck 0:f2716e543d97 69
dudmuck 0:f2716e543d97 70 /*
dudmuck 0:f2716e543d97 71 * check and rewind timer for target time.
dudmuck 0:f2716e543d97 72 * - return 1 if target time is close
dudmuck 0:f2716e543d97 73 * - otherwise rewind timer for target time or full period and return 0
dudmuck 0:f2716e543d97 74 */
dudmuck 0:f2716e543d97 75 u1_t hal_checkTimer (u4_t targettime);
dudmuck 0:f2716e543d97 76
dudmuck 0:f2716e543d97 77 /*
dudmuck 0:f2716e543d97 78 * perform fatal failure action.
dudmuck 0:f2716e543d97 79 * - called by assertions
dudmuck 0:f2716e543d97 80 * - action could be HALT or reboot
dudmuck 0:f2716e543d97 81 */
dudmuck 0:f2716e543d97 82 void hal_failed (void);
dudmuck 0:f2716e543d97 83
dudmuck 0:f2716e543d97 84 #ifndef OSTICKS_PER_SEC
dudmuck 0:f2716e543d97 85 #define OSTICKS_PER_SEC 16384
dudmuck 0:f2716e543d97 86 #elif OSTICKS_PER_SEC < 10000 || OSTICKS_PER_SEC > 64516
dudmuck 0:f2716e543d97 87 #error Illegal OSTICKS_PER_SEC - must be in range [10000:64516]. One tick must be 15.5us .. 100us long.
dudmuck 0:f2716e543d97 88 #endif
dudmuck 0:f2716e543d97 89
dudmuck 0:f2716e543d97 90 #endif // _hal_hpp_