IEEE 802.15.4 and RAIL/Flex SDK

by <a href=""><font color="#000000"><font size="2">Hero Employee</font></font> </a> andrasbiro ‎02-24-2017 04:08 AM - edited ‎06-01-2017 03:48 AM



802.15.4 PHY support by the hardware


  • All bands are supported, except 1427, 2380, 770, 4965 and 5800MHz
  • OQPSK (not SUN O-QPSK or MR-OQPSK) and FSK/GFSK modulations are supported
  • MSK modulation will be supported soon


The protocol specific API


The RAIL library includes protocol specific API for 15.4. It's strongly recommend to use at least version 1.4.x, which is supplied with Flex SDK 1.0.x.


Setting up the PHY


Frequency and modulation



This protocol specific API includes PHY configuration for the 802.15.4 2.4GHz OQPSK PHY (not to be confused with the SUN O-QPSK PHY), which also sets up the variable length settings for the 1Byte (7 bit length) PHR. To use it, call  RAIL_IEEE802154_2p4GHzRadioConfig instead of loading the configuration generated by AppBuilder.

Setting up all other PHY

  • Set up modulation and frequencies as per the requirements of the standard
  • You'll probably need to modify the channel map by hand in rail_config.c See the API doc of  RAIL_ChannelConfigEntry_t and  RAIL_ChannelConfig.

Frame format


Preamble and Sync word (SFD) depends on the PHY format, set it up accordingly.



Use LSB first unless stated otherwise.

SUN-FSK defines the length field MSB first. The length can be handled by the hardware, but you have to keep in mind that you have to reverse the endianness of these bytes for both RX and TX in application. I've used the following code to set and get the length of the packet:


//length helper functions for WiSUN 15.4 frame formats
void setLength(uint8_t *payload, uint16_t length){ payload[1] = __RBIT(length & 0xFF) >> 24; payload[0] = __RBIT(length >> 8) >> 24; } uint16_t getLength(uint8_t *payload){ uint16_t length = __RBIT(payload[1]) >> 24; length |= (__RBIT(payload[0]) >> 16) & 0x0700; return length; }



Variable length setup for 1Byte PHR with 7bit length

On 2.4GHz OQPSK, this is covered by the embedded config. Otherwise:


Variable length setup for 2Byte PHR and 11 bit length (SUN FSK)


Note: With Flex 1.0.x, frames are supported with the maximum of 238B length (240B total with PHR). The next release will support longer frames



CCIT-16 (16 bit ITU-T CRC)


32 bit ANSI X3.66-1979

The same as before, but polynomial is ANSIX366_1979

Using MAC acceleration

The hardware does support address filtering and Auto-ACK, which can be turned on in RAIL only for the 1Byte PHR PHY. To enable it, use the RAIL_IEEE802154_Init API call, and the address related calls.


AutoACK and Address filtering module

It might seem reasonable to use the AutoAck and address filtering module with 2B PHR. Unfortunately, this is not possible:

  • The address locations are not fixed in the header
  • The AutoAck module will Ack all packages, even the filtered ones
by <a href=""><font color="#000000"><font size="2">Super Star</font></font> </a> xiaom
on ‎03-08-2017 08:30 PM

May I have a question about the latest version of RAIL SDK until now? And how to download it or through Flex SDK? Thanks.

by <a href=""><font color="#000000"><font size="2">Super Star</font></font> </a> xiaom
on ‎03-09-2017 02:01 AM

BTW, I downloaded the Simlicity Studio (v4) and install Flex SDK(, I notice that RAIL SDK has been updated to 1.4.2 version within this. However, i did not find the RAIL library (e.g. autogen/librail-efr32-gcc-release.a) in the installation directory. Can you please point me where to find this static libraray or do I need to generate it manually?Thanks.

by <a href=""><font color="#000000"><font size="2">Hero Employee</font></font> </a> andrasbiro
on ‎03-09-2017 02:37 AM

Please create new topics if your question is not related to the article. Quick answers: Flex SDK 1.0.1 has the newest rail-lib, which is 1.4.2. There's no RAIL SDK anymore. You can found the rail-lib at \flex\v1.0.1.0\protocol\flex_1.0\connect\plugins\libraries\libphy-rail-efr32xg1-library-gcc.a

It was renamed, so Connect can use the same binary.




P.S. Please do not reply, if you have further questions, open a new topic.