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.

[参考译文] LAUNCHXL-CC26X2R1:将变量读写到 NV-RAM 中

Guru**** 2578945 points
Other Parts Discussed in Thread: CC2630, CC2650, Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/728305/launchxl-cc26x2r1-read-and-write-variables-into-nv-ram

器件型号:LAUNCHXL-CC26X2R1
Thread 中讨论的其他器件:CC2630CC2650Z-stack

尊敬的 TI 团队:

我想将变量的值读写到 NVRAM 中。 您是否有任何我可以使用的 API、并提供一些示例代码供参考?

非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以尝试使用 zclport_readnV/zclport_writeNV
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,
    我可以为 zclport_readnv/ zclport_writenv 的函数使用什么范围的 id - NV ID 和 subId - NV ID?
    您是否有一些 zclport_writeNV 和 zclport_readnv 的示例代码供我参考?
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我回答正确、NV ID 范围介于0x0280到0x02FF 之间、您可以将 subId - NV ID 保留为0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,
    我发现您提到 NV ID 的范围是为 zcomdef.h 文件中的 APS 链接键表条目保留的
    //为 APS 链接键表条目保留的 NV 项目
    // 0x0201 - 0x02FF
    #define ZCD_NV_APS_LINK_KEY_DATA_START 0x0201 // APS 密钥数据
    #define ZCD_NV_APS_LINK_KEY_DATA_END 0x02FF

    我想知道是否仍然可以使用0x0280到0x02FF 的范围?

    另一个问题:
    如果我使用 zclport_writeNV 函数写入数据、那么当我调用 bdb_resetLocalAction 函数时、数据是否会被擦除(数据将消失)?

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我会为您提供有关 CC2650/CC2630的信息。 对于 CC2652/CC1352、应为0x0401 -0x0FFF。 不可以、调用 bdb_resetLocalAction 后、这些自定义 NV ID 不会被擦除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,
    我是否有办法擦除这个 NV ID、或者我只能使用 zclport_writeNV 的函数来写入数据的初始值?
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用 zclport_writeNV 为数据写入初始值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,YK,
    我在按下按钮后使用以下代码初始化、写入和读取 NVRAM。 但它似乎不起作用。 我输出了读取 NVRAM 的结果,但该值不正确。 我会错过什么吗?

    我还检查了 INIT (NV_IT_UNINIT 0x09)、WRITE (NV_ITE_UNINIT 0x09)和 READ (成功 0x00)的状态。  


    /*读/写 NVRAM*/
    uint8 join_result;
    uint16_t customNvID=0x0402;;
    //join_result=0x01;

    uint8 result_read;
    zclport_initializeNVItem (customNvID、0、1、(void*)&join_result);

    //printf ("result_init=%02x\n"、result_init);
    //fflush (stdout);

    Joine_Result = 0x00;
    zclport_writeNV (customNvID、0、0、1、(void*)&join_result);
    //printf ("result_write=%02x\n"、result_write);
    //fflush (stdout);

    uint8 temp_value;
    result_read=zclport_readnv (customNvID、0、0、1、(void*)&temp_value);
    printf ("result_read=%02x temp_value=%02x\n"、result_read、temp_value);
    fflush (stdout);

    谢谢

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

    您好,YK,
    zclport_writeNV 的返回代码为 nV_item_UNINIT (0x09)、而 zclport_readnv 为 Success (0x00)

    似乎我没有成功写入。

    谢谢

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

    您好,YK,
    我已经叫它。 您可以参考我的代码。 每次我想使用读/写时都需要调用 init 函数?

    或者、我需要将 zclport_initializeNVItem 的函数放入 init 应用程序中吗?

    静态空 zclSampleSw_processKey (uint8 keyPressed)

    if (keysPressed = key_right)


    /*读/写 NVRAM*/
    uint8 join_result;
    uint16_t customNvID=0x0402;;
    //join_result=0x01;

    uint8 result_init;
    uint8 result_write;
    uint8 result_read;
    result_init=zclport_initializeNVItem (customNvID、0、1、(void*)&join_result);

    printf ("result_init=%02x\n"、result_init);
    fflush (stdout);

    Joine_Result = 0x00;
    result_write=zclport_writeNV (customNvID、0、0、1、(void*)&join_result);
    printf ("result_write=%02x\n"、result_write);
    fflush (stdout);

    uint8 temp_value;
    result_read=zclport_readnv (customNvID、0、0、1、(void*)&temp_value);
    printf ("temp_value=%02x result_read=%02x\n"、temp_value、result_read);
    fflush (stdout);


    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否尝试使用0x0303而不是0x0402作为 NV ID 来测试并查看其是否正常工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,
    我尝试使用0x0303而不是0x0402、它工作正常。
    但为什么呢? 我应该能够使用0x0402~0x0FFF 范围内的0x0402
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我怀疑源代码中的注释错误、但我确定0x0303处于正确范围内。 我只想确认这个、所以我要求您进行测试。 需要 TI 员工帮助提供正确的覆盖范围。

    您是否知道为应用程序使用提供了正确的 NV ID 范围?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,YK,
    注意到。

    尊敬的 Ryan Brown1:
    您能否帮助提供为应用预留的正确 NV ID 范围?

    我们是否有任何可用于取消设置 NV ID 的 API?

    我是否可以通过任何方法取消将参考板(CC2652)上的所有 NV ID 设为默认值? 我很疲惫地按下 CC2652参考板上的 RESET 按钮来重置 NV ID、因为我已经写入了一些数据、但它不起作用。


    谢谢

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

    您好,黄伟,劳伦斯,

    每个 NV 项目的长度为8字节(四个字)、因此0x400项目为8 KB (或两页)的闪存存储器、默认情况下、所有这些都在 hal_board_cfg.h 中分配  如果您想访问0x400以上的 NV 项目空间、请尝试增大 HAL_NV_PAGE_CNT。  至于在复位时清除 NV 项目:

    Zstack_sysResetReq_t resetReq;
    restReq.newNWkState = true;
    (void) Zstackapi_sysResetReq (zclSampleLight_Entity、&resetReq);
    

    只要 newNWKState 设置为 true、这就应该执行出厂复位。  这是指向 Z-Stack API 指南的链接、尽管我们确实认识到我们目前正在努力解决一些 API 缺失的问题:

    此致、

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我们不增加 HAL_NV_PAGE_CNT,会为应用保留哪个 NV ID 范围?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    此外,还有黄大黄的问题。 我想再问一个问题。

    bdb_resetLocalAction()函数与 Zstackapi_sysResetReq 的 API 之间有何差异?

    我知道 bdb_resetLocalAction 的函数只能复位 ZigBee 的设置。

     Zstackapi_sysResetReq 的 API 可以重置(清除) ZigBee 和 NV 项目的设置、或者它只能重置(清除) NV 项目的设置?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BDB_resetLocalAction()提供应用程序接口来执行 BDB 复位到 FN。 Zstackapi_sysResetReq 是 Z-Stack API、通过 ICall 调度程序向 ZStack Thread 发送系统复位请求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,YK,
    我想知道 Zstackapi_sysResetReq 是否可以重置 Zigbee 的设置和 NV 项目?

    似乎无法重置我的测试中的 NV 项目。
    谢谢

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

    您好,YK,
    我自己修改它的其他 NV 项目、而不是0x0303 (NV ID)等网络信息、情况如何?

    它似乎无法重置测试中不是网络信息的其他 NV 项目。
    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您可以使用那些未在 zcomdef.h 中定义的 NV ID
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ryan、
    Zstackapi_sysResetReq 的 API 可复位 NV 项目中 ZigBee 信息的设置。
    但是、我无法使用此 API 来重置我自己修改过的一些 NV 项目(而非 ZigBee 的信息)。
    我们是否有任何 API 可重置或删除这些 NV 项目?
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用以下代码通过 Zstackapi_sysResetReq 清除 netowrk 信息

    ZStack_sysResetReq_t restReq;
    restREQ.newNWKState = true;
    Zstackapi_sysResetReq (zswEntity、&restReq);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,黄
    我知道我可以使用 Zstackapi_sysResetReq 的 API 来清除 netowrk 信息(Zigbee)。
    但我想清除自己通过 zclport_writeNV 修改的 NV 项目(而不是网络信息)。
    我想知道是否有任何 API 可用于此目的。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没有这样的 API 可清除您的定制 NV ID。 您必须使用 zclport_writeNV 才能自行实现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,
    记录良好。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,

    虽然不是固有的"为应用保留"、NV ID 0x330到0x3FF 未使用、可以考虑使用。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Ryan。 我想知道此范围是否为应用预留,且不会被 Z-Stack 内核使用? 我建议您在下一个发布的文档中列出此内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,YK,

    如果您查看 zcomdef.h、则会看到如下内容的注释:

    //为应用保留 NV 项目(用户应用)
    // 0x0401–0x0FFF

    我建议使用此范围的保留 NV 项目、即使现在未使用例如0x0303、此项目也可用于堆栈的未来版本以获得新功能、例如、 因此、不能保证 将来对于0x0401–0x0FFF 范围之外的项目可用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否意味着我们必须增加 HAL_NV_PAGE_CNT? 如果是、您是否计划在下一个 Z-Stack 版本中默认增加 HAL_NV_PAGE_CNT 并将其添加到文档中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不可以、只需注意使用0x0401–0x0FFF 范围内的 NV 项目、以避免将来从堆栈中保留的项目出现问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ,但 Lawrence 测试了0x0401,不起作用。 这就是为什么我建议他使用0x0303而不是0x0401的原因, 建议如果我们要使用0x0401,则对 HAL_NV_PAGE_CNT 进行 ncreasing。 如果要使用0x0401、是否确定不必对 HAL_NV_PAGE_CNT 进行折页?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,YK,

    我查找的是示例代码,并且以错误的方式进行写入,请查看 zcl_port.c 中的 zclGeneral_AddScene(), zclSceneNVID 等于 ZCL_port_Scene_table_nv_ID,该值在 zcl_port.h 中定义为0x0001。 zclport NV API 以与以前不同的方式保存项目、因为现在有两个 ID 提供 NV 项目的位置。

    从 zcl_port.h:

    /**默认 ZCL 场景表 NV 项目 ID */
    #define ZCL_PORT_Scene_Table_NV_ID 0x0001
    /**默认 ZCL 代理表 NV 项目 ID */
    #define ZCL_PORT_PROVITY_TABLE _NV_ID 0x0002/**
    默认 ZCL 接收器表 NV 项目 ID */
    #define ZCL_PORT_SINK_TACK_NOT_ID 0x0003 

    工作的代码如下:

    #define custom_nv_ID 0x0004
    
    static void zclSampleSw_processKey (uint8 keyssed)
    {
    if (keyssed = key_right)
    {
    /*读/写 NVRAM*/
    uint8 join_result;
    uint16_t customNvID = custom_nv_ID;
    //join_result=0x01;
    
    uint8 result_init;
    uint8 result_write;
    uint8 result_read;
    result_init=zclport_initializeNVItem (customNvID、0、1、(void*)&join_result);
    
    printf ("result_init=%02x\n"、result_init);
    fflush (stdout);
    
    Joine_Result = 0x00;
    result_write=zclport_writeNV (customNvID、0、0、1、(void*)&join_result);
    printf ("result_write=%02x\n"、result_write);
    fflush (stdout);
    
    uint8 temp_value;
    result_read=zclport_readnv (customNvID、0、0、1、(void*)&temp_value);
    printf ("temp_value=%02x result_read=%02x\n"、temp_value、result_read);
    fflush (stdout);
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是不是说当您使用 API zclport_writeNV 和 zclport_readnv 时、我们可以在应用程序中使用0x0004~后的自定义 NV ID? 您可以确认这一点吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、您也可以查看  gp_ProxyTblInit()中的绿色电源代理表、此函数位于 gp_proxy.c 中、其中代理表初始化为 ZCL_port_proxy_table_nv_ID、其中元素数量等于 GPP_MAX_proxy_table_entries、这意味着"subp_entries 将从 GPP_MAX_entries 开始。

    uint8 gp_ProxyTblInit( uint8 resetable )
    {
    uint8 i;
    uint8 status;
    uint8 emptyEntry [proxy_TBL_LEN];
    
    GP_ResetProxyTblEntry (emutyEntry);
    
    对于(i = 0;i < GPP_MAX_PROXY TABLE _entries;i++)
    {
    status = zclport_initiataleNVItem (ZCL_port_proxy_table_nv_ID,(ZCD_nv_proxy_table_start + i),
    proxy_TBL_LEN、
    emptyEntry );
    
    if ((status!= Success)&(status!= nV_item_UNINIT))
    {
    返回状态;
    }
    否则((status == Success)&&(resettable == true))
    {
    status = zclport_writeNV (ZCL_port_proxy_table_nv_ID、(ZCD_nv_proxy_table_start + i)、
    0、
    proxy_TBL_LEN、
    emptyEntry );}
    
    }
    返回状态;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的详细阐述。 由于这是一个常见问题、我建议您将其放入下一个 Z-Stack 版本的文档中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,YK,
    我想再次确认它。
    根据 Jose Maria Alvarez 的说法、如果我使用 API zclport_writeNV 和 zclport_readnv、我们可以直接使用0x0004的值。
    它也不会影响其他 Zigbee 的 NV 项目? 我是对的吗?
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、Jose 确认了这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,黄和何塞,
    记录良好。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,YK,

    我将在我们的文档中找到合适的位置来解决这一问题、但用户指南的 Z-Stack 概述部分的第9.6.3节中提到了这一点。  用户应该能够参考门锁控制器示例、以了解在其应用中实现定制 NV 项目的用例场景。  nvertp.c 中定义了此 nv id 的最大值:

    //最大 ID 参数-必须与头压缩协调,
    //增加这些限制需要修改 readHdr()函数
    #define NVOCTP_MAXSYSID 0x003F // 6位
    #define NVOCTP_MAXITEMID 0x03FF // 10位
    #define NVOCTP_MAXSUBID 0x03FF // 10位
    #define NVOCTP_MAXLEN 0x03FF // 10位 

    此致、Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经阅读了《用户指南》Z-Stack 概述部分的第9.6.3节、但没有具体说明可供用户了解用户应用的确切安全 NV ID 范围、因此我建议您更明确地记录该范围。