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.

CC2652R: CC13x2 CC26x2 SDK Zigbee Known Issues and Fixes

Part Number: CC2652R
Other Parts Discussed in Thread: SYSCONFIG

simplelink_cc13x2_26x2_sdk_3_40_00_02

1. Removing board constraints in SysConfig with "Custom Board" button causes unexpected build or runtime behavior.

Refer to this E2E FAQ: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz/f/156/t/864899 

2. Joining device (ZR/ZED) ignores PAN ID config settings and incorrectly associates when two ore more Zigbee networks respond to a beacon.

Apply the following code changes to bdb.c:

void bdb_filterNwkDisc(void)
{
  networkDesc_t* pNwkDesc;
  uint8_t i = 0;
  uint8_t ResultCount = 0, ResultTotal = 0;         //CHANGE THIS LINE

  pBDBListNwk  = nwk_getNwkDescList();
  nwk_desc_list_release();

  pNwkDesc = pBDBListNwk;
  while (pNwkDesc)
  {
    ResultCount++;
    pNwkDesc = pNwkDesc->nextDesc;
  }
  ResultTotal = ResultCount;                        //ADD THIS LINE

  if(pBDBListNwk)
  {
    pNwkDesc = pBDBListNwk;

    if(pNwkDesc)
    {
      for ( i = 0; i < ResultTotal; i++, pNwkDesc = pNwkDesc->nextDesc )        //CHANGE THIS LINE
...

3. A malloc with size of zero will cause HEAPMGR_ASSERT

Place heapInitialize=1 after HEAPMGR_INIT calls HEAPMGR_MALLOC(0) in rtos_heaposal.h

4. Incorrect source offset results in NV corruption

Make the following change inside of nvocmp.c:

static bool NVOCMP_findSignature(uint8_t pg, uint16_t *pSrcOff)
{
  uint16_t i;
  uint16_t rdLen;
  uint8_t readBuffer[NVOCMP_XFERBLKMAX];
  uint16_t srcOff = *pSrcOff;
  uint16_t endOff = NVOCMP_PGDATAOFS + NVOCMP_ITEMHDRLEN - 1;

  while(srcOff > endOff)
  {
    rdLen = (srcOff - NVOCMP_XFERBLKMAX > endOff) ? NVOCMP_XFERBLKMAX : srcOff - endOff;
    srcOff -= rdLen;
    NVOCMP_read(pg, srcOff, readBuffer, rdLen);
    for(i = rdLen; i > 0; i--)
    {
      if(readBuffer[i-1] == NVOCMP_SIGNATURE)
      {
        // Found possible header, resume normal operation
        NVOCMP_ALERT(FALSE, "Found possible signature.")
        srcOff += (i);          //CHANGE THIS LINE
        *pSrcOff = srcOff;
        return(true);
      }
    }
  }
  return(false);
}

5. Zigbee devices do not rejoin (after a reset) if using install codes

Solution:

In bdb_StartCommissioning, replace the contents between the "#ifdef ZG_BUILD_JOINING_TYPE" and "#endif //ZG_BUILD_JOINING_TYPE" with:

#ifdef ZG_BUILD_JOINING_TYPE
      //Only for joining devices validate the joining procedure
      if(ZG_DEVICE_JOINING_TYPE)
      {
        //If we got into a network
        if(!OsalPort_isBufSet( AIB_apsTrustCenterAddress, 0x00, Z_EXTADDR_LEN ))
        {
          //Which is not distributed
          if(!APSME_IsDistributedSecurity())
          {
              uint8_t found;
              uint16_t entryIndex;
              APSME_TCLinkKeyNVEntry_t APSME_TCLKDevEntry;

              entryIndex = APSME_SearchTCLinkKeyEntry(AIB_apsTrustCenterAddress, &found, &APSME_TCLKDevEntry);

            //If we must perform the TCLK exchange and we didn't complete it, then reset to FN
            if(requestNewTrustCenterLinkKey && (APSME_TCLKDevEntry.keyAttributes != ZG_NON_R21_NWK_JOINED) && (APSME_TCLKDevEntry.keyAttributes != ZG_VERIFIED_KEY))
            {
              if(entryIndex < gZDSECMGR_TC_DEVICE_MAX)
              {
                //Force to initialize the entry
                memset(&APSME_TCLKDevEntry,0,sizeof(APSME_TCLinkKeyNVEntry_t));
                APSME_TCLKDevEntry.keyAttributes = ZG_DEFAULT_KEY;
                osal_nv_write_ex(ZCD_NV_EX_TCLK_TABLE, entryIndex,
                                sizeof(APSME_TCLinkKeyNVEntry_t),
                                &APSME_TCLKDevEntry);

                TCLinkKeyRAMEntry[entryIndex].txFrmCntr = 0;
                TCLinkKeyRAMEntry[entryIndex].rxFrmCntr = 0;
                TCLinkKeyRAMEntry[entryIndex].entryUsed = FALSE;
              }

              //reset the device parameters to FN
              bdbAttributes.bdbNodeIsOnANetwork = FALSE;
              osal_nv_write(ZCD_NV_BDBNODEISONANETWORK, sizeof(bdbAttributes.bdbNodeIsOnANetwork), &bdbAttributes.bdbNodeIsOnANetwork);
              zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_CONFIG_STATE | ZCD_STARTOPT_DEFAULT_NETWORK_STATE);

              //Then start the commissioning process requested
              bdbCommissioningProcedureState.bdbCommissioningState = BDB_COMMISSIONING_STATE_START_RESUME;
              OsalPort_setEvent( bdb_TaskID, BDB_CHANGE_COMMISSIONING_STATE );
              return;
            }
          }
        }
      }
#endif //ZG_BUILD_JOINING_TYPE

And in function ZDSecMgrTransportKeyInd of zd_sec_mgr.c, use this (ie fix is in the else block):

// If entry is found with keyAttribute ZG_PROVISIONAL_KEY, update extAddr and write to NV
if(status == SUCCESS)
{
    OsalPort_memcpy(TCLKDevEntryCpy.extAddr, ind->srcExtAddr, Z_EXTADDR_LEN);

 
    //Save the KeyAttribute for joining device
    osal_nv_write_ex(ZCD_NV_EX_TCLK_TABLE, entryIndex,
                     sizeof(APSME_TCLinkKeyNVEntry_t),
                     &TCLKDevEntryCpy);
}
else
{
    // Find TCLK entry with TC extAddr or first unused entry
    uint8_t entryFound;
    entryIndex = APSME_SearchTCLinkKeyEntry(AIB_apsTrustCenterAddress,&entryFound,&TCLKDevEntryCpy);

 
    if(entryIndex < gZDSECMGR_TC_DEVICE_MAX)
    {
      OsalPort_memcpy(TCLKDevEntryCpy.extAddr, ind->srcExtAddr, Z_EXTADDR_LEN);

 
      //Save the KeyAttribute for joining device
      osal_nv_write_ex(ZCD_NV_EX_TCLK_TABLE, entryIndex,
                      sizeof(APSME_TCLinkKeyNVEntry_t),
                      &TCLKDevEntryCpy);
    }
}

Regards,
Ryan