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.

[参考译文] LP-CC2652RB:从 CC2530 / ZNP 迁移到 CC2652RB / ZNP 时出现的问题

Guru**** 2576575 points
Other Parts Discussed in Thread: CC2530, CC2652RB

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1572639/lp-cc2652rb-issues-with-migration-from-cc2530-znp-to-cc2652rb-znp

器件型号:LP-CC2652RB
主题中讨论的其他器件:CC2530CC2652RB

工具/软件:

您好:

几年前,我写了一个应用程序与 CC2530 和 ZNP 接收绿色电源帧。

ZNP 的设置是很好的 straigthforward : reset / setPanId / StartUpFromApp。 这样一来、芯片将发送我所需的帧。

在该序列中、setPanId 实际上是 ZB_WRITE_CONFIGURATION、configId 为 0x83、len = 0x02。 我不太确定(很久以前)、但我想我首先尝试了 UTIL_SET_PANID、但它不起作用、论坛中有人告诉我使用 ZB_WRITE_CONFIGURATION 来完成工作。

今天、我需要侦听相同的器件、但使用了 CC2652RB。 下面是我做的:

-我通过使用 CCS20.10 从 simplelink 示例导入 ZNP 来编译 ZNP。 我将 mint 编译的固件刷写到器件中。

-我试图应用相同的序列:重置/设置 PAN id 使用 ZB_WRITE_CONFIGURATION / StartupFromApp。 帧序列如下:

Reset 
-> fe 01 41 00 00 40
<- fe 06 41 80 00 02 00 02 07 01 c1

Set panid
-> fe 04 26 05 83 02 0b 00 ad
<- fe 03 60 00 01 26 05 41

Startup 
-> fe 02 25 40 00 00 67
<- fe 01 65 40 00 24 fe 03 4f 80 01 02 04 cb

Initialization complete
<- fe 01 45 c0 01 85
<- fe 01 45 c0 08 8c
<- fe 01 45 c0 09 8d fe 03
<- 4f 80 00 02 00 ce

从该序列中、我可以看到  ZB_WRITE_CONFIGURATION 以 CMD0=0x60 和 CMD1=0x00 进行回答。  在文档中、此响应为 SRSP +保留。 我应该从这个解释什么?

可能 ConfigId  与 CC2530 和 CC2652RB 不同、但我找不到介绍配置存储器映射的文档。  

我还尝试了 UTIL_SET_PAN_ID。 顺序如下:

--- reset ---
-> fe 01 41 00 00 40
<- fe 06 41 80 00 02 00 02 07 01 c1

--- set panid ---
-> fe 02 27 02 0b 00 2c
<- fe 01 67 02 0a 6e

--- startup ---
-> fe 02 25 40 00 00 67
<- fe 01 65 40 00 24 fe 03 4f 80 01 02 04 cb

Initialization complete
<- fe 01 45 c0 01 85
<- fe 01 45 c0 08 8c
<- fe 01 45 c0 09 8d fe 03
<- 4f 80 00 02 00 ce

采用该序列时、UTIL_SET_PANID 的答案为 CMD0=0x76、CMD1=0x02、Status=0x0A。 该文档指出状态可以是 0(成功)或 1(失败)、因此 0x0A 不是有效答案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    后续。

    我做了什么?

    -我建 ZNP 是正确的方式吗?

    -什么是无效的返回码?

    -听起来很奇怪吗?

    我忘记说我正在使用 LP_CC2652RB 评估板。

    感谢您的关注

    Julien

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Julien、

    下面是 TI Z-Stack 监测和测试 API 、以便于参考。

    SimpleLink F2 器件不再支持 MT SAPI(简单 API)层、因此会收到错误。  我相信您已经正确构建了 ZNP、因为固件确实在响应(在重新编程以删除以前的 NV 闪存之前,请确保恢复出厂设置或擦除所有存储器)。  您只需迁移主机代码即可支持正确的 API 集。  

    Util_set_panID 应与以前相同。  一个区别是状态值反映了 osal_nV_write 返回值。

    static void MT_UtilSetPanID(uint8_t *pBuf)
    {
      uint16_t temp16;
      uint8_t retValue;
      uint8_t cmdId;
    
      /* parse header */
      cmdId = pBuf[MT_RPC_POS_CMD1];
      pBuf += MT_RPC_FRAME_HDR_SZ;
    
      temp16 = OsalPort_buildUint16( pBuf );
    
      retValue = osal_nv_write(ZCD_NV_PANID, osal_nv_item_len( ZCD_NV_PANID ), &temp16);
    
      /* Build and send back the response */
      MT_BuildAndSendZToolResponse(((uint8_t)MT_RPC_CMD_SRSP | (uint8_t)MT_RPC_SYS_UTIL), cmdId, 1, &retValue);
    }
    

     如果不成功、OSAL_NV_WRITE (_ex) 将返回 NV_OPER_FAILED (0x0A) 或 NV_ITEM_UNINIT(不会)  

    uint8_t osal_nv_write_ex( uint16_t id, uint16_t subId, uint16_t len, void *buf )
    {
      uint8_t rtrn = SUCCESS;
      uint8_t status;
    
      if ( pZStackCfg && pZStackCfg->nvFps.updateItem )
      {
        NVINTF_itemID_t nvId;
    
        nvId.systemID = NVINTF_SYSID_ZSTACK;
        nvId.itemID = (uint16_t)id;
        nvId.subID = (uint16_t)subId;
    
        status = pZStackCfg->nvFps.updateItem( nvId, len, buf );
    
        if(status == NVINTF_SUCCESS)
        {
            rtrn = SUCCESS;
        }
        else if(status == NVINTF_NOTFOUND)
        {
            rtrn = NV_ITEM_UNINIT;
        }
        else
        {
            rtrn = NV_OPER_FAILED;
        }
      }
    
      return rtrn;
    }

    以下是 updateItem API

    static uint8_t NVOCMP_updateItemApi(NVINTF_itemID_t id, uint32_t len, void *pBuf)
    {
        uint8_t err;
        NVOCMP_itemHdr_t iHdr;
    
        // Parameter Sanity Check
        if (pBuf == NULL || len == 0)
        {
            return(NVINTF_BADPARAM);
        }
    
        err = NVOCMP_checkItem(&id, len, &iHdr, NVOCMP_FINDSTRICT);
        if(err)
        {
          return(err);
        }
    
        // Check voltage if possible
        NVOCMP_FLASHACCESS(err)
        if(err)
        {
          return(err);
        }
    
        // Prevent RTOS thread contention
        NVOCMP_LOCK();
    
        err = NVOCMP_findItem(&NVOCMP_nvHandle, NVOCMP_nvHandle.actPage, NVOCMP_nvHandle.actOffset, &iHdr,
                              NVOCMP_FINDSTRICT, NULL);
    
        if(err == NVINTF_SUCCESS)
        {
          // Create the new item
          err = NVOCMP_addItem(&NVOCMP_nvHandle, &iHdr, pBuf, NVOCMP_UPDATE);
          if((err == NVINTF_SUCCESS) && (iHdr.hofs > 0))
          {
              // Mark old item as inactive
              NVOCMP_setItemInactive(&NVOCMP_nvHandle, iHdr.hpage, iHdr.hofs);
    
              err = NVOCMP_failW;
          }
        }
        else if(err == NVINTF_NOTFOUND)
        {
          err = NVINTF_NOTFOUND;
        }
        else
        {
          NVOCMP_ALERT(false, "updateItem failed.")
          err = NVINTF_FAILURE;
        }
    
    #ifdef NV_LINUX
        if(err == NVINTF_SUCCESS)
        {
            NV_LINUX_save();
        }
    #endif
    
        NVOCMP_UNLOCK(err);
    }

    如果需要、您可以在 CCS 中进一步调试这些函数。  尽管我认为使用 SYS_OSAL_NV_WRITE 且 ID 为 0x0083 (ZCD_NV_PANID)、但偏移量 0、len 2 和 PanID 的值应同样有效。  请注意按照我前面所述的那样擦除 NV 存储器。 下面是一个 博客 、其中介绍了如何实现这一点。

    此致、
    Ryan