This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2652P: Zigbee End Device Rejoin Question

Part Number: CC2652P

My customer is using CC2652P for Zigbee application has met an issue during the a rejoin test. In the test 200 end devices were powered off and on again at the same time. After the power cycle, majority of the end devices can rejoin as expected but a few devices were not able to rejoin because of the reset timer of DEV_END_DEVICE_UNAUTH.

The state machine of the normal devices during rejoining was DEV_INIT -> DEV_NWK_SEC_REJOIN_CURR_CHANNEL -> DEV_END_DEVICE, and the failed devices was DEV_INIT -> DEV_NWK_SEC_REJOIN_CURR_CHANNEL -> DEV_NWK_SEC_REJOIN_ALL_CHANNEL -> DEV_END_DEVICE_UNAUTH. I did not find a document describing the detail of these states, could you please elaborate on what do these states represent and how does a device switch between the states?

The customer's goal is to avoid the end device to reset because of DEV_END_DEVICE_UNAUTH, is there a good way to do so?

The SDK version is simplelink_cc13xx_cc26xx_sdk_6_40_00_13, and the network has 200 end devices and 20 routers.

Best regards,


  • Hi Shuyang,

    Do I assume correctly that these devices would have rejoined correctly if they were the only devices rejoining at that time?  If so then the behavior is due to the Zigbee parent having too many rejoin responses to address and thus misses a few.  You can set a timer for MAX_DEVICE_UNAUTH_TIMEOUT other than ZDApp_ResetTimerStart and choose a custom approach to rejoin timeout behavior.  This observation is also why staggering device rejoin times is recommended.


  • Hi Ryan,

    As Shuyang mentioned above


    could you please elaborate on  how does a device switch between the states?


  • From ZDApp_ProcessNetworkJoin in zd_app.c

      else if ( devState == DEV_NWK_ORPHAN ||
                devState == DEV_NWK_SEC_REJOIN_CURR_CHANNEL ||
                devState == DEV_NWK_TC_REJOIN_CURR_CHANNEL ||
                devState == DEV_NWK_TC_REJOIN_ALL_CHANNEL ||
                devState == DEV_NWK_SEC_REJOIN_ALL_CHANNEL )
        // results of an orphaning attempt by this device
        if (nwkStatus == ZSuccess)
          //When the device has successfully rejoined then reset retryCnt
          retryCnt = 0;
          bdbSecureRejoinAttempts = 0;
          // Verify NWK key is available before sending Device_annce
          // Device performing TC rejoin shall wait until (new) NWK key received
          if ( ZDApp_RestoreNwkKey( TRUE ) == false ||
               devState == DEV_NWK_TC_REJOIN_CURR_CHANNEL ||
               devState == DEV_NWK_TC_REJOIN_ALL_CHANNEL )
            if ( ZSTACK_END_DEVICE_BUILD )
            // wait for auth from trust center
            ZDApp_ChangeState( DEV_END_DEVICE_UNAUTH );
            // Start the reset timer for MAX UNAUTH time
            ZDApp_ResetTimerStart( MAX_DEVICE_UNAUTH_TIMEOUT );