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.

CC2652开发板使用报告,发现的一些问题,不定期更新。

Other Parts Discussed in Thread: Z-STACK, CC2530, CC2652R

1,还是很老的问题,从CC2530的z-stack到现在最新的CC2652。

在函数MAC_CbackEvent中需要加入一段代码

    //fix the bug of msdu index erro when MAC_MCPS_DATA_CNF
    if (event == MAC_MCPS_DATA_CNF)
    {
        uint8 *originalMsdup = (uint8 *) pData->dataCnf.pDataReq
                + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET;
        pData->dataCnf.pDataReq->msdu.len -= (uint8) (originalMsdup
                - pData->dataCnf.pDataReq->msdu.p);
        pData->dataCnf.pDataReq->msdu.p = originalMsdup;
    }

否则使用AF_DataRequest在Inter PAN发送时,不会有Data Confirm消息,破坏了每个AF_DataRequest必有AF_DATA_CONFIRM消息的逻辑结构。

2,协调器在设备入网时,有很大概率出现入网设备多次Associate Request。通过在MAC_MLME_COMM_STATUS_IND打断点发现,协调器在向入网设备回复Associate Response的时候,发生0xe1错误,该错误为信道忙,但是几乎都是一个新设备第一次关联协调器会出现这个现象。只要这个设备关联过该协调器,下次就能一次性关联。

  • 补充说明问题2,CC2652协调器运行在一个很干净的信道,在新设备入网时协调器回复Associate Response,出现MAC_CHANNEL_ACCESS_FAILURE概率有点偏高。
  • 3,CC2652作为协调器,下面若干设备发起end device bind req。如果多个设备同时发起end device bind,协调器会有内存溢出的风险。

    典型例子,设备甲上面有多个cluster ID为client,设备乙上面有对应的多个cluster ID为server。设备甲发起end device bind req后,多个设备乙同时发起end device bind req。

    解决办法,在函数ZDO_MatchEndDeviceBind中,修改else后面的处理

        if(matchED->state == ZDMATCH_WAIT_REQ)//((matchED->state == ZDMATCH_WAIT_REQ) && (bindReq->srcAddr != matchED->ed1.srcAddr))
        {
          matchED->state = ZDMATCH_SENDING_BINDS;
    
          // Copy the 2nd request's information
          if ( !ZDO_CopyMatchInfo( &(matchED->ed2), bindReq ) )
          {
            status = ZDP_NO_ENTRY;
            sendRsp = TRUE;
          }
    
          // Make a source match for ed1
          matchED->ed1numMatched = ZDO_CompareClusterLists(
                      matchED->ed1.numOutClusters, matchED->ed1.outClusters,
                      matchED->ed2.numInClusters, matchED->ed2.inClusters, ZDOBuildBuf );
          if ( matchED->ed1numMatched )
          {
            // Save the match list
            matchED->ed1Matched = osal_mem_alloc( (short)(matchED->ed1numMatched * sizeof ( uint16 )) );
            if ( matchED->ed1Matched )
            {
              osal_memcpy( matchED->ed1Matched, ZDOBuildBuf, (matchED->ed1numMatched * sizeof ( uint16 )) );
            }
            else
            {
              // Allocation error, stop
              status = ZDP_NO_ENTRY;
              sendRsp = TRUE;
            }
          }
    
          // Make a source match for ed2
          matchED->ed2numMatched = ZDO_CompareClusterLists(
                      matchED->ed2.numOutClusters, matchED->ed2.outClusters,
                      matchED->ed1.numInClusters, matchED->ed1.inClusters, ZDOBuildBuf );
          if ( matchED->ed2numMatched )
          {
            // Save the match list
            matchED->ed2Matched = osal_mem_alloc( (short)(matchED->ed2numMatched * sizeof ( uint16 )) );
            if ( matchED->ed2Matched )
            {
              osal_memcpy( matchED->ed2Matched, ZDOBuildBuf, (matchED->ed2numMatched * sizeof ( uint16 )) );
            }
            else
            {
              // Allocation error, stop
              status = ZDP_NO_ENTRY;
              sendRsp = TRUE;
            }
          }
    
          if ( (sendRsp == FALSE) && (matchED->ed1numMatched || matchED->ed2numMatched) )
          {
            // Do the first unbind/bind state
            ZDMatchSendState( ZDMATCH_REASON_START, ZDP_SUCCESS, 0 );
          }
          else
          {
            status = ZDP_NO_MATCH;
            sendRsp = TRUE;
          }
        }
        //refuse new request when coordinate's end-device-binding is busy
        else
        {
          status = ZDP_NO_ENTRY;
          dstAddr.addrMode = Addr16Bit;
          dstAddr.addr.shortAddr = bindReq->srcAddr;
          ZDP_EndDeviceBindRsp( bindReq->TransSeq, &dstAddr, status, bindReq->SecurityUse );
          return;
        }

    也就是将ed2的填充,加入if(matchED->state == ZDMATCH_WAIT_REQ)的限制条件。原先的函数中,如果协调器正在进行绑定操作,此时收到新的end device bind req命令,会为ed2分配新的空间,原有的空间也不会释放,导致错误。

  • Aries Lord,请问你的是最新发布的CC2652R吗,貌似这款硬件很强大,好像没有找到不带R的版本