Zigbee & Thread Knowledge Base

      • How to Create Smart Energy Customized NCP project with Pre-Built NCP images Config

        Azam Chatta | 11/320/2017 | 03:49 AM

        Silicon Labs provides pre-built NCP images and sample NCP applications for different use cases in the stack. The customer has the option either use one of the pre-built NCP images or use sample NCP applications or a blank NCP application to build customised NCP application.

        The below resopurces provide good information before continue with generating Smart Energy customized NCP image.

        The AN1010 application note provides detailed guide about building a customised NCP appliocation.
        You can find this here:


        Another useful application note is AN714, this guide provides information about smart energy ECC-enabled device setup process.
        You can find this here:


        The KBA at below link provides information about the ECC libraries and adding them to the stack.


        Although the customer cannot generate exactly NCP binary as pre-built, however if they use one of NCP sample applications and make below changes then they can generate a NCP image functionaly similar to pr-built NCP image.
          The steps to generate smart energy NCP image similar to pre-built smart energy NCP image:

          (1) Start a new customised NCP project based on one of sample NCP applications. You may select 'xncp-commshub-uart-dual'   sample NCP application for ComsHub and 'ncp-uart-hw' for end device depending on your needs.
          (2) Select the following plugins and do not change any other already selected plugins.
          XNCP Stub Library
          Zigbee PRO Stack Library
          Zigbee Light Link Stub Library
          Zigbee PRO Core Security Library
          Security Link Keys Library
          End Device Bind Library
          Binding Table Library
          ECC 163k1 Library
          ECC 283k1 Library
          CBKE Core Library
          CBKE 163k Library
          CBKE 283k Library
          Install Code Library
          CBKE DSA Verify Library
          CBKE DSA Sign Stub Library
          CBKE 283k DSA Verify Library
          Packet Validate Library
          Multi-Network Stub Library
          GreenPower Stack Stub Library
          Concentrator Support Library
          Manufacturing Library
        (3) Select Zigbee PRO Stack Library plugin and set Child Table Size to 32. The other settings selected by sample NCP application are ok.
        (4) Generate and build the project.


      • All-time Favorite Mesh KBAs

        ADKates | 11/314/2017 | 10:39 AM

        In our recent change to a new Community platform, some of our best KBAs were migrated but haven't been indexed for search. Until this occurs, we're collecting some of our most useful KBAs here to make them easily available and searchable by title:

        Guidelines for Large/Dense Networks with EmberZNet PRO

        How are different tables managed in EmberZNet?

        HAL Configurator Reference ZNet 6.0 Thread 2.4

        Migrating to the new HAL Config file format for EFR32 (ZNet 5.10, Thread 2.3)

        EFR32 sniffer function

        How does neighbor table aging in EmberZNet work? What constitutes a stale neighbor?

        Changing IAR Version in Simplicity Studio v4

        Versions of IAR EWARM Compiler Software for Wireless Mesh

        How does the EmberZNet stack retry work?







      • HAL Configurator Reference ZNet 6.0 Thread 2.4

        ADKates | 11/313/2017 | 05:18 PM

        The attached document is a docx reference for the October release of the 6.0 ZNet Beta and the subsequent GA release of the 6.0 ZNet stack and the 2.4 Thread stack. If you do not have Microsoft Word, you can download the original .html reference in a .zip archive.

        The  stacks have a new Hardware Configurator which generates the #defines as seen in this document into the [project].h file and the hal-config.file.

        For anyone not using the HWConf or having unexpected outputs in the Beta release, this reference document provides the defines, values and dependencies for the hardware, clock and peripheral options.

        For more context on these defines, this is an extension of the new HAL structure begun in the June 2017 release and described here:


        The new defines are more uniformly named and implemented, but the system is very similar. If you have implemented the June 2017 version, it should be easy to see what the new defines and values are.

      • Turning any EFR32 into a Zigbee or Thread Sniffer

        EzraHale | 11/313/2017 | 03:52 PM

        Any EFR32 can be easily turned into a Zigbee or Thread sniffer device using the Railtest sample application included in the free Flex SDK.

        In order to do this follow the steps below:

        1. Download the Flex SDK via Simplicity Studio V4.
        2. Create a new Railtest sample application for your desired part (Generate and compile using GCC or IAR)
        3. Load the built binary image onto your chosen EFR32 dev board.
        4. Connect to the console of your EFR32.
        5. In order to turn the Railtest image into a sniffer for 802.15.4 protocols like Zigbee and Thread you will need to issue the following commands over the console:
          1. > rx 0
            1. This will put the radio into an idle state so that you can configure it.
          2. > config2p4GHz802154
            1. This command configures the radio for the 802.15.4 phy
          3. > enable802154 rx 100 192 864
            1. Puts the radio into the right mode for 802.15.4 capture
          4. > setPromiscuousMode 1
            1. Puts the radio into promiscuous capture mode so it can act as a sniffer
          5. > setChannel <yourChannel, (11 - 26)>
            1. Sets the desired channel you wish to sniff.
          6. > rx 1
            1. Puts the radio back into receive mode.
        6. Now simply capture from your device in the Network Analyzer and you should start seeing traffic captured from the network.
      • How to build an EZSP-UART host application

        JasonHou | 11/305/2017 | 04:49 AM

        Here are some steps you can follow to build an EZSP-UART host application with an EFR32MG1 or EFR32MG12 device (on our dev kit) running a pre-built NCP-UART image of the latest EmberZNet stack, which is v6.0.0.0 at the time of this article.


        1. Create a new Silicon Labs AppBuilder Project in Simplicity Studio v4 of type "ZCL Application Framework V2", and choose the host (as apposed to SoC) flavor of the latest EmberZNet stack.


        2. Choose a sample application, such as Z3Gateway.choose "Noon(compatible)" in Part tab. and click "Finish"


        3. Generage the project without any modification.


        4. Build the host application.

        Building the Host application can be done on a Linux system(this sample built on Cygwin) and requires a number of development tools. We assume you have access to these tools. They are as follows:

        • Make

        • GCC

        • sed

        • awk

        • xargs

        • The standard C Library and its development headers

        • The Readline Library and its development headers

        • The Ncurses Library and its development headers

        . Run "make" on the generated Makefile from the directory<\SiliconLabs\SimplicityStudio\v4_4\developer\sdks\gecko_sdk_suite\v2.0\app\builder\Z3GatewayHost> and the compilation should complete successfully.


        5.Running the Host application

        The USB port is either COM1, COM2, COM3, and so on. The following example uses COM19.

        a. Launch a Cygwin Shell.

        b. Navigate to the directory where the project is located, for example:cd /cygdrive/c/SiliconLabs/SimplicityStudio/v4_4/developer/sdks/gecko_sdk_suite/v2.0/app/builder/Z3GatewayHost/build/exe

        c. Type the command: ./Z3GatewayHost.exe -n 0 -p COM19




      • The difference between Legacy Bootloader and Gecko Bootloader for EFR32MG Parts

        Lesun | 10/304/2017 | 02:27 AM

        The Silicon Labs Gecko Bootloader is a common bootloader for all the newer MCUs and wireless MCUs from Silicon Labs. The Gecko Bootloader can be configured to perform a variety of bootload functions, from device initialization to firmware upgrades. In this article, we will compare the difference between Legacy Bootloader and Gecko Bootloader for EFR32MG Devices on ZigBee side.

        For EM35x devices and EFR32MG1x parts, usually, you can find the prebuild legacy bootloader for some part numbers in the following stack installation directory. For some EFR32MG1 QFN32 parts, we already had a KBA to discuss how to make customized ZigBee bootloader.  


        For EFR32MG12x/EFR32MG13x and newer parts, usually, you can only choose Gecko Bootloader for them. We don't provide the prebuild Gecko Bootloader right now, so custom need to build it by themselves, it is easy to build the Gecko Bootloader within Gecko Bootloader SDK, since there are many kinds of Samples in the SDK. Actually, for EFR32MG parts, no matter it is EFR32MG1x or EFR32MG12x(beyond) parts, we recommend custom to use Gecko Bootloader, since the Gecko Bootloader can be upgraded in the field.

        Here are some tags for the difference between Legacy Bootloader and Gecko Bootloader:

        Legacy Bootloader:

        • Can be used for EM35x devices, resides in main flash, it starts from 0x0000 address.
        • Can be used for EFR32MG1 devices, resides in main flash, it starts from 0x0000 address.
        • It is prebuild bootloader, can be found in stack installation directory.
        • For some EFR32MG1 QFN32 parts, need to make customized ZigBee bootloader.
        • The bootloader can be erased with "commander device masserase".
        • Documentation: AN760 and AN772.

        Gecko Bootloader:

        • It includes two-stages design: First stage and Main Bootloader.
        • First stage is very simple and only knows how to boot/upgrade the second stage.
        • Main bootloader is field upgradeable. It means you can upgrade the Main Bootloader in the field.
        • Can't be used for EM35x devices.
        • Recommend to be used for any EFR32MGx devices.
        • Need to build within Gecko Bootloader SDK.
        • For EFR32MG1x devices, the Gecko Bootlaoder resides in main flash, it starts from 0x0000 address.  
          • The bootloader can be erased with "commander device masserase".
        • For EFR32MG12x and newer devices, the Gecko Bootlaoder resides in bootloader area, the First stage bootloader starts from @ 0x0FE10000, the Main bootloader starts from@ 0x0FE10800 address.
          • The bootloader can't be erased with "commander device masserase".
          • If you want to remove the Gecko Bootloader, a new dummy Bootloader (can be found in stack installation directory) has to be flashed.
        • Bootloader "-combined" file with both first-stage and second-stage (Main Bootloader) in one file.
        • For the first time, the first stage should be flashed to the chip, so you must flash the "-combined" Bootloader for the first time. Then in future, you only need to flash the second-stage (Main Bootloader).
        • Secure Firmware Update
          • Verification of new image before bootloading
          • Signed GBL file: ECDSA-P256->ensures only accepting images trusted by vendor
          • Encrypted GBL file: AES-128 ->ensures encryption during transfer, image storage
        • Secure Boot
          • Verification of image in flash before running
          • Signed application image: ECDSA-P256
        • Documentation: UG266.
      • EFR32xG devices inside BGM/MGM modules

        satownse | 10/293/2017 | 04:19 PM


        What EFR32 device is under the hood of the various BGM/MGM module products?


        See this table for a mapping of the EFR32 inside the module:

        This is important for application development, as Simplicity Studio and Simplicity Commander identify the module by the EFR32 device inside rather than by the module itself.  Efforts are in process to allow for module identification within Studio/Commander for a future release. 

      • Measuring sleep current on Custom Board EFR32MG1 using the Z3Switch sample app

        Lesun | 09/269/2017 | 04:48 AM


        Measuring sleep current on Custom Board EFR32MG1 using the Z3Switch sample app



        If you would like to measure the sleep current with WSTK Kit, you can refer to the following KBA. 

        Measuring sleep current on EFR32MG1 using the Z3Switch sample


        Sometimes, some custom would like to measure sleep current on their customize board. There are some differences from the above KBA. Here is an example of measuring sleep current on one of custom board, it is based on the EFR32MG1B132F256GM32 chip.


        We are using the same Z3Switch sample app based on EmberZNet5.7.3GA following these simple steps:


        1. Create a new project based on the Z3 Switch sample app, and make these modifications in the .isc file:

        - Under the "Znet stack" tab, change the device type to Sleepy End Device

        - Under HAL configuration tab, make sure "Selected architecture" is your actual part number.

        - Under HAL configuration tab, make sure you choose a Custom Board Header for your project. Please refer to the attached Z3SwitchSoc_board.h.

        - Under Plugins tab, disable "heartbeat".

        - Under Plugins tab, check the option “Stay awake when NOT joined” in “Idle/Sleep”, so that the device won’t enter sleep mode at start, and then you can use CLI console for test.

        - Under Includes tab, add the following two directories. 



        1. Make sure you modify the following points in the board header file and other files.

        - Add  #define DISABLE_PTI in the board header file.

        - Comment #define COM_USART0_HW_FC in the board header file.

        - Remove the halInternalInitButton() in halInternalInitBoard() in wstk-common.h file.

        #define halInternalInitBoard() do {                                \
         halInternalInitLed();                                             \
         halInternalPowerUpBoard();                                        \
         halInternalConfigPti();                                           \
         halInternalConfigPa();                                            \
         halInternalEnableDCDC();                                          \
         halInternalInitRadioHoldOff();                                    \
         halInternalInitPta();                                             \
         halInternalInitPrs();                                             \
         halInternalInitAntennaDiversity();                                \
        } while(0)

        - Configure the UART  Tx/Rx Pin in com.h


         or you may use the RETARGET_USART0, so you may need modify the UART Rx/Rx in retargetserialconfig.h


          #define RETARGET_TX_LOCATION _USART_ROUTELOC0_TXLOC_LOC15  /* Location of of USART TX pin */
          #define RETARGET_RX_LOCATION _USART_ROUTELOC0_RXLOC_LOC15  /* Location of of USART RX pin */
          #define RETARGET_TXPORT      gpioPortC                    /* UART transmission port */
          #define RETARGET_TXPIN       10                            /* UART transmission pin */
          #define RETARGET_RXPORT      gpioPortC                    /* UART reception port */
         #define RETARGET_RXPIN    11                            /* UART reception pin */


        1. Generate and build the project, and upload it along with an application bootloader to the chip, usually you should build the application bootloader first by yourself. The power switch on the WSTK board should be set to "AEM".
        2. Launch the console and let the device join a network, then it will enter sleep mode.
        3. Disconnect from the node in the Network Analyzer view.
        4. Power cycle the board.
        5. Start Energy Profiler, connect to the node and start profiling. You should see sleep current around 3-4 uA.


      • Smart Energy Security Types - SE security Full vs SE security Test

        machatta | 09/261/2017 | 11:13 AM

        The Smart Energy (SE) security is based on certificate-based key establishment (CBKE) using Elliptic-Curve Cryptography (ECC). This includes the ECC 163k1 curve used by Smart Energy 1.0 and 1.1, as well as the ECC 283k1 curve used by Smart Energy 1.2.


        Smart Energy 1.0 utilized an ECC 163k1 curve with a 48-byte certificate format. All certified devices are required to support this. Smart Energy 1.2 introduces a new curve ECC 283k1, and a 74-byte certificate format. Smart Energy 1.2 devices must support the existing 163k1 ECC curve and may also support the new 283k1 curve.


        There are two types of smart energy security settings which you can select from the Znet Stack tab as following:

        a)If you are using unique, per-device link keys based on installation codes for joining devices, as should be the case for production deployments, set the Security option to "Smart Energy Security full (compliant)". Enable Install Code Library Plugin.

        b)If you are using a single, global link key for all devices to join, as is often used in development/testing scenarios to reduce complexity, set the Security option to "Smart Energy Security test".


        If you have selected 'Smart Energy Security full' option then you will need to flash install codes on joining devices to EM35x as per section 3.4 and to EFR32 as per section 3.5 of AN714.


        You can use CLI command option install-code to add install code link key on coordinator.



        option install 0 {00 21 ED 00 00 00 00 52} {24 AA A3 D7 DC 53 50 D6}



        index in link key table = 0

        End device EUI = 00 21 ED 00 00 00 00 52

        End device install code = 24 AA A3 D7 DC 53

        Install code CRC = 50 D6 ( actual CRC is 0xD650)


        Confirm that the proper key table entry now exists and is displayed in the output of the "keys print" command at the trust center.

      • How to build a custom Xon/Xoff NCP firmware with 5.10.1 EmberZnet stack?

        Lesun | 09/248/2017 | 05:25 AM


        How to build a custom Xon/Xoff NCP firmware with 5.10.1 EmberZnet stack?




        • Prerequisite:
          • Silicon Labs “Simplicity Studio” 4.1.3 or later and has been installed
          • Gecko SDK 1.1 and Ember ZNet Pro 5.10.1 stack have been installed
        • File -> New -> Project. Select “Silicon Labs AppBuilder Project” and click “Next”


        • Select “Customizable network coprocessor (NCP) applications” and click “Next”


        • Select “EmberZNet GA Network Coprocessor(NCP) Application Framework” and click “Next”


        • Select “xNCP LED” sample application and click “Next”
        • 4.png
        • Use the default project name or “xncp-led” or rename the project and then click “Next”


        • In “Boards” input box, selects “nothing”, in “Part” input box, selects as “EFR32MG1B232F256M32” then click “Finish”


        • The project will now open up in the Simplicity IDE. Select the “Plugins” tab page. Type “ncp” in the input box and select the “NCP - UART” plugin. At right side, pick the Flow Control Type as “Software”


        • Select the “Plugins” tab page. Type “hal” in the input box and select the “HAL Configuration” plugin. At right side, pick the UART0 Flow Control mode as “HAL_USART_FLOW_CONTROL_SW”.


        • Select the “Other” tab page. In “Additional.c and .h files, include paths, libraries”, select “Add directory” button, input the following two paths:




        And select “Add file”, input the following file:

        C:\SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\hardware\kit\EFR32MG1_BRD4151A\config\ brd4151a.h


        • Modify the wstk-common.h to remove the repeated HalBoardLedPins define for LED.


        #if 0
        enum HalBoardLedPins {
          BOARDLED0 = 0,
          BOARDLED1 = 1,
          BOARDLED2 = BOARDLED0,
          BOARDLED3 = BOARDLED1,
        • Save the project and click the top right “Generate” button to generate the NCP source codes in the project folder. Wait till code generation completes and then click “OK” to close the “Generation successful” dialog.
        • In current project directory, e.g. “c:\[User]”\SimplicityStudio\v4_workspace\xnap-ista90\.Replace the board header file ncp-board.h with following custom header file for IST-A90:
        /** @file hal/micro/cortexm3/efm32/board/brd4151a.h
         * BRD4151A-EFR32MG 2.4 GHz 19.5dBm (SLWSTK6000A)
         * See @ref board for detailed documentation.
         * <!-- Copyright 2016 Silicon Laboratories, Inc.                        *80*-->
        /** @addtogroup board
         *  @brief Functions and definitions specific to the breakout board.
        #ifndef __BOARD_H__
        #define __BOARD_H__
        #include "bspconfig.h"
        //#include "mx25flash_config.h"
        // This will only work on EmberZNet Stack 5.8 or later.
        // Add this definition if your board lacks an external LFXO
        // In prior versions of the EmberZNet Stack, this will have to be added
        // as an additional macro on the Other tab of the ISC file.
        #define RTCDRV_USE_LFRCO
        // Comment out the xNCP build you are not using
        // Leave the one you are using defined
        #define UART_XNCP_BUILD
        //#define SPI_XNCP_BUILD
        // Define board features
        // #define DISABLE_PTI
        // #define DISABLE_DCDC
        #ifdef UART_XNCP_BUILD
         * Start - UART xNCP Definition Block
         * USART0 used for UART xNCP
        // Enable COM port to use retarget serial configuration
        //#define COM_RETARGET_SERIAL
        // Enable HW flow control
        #define COM_USART0_HW_FC
        // Refer to the EFR32MG1 Mighty Gecko Data Sheet Page 139
        // http://www.silabs.com/Support%20Documents/TechnicalDocs/efr32mg1-datasheet.pdf
        // GPIO   Location   Signal Name
        //  PA0  - Loc 0  - US0_TX
        //  PA1  - Loc 0  - US0_RX
        //  PA2  - Loc 0  - US0_CTS      - NA
        //  PA3  - Loc 0  - US0_RTS      - NA
        // Define USART0 TX/RX Location
        // Define USART0 flow control pins - CTS
        //#define USART0_CTS_PORT gpioPortA
        //#define USART0_CTS_PIN 2
        // Define USART0 flow control pins - RTS
        //#define USART0_RTS_PORT gpioPortA
        //#define USART0_RTS_PIN 3
         * End - UART xNCP Definition Block
        #ifdef SPI_XNCP_BUILD
         * Start - SPI xNCP Definition Block
         * USART1 used for SPI xNCP
        // Refer to the EFR32MG1 Mighty Gecko Data Sheet Pages 139-140
        // http://www.silabs.com/Support%20Documents/TechnicalDocs/efr32mg1-datasheet.pdf
        // GPIO   Location   Signal Name
        //  PC6  - Loc 11 - US1_TX
        //  PC7  - Loc 11 - US1_RX
        //  PC8  - Loc 11 - US1_CLK
        //  PC9  - Loc 11 - US1_CS
        #define SPI_NCP_USART1                                                    \
        {                                                                         \
          USART1,                       /* USART port                       */    \
          _USART_ROUTELOC0_TXLOC_LOC11, /* USART Tx pin location number     */    \
          _USART_ROUTELOC0_RXLOC_LOC11, /* USART Rx pin location number     */    \
          _USART_ROUTELOC0_CLKLOC_LOC11,/* USART Clk pin location number    */    \
          _USART_ROUTELOC0_CSLOC_LOC11, /* USART Cs pin location number     */    \
          0,                            /* Bitrate                          */    \
          8,                            /* Frame length                     */    \
          0xFF,                         /* Dummy tx value for rx only funcs */    \
          spidrvSlave,                  /* SPI mode                         */    \
          spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
          spidrvClockMode0,             /* SPI clock/phase mode             */    \
          spidrvCsControlAuto,          /* CS controlled by the driver      */    \
          spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
        // Default nHOST_INT to PA4 -> EXP7 on WSTK6001
        #define NHOST_INT_PORT gpioPortA
        #define NHOST_INT_PIN 4
        // Default CS/nSSEL to PC9 -> EXP10 on WSTK6001
        #define NSSEL_PORT gpioPortC
        #define NSSEL_PIN 9
        // Default nWAKE_PORT to PB11 -> EXP9 on WSTK6001
        #define NWAKE_PORT gpioPortB
        #define NWAKE_PIN 11
        // Default to using nWAKE for the bootloader recovery GPIO.
         * End - SPI xNCP Definition Block
        #define halInternalConfigPa() do {                                 \
          RADIO_PAInit_t paInit = RADIO_PA_2P4_INIT;                       \
          RADIO_PA_Init(&paInit);                                          \
        } while(0)
        // Include common definitions
        #include "board/wstk-common.h"
        #endif //__BOARD_H__
        /** @} END Board Specific Functions */
        /** @} END addtogroup */
        • In Simplicity Studio top menu panel, pick from “Project” -> “Build Project”, wait till the compilation success. The xncp-led firmware is located at “C:\Users\[user]\SimplicityStudio\v4_workspace\xncp-ista90\IAR ARM - Default\”
        • Click the “Flash Programmer” button on the Simplicity Studio’s top command toolbar to launch the flash programmer utility. Select the firmware file “xncp-led_ista90.s37” and then flash the firmware image.