Configuring Zigbee in nRF Connect SDK¶
This page describes what is needed to start working with Zigbee in nRF Connect SDK.
Required libraries and drivers¶
Zigbee requires the following modules to properly operate in nRF Connect SDK:
ZBOSS Zigbee stack available in nrfxlib, with the OSIF subsystem acting as the linking layer between the ZBOSS stack and nRF Connect SDK. OSIF implements a series of functions used by ZBOSS and is included in the nRF Connect SDK’s Zigbee subsystem. The files that handle the OSIF integration are located in
nrf/subsys/zigbee/osif
.IEEE 802.15.4 radio driver - This library is automatically enabled when working with Zigbee on Nordic Semiconductor’s Development Kits.
Mandatory configuration¶
To use the Zigbee protocol, set the CONFIG_ZIGBEE
Kconfig option.
Setting this option enables all the peripherals required for the correct operation of the Zigbee protocol and allows you to use them.
After that, you have to define the Zigbee device role for the Zigbee application or sample by setting one of the following Kconfig options:
Router role:
CONFIG_ZIGBEE_ROLE_ROUTER
End Device role:
CONFIG_ZIGBEE_ROLE_END_DEVICE
Coordinator role:
CONFIG_ZIGBEE_ROLE_COORDINATOR
Setting any of these options enables the respective ZBOSS role library. This is needed because End Devices use different libraries than Routers and Coordinators.
For instructions about how to set Kconfig options, see Configuring your application.
Sleepy End Device behavior¶
The Sleepy End Device (SED) behavior is a Zigbee stack feature that enables the sleepy behavior for the end device.
By default, the end device regularly polls its parent for data. When the SED behavior is enabled and no frames are available for reception after the last poll, the SED disables its radio until the next scheduled poll. The Zigbee stack’s own scheduler informs the application about periods of time when nothing is scheduled for any of the device roles. This allows the stack to enter the sleep state during these periods, which also powers off some peripherals for the SED.
When the Zigbee stack thread goes to sleep, the Zigbee thread can enter the suspend state for the same amount of time as the stack’s sleep. The thread will be automatically resumed after the sleep period is over or on an event.
In the Zigbee samples in nRF Connect SDK, the sleepy behavior can be triggered by pressing a predefined button when the device is booting. This action results in calling the ZBOSS API that activates this feature. See the light switch sample for a demonstration.
Note
This feature does not require enabling any additional options in Kconfig.
Power saving during sleep¶
With the sleepy behavior enabled, the unused part of RAM memory is powered off, which allows to lower the power consumption even more. The sleep current of MCU can be lowered to about 1.8 uA by completing the following steps:
Turn off UART by setting
CONFIG_SERIAL
ton
.Enable Zephyr’s tickless kernel by setting
CONFIG_TICKLESS_KERNEL
toy
.For current measurements for nRF52840 DK board (PCA10056) - see Working with nRF52 Series or nRF52833 DK board (PCA10100) - see Working with nRF52 Series, set SW6 to
nRF ONLY
position to get the desired results.
Optional configuration¶
After enabling the Zigbee protocol and defining the Zigbee device role, you can enable additional options in Kconfig and modify ZBOSS stack start options.
You can enable the following additional configuration options:
One of the following alternative options for selecting the channel on which the Zigbee device can operate:
CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_SINGLE
- Single mode is enabled by default. The default channel is set to 16. To set a different channel, edit theCONFIG_ZIGBEE_CHANNEL
option to the desired value.CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI
- In this mode, you get all the channels enabled by default. To configure a custom set of channels in the range from 11 to 26, edit theCONFIG_ZIGBEE_CHANNEL_MASK
option. For example, you can set channels 13, 16, and 21. You must have at least one channel enabled with this option.
CONFIG_IEEE802154_VENDOR_OUI_ENABLE
- MAC Address Block Large is set to Nordic Semiconductor’s MA-L block (f4-ce-36) by default. To set a different MA-L, enable this option and edit theCONFIG_IEEE802154_VENDOR_OUI
to the desired value.CONFIG_ZIGBEE_SHELL_LOG_ENABLED
- Enables logging of the incoming ZCL frames. This option is enabled by default, and it uses the logging level set inCONFIG_ZIGBEE_SHELL_LOG_LEVEL
. See Zephyr’s logger options for more information.
ZBOSS stack start options¶
Zigbee is initialized after Zephyr’s kernel start. The ZBOSS stack can be started using one of the following options:
Started and executed from the main thread, as described in the ZBOSS development guide.
Started from a dedicated Zephyr thread, which in turn can be created and started by calling
zigbee_enable()
.
The dedicated thread can be configured using the following options:
CONFIG_ZBOSS_DEFAULT_THREAD_PRIORITY
- Defines thread priority; set to 3 by default.CONFIG_ZBOSS_DEFAULT_THREAD_STACK_SIZE
- Defines the size of the thread stack; set to 2048 by default.
Custom logging per module¶
Logging is handled with the CONFIG_LOG
option.
This option enables logging for both the stack and Zephyr’s Logging API.
Stack logs¶
The stack logs are independent from Zephyr’s Logging API. To customize them, use the following options:
CONFIG_ZBOSS_ERROR_PRINT_TO_LOG
- Allows the application to log ZBOSS error names; enabled by default.CONFIG_ZBOSS_TRACE_MASK
- Sets the modules from which ZBOSS will log the debug messages withCONFIG_ZBOSS_TRACE_LOG_LEVEL
; no module is set by default.
The stack logs are provided in a binary (hex dump) format.
Zephyr’s logger options¶
Zephyr’s Logging starts with the default ERR
logging level (only errors reported).
This level is used by default by the application.
You can configure custom logger options for each Zigbee and ZBOSS module. To do this, configure the related Kconfig option for one or more modules that you want to customize the logging for:
For each of the modules, you can set the following logging options:
LOG_LEVEL_OFF
- Turns off logging for this module.LOG_LEVEL_ERR
- Enables logging only for errors.LOG_LEVEL_WRN
- Enables logging for errors and warnings.LOG_LEVEL_INF
- Enables logging for informational messages, errors, and warnings.LOG_LEVEL_DBG
- Enables logging for debug messages, informational messages, errors, and warnings.
For example, setting CONFIG_ZBOSS_TRACE_LOG_LEVEL_INF
will enable logging of informational messages, errors, and warnings for the ZBOSS Trace module.