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.

[参考译文] CC1352P:从 SDK v7.41导出的具有自定义 PHY 的 TI-15.4收集器无法向传感器发送数据

Guru**** 2392105 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1371905/cc1352p-ti-15-4-collector-exported-from-sdk-v7-41-with-custom-phy-cannot-send-data-to-sensor

器件型号:CC1352P
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我正在使用最新的 SDK v7.41和定制 PHY 测试我们的一些基于15.4收集器/传感器项目的旧无线电、发现了一些奇怪的行为。 传感器可以加入网络并将数据发送到收集器、但收集器无法将数据发送到传感器。 传感器节点配置为每分钟轮询收集器一次数据、但收集器将在数据发送后5秒调用以下函数:

/*!
 * @brief      MAC Data Confirm callback.
 *
 * @param      pDataCnf - pointer to the data confirm information
 */
static void dataCnfCB(ApiMac_mcpsDataCnf_t *pDataCnf)

状态代码0xF0如所示

 

/*! General MAC Status values */
typedef enum
{
    //......
    /*!
     The associate response, disassociate request, or indirect
     data transmission failed because the peer device did not respond
     before the transaction expired or was purged
     */
    ApiMac_status_transactionExpired = 0xF0,
	//......
} ApiMac_status_t;

当自定义 PHY 关闭时、如果传感器节点在非信标和跳频模式下仍处于活动状态、则收集器可以正常向传感器发送数据。 如果传感器节点被关闭、在使用状态代码0xF0调用 dataCnfCb 之前、收集器等待的时间将超过 CONFIG_POLLING_INTERVAL。

当通过手动修改 ti_radio_config.c 将同一个自定义 PHY (WB-DSSS)加入15.4堆栈时、收集器也可以正常地向传感器节点发送数据。

我想可能的原因之一是收集器观察到针对传感器节点的缓存数据的5秒硬编码过期时间。 如果我将轮询间隔设置为短于5秒(例如2秒)、传感器节点将接收收集器发送的部分数据、但不是所有数据。 这也有其他问题。

请告知:

谢谢!

ZL

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

    我将自动生成的 ti_radio_config.c 文件与我们从 SmartRF Studio 导出的文件进行了比较、似乎有一些细微的差异。 以下几行看起来特别可疑:

    const rfc_CMD_PROP_TX_ADV_t RF_cmdPropRxAdv_custom =
    {
        //......
        .condition.rule = 0x0,
        //......
    };
    
    // CMD_PROP_RX_ADV
    // Proprietary Mode Advanced Receive Command
    const rfc_CMD_PROP_RX_ADV_t RF_cmdPropTxAdv_custom =
    {
        //.....
        .condition.rule = 0x0,
        //.....
    };

    它们与我们从 SmartRF Studio 导出的代码不同、也与自定义 PHY 关闭时自动生成的 ti_radio_config.c 不同。

    一旦 ti_radio_config.c 的内容被替换为从 SmartRF Studio 导出、一切似乎都能再次正常工作。

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

    我必须承认、我不完全理解您在向 TI15.4堆栈添加 PHY 时、在代码中执行了该堆栈当前不支持的具体操作。

    但是、WB-DSSS PHY 使用正常的 RX 和 TX 命令(不是高级命令)、这在 SmartRF Studio 和 SysConfig 中都使用。

    在这些命令中、 .condition.rule = 0x1

    还可以看到、如果导出本身使用高级 RX 和 TX 命令的 PHY、也会在这里设置该字段。

    如果您选择尝试实现不受支持的 PHY、并且还希望更改用于此 PHY 的命令、则需要确保正确设置命令。 SysConfig 不支持在命令类型之间进行更改。

    但是、我很高兴听到一切都已启动并在运行。

    Siri

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

    我刚刚意识到、为15.4添加自定义 PHY 已添加到最新的 SDK 中、我看到它使用高级命令、而不是 WB-DSSS 的正常命令。

    我将就与 .condition.rule 设置相关的问题提交 TT

    Siri

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

    我认为这个问题不止是 condition.rule 这一行的内容。 在 TX 和 RX 命令中将这些线路更改为0x01会有所帮助、这样、如果我将轮询间隔设置为2秒、传感器节点将接收从收集器发送的所有数据、至少接收到我测试过的数十个数据包。 当 condition.rule 行设置为0x00时、传感器节点只能接收收集器发送的数据句柄。 但一旦我将轮询间隔改回1分钟、传感器节点几乎不会从收集器接收到任何数据。 状态代码为0xF0的 DataCnfCb 始终存在过早。

    另一个最可能的因素与缓存数据的清除时间有关。 自定义 PHY 开启后、似乎会使用硬编码的5秒。 当自定义 PHY 关闭时、到期时间主要是 CONFIG_POLLING_INTERVAL 的函数。  

    希望这部分信息可以帮助您最终在15.4堆栈中正式支持 WB-DSSS。

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

    您是否测试了7.41 SDK 的默认收集器和传感器示例、除了启用自定义 PHY 并将其设置为 WB-DSSS 之外没有其他更改?

    这不起作用吗?

    我问这个问题的原因是您谈到了如何测试一些"使用最新 SDK v7.41和定制 PHY、基于15.4收集器/传感器项目的旧无线电"、因此我不能完全了解您的设置。

    请为我们提供使用我们的 LP 重新创建问题以及从最新 SDK 运行传感器和收集器示例的步骤。

    Siri

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

    我试图稍微修改15.4收集器/传感器示例项目、但没找到构建最小测试用例的简单方法。 从较高层次看、我认为需要以下几点:

    1) 1)启用自定义 PHY

    2)更改应用程序设置:报告间隔为90000,轮询间隔为60000 ,跟踪延迟为150000

    默认轮询间隔为2秒。 在如此短的间隔且 condition.rule 设置为0x01的情况下、收集器似乎能够很好地向传感器发送数据、因此长轮询间隔可能是关键。

    3) 3)启用功率测试模式、收集器上显示数据和 Ack 曲线、仅在传感器上进行轮询

    可能不需要此步骤、但这是我们固件中执行的步骤。

    4) 4)找到一种方法、将数据从收集器定期发送到传感器、并输出 dataCnfCb 函数通过 UART 返回的状态代码。

    这是我不熟悉的步骤。 一旦启用电源测试模式、CUI 就会一起关闭。 我们用定制的 AT 命令系统替代了 CUI、因此我们仍然可以跟踪是否已成功向传感器/收集器发送数据。

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

    我刚刚注意到收集器示例项目中有一个发送切换功能、一旦以60秒的轮询间隔启用了自定义 PHY、这似乎不起作用。 那么、以下是最小测试用例:

    1) 1)导出收集器/传感器示例。

    2) 2)启用自定义 PHY

    3)将轮询间隔从默认值2秒更改为60秒。 我在90秒时测试了报告间隔、但这可能不是必需的。 此外、任何超过6秒的轮询间隔都可能重现此问题。

    4) 4)编译并加载到 CC1352P1-launchpad 上。

    5)建立并加入网络。

    6) 6)在收集器上触发"Send Toggle"并观察传感器节点上的红色 LED 是否开启/关闭。

    轮询间隔默认保持在2秒时、大多数情况下、在收集器上按 Send Toggle 后、传感器节点上的红色 LED 将在几秒内切换。 但有时发送切换和红色切换之间的延迟超过2秒轮询间隔、表示初始发送失败、然后重试。 轮询间隔更改为60秒时、传感器节点上的红色 LED 大部分时间不会切换。 我按下发送切换15 次、中间1 ~ 2分钟。 传感器节点上的红色 LED 已切换4次。 我在收集器 CUI 上观察到两次设备无响应。 同时、传感器节点向收集器发送数据时似乎没有问题。  

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

    您好、致勇、

    感谢您发布其他信息。

    我们尚未针对自定义 PHY 选项运行完整的 TI 15.4-Stack 测试套件、这意味着该 PHY 已从无线电角度和基本功能方面进行测试、但并非所有堆栈测试都已完成。

    您是否可以尝试查看收集器统计数据变量(Collector_statistics) 和发送消息 API 调用的返回状态、以查看收集器是否出现任何错误?

    谢谢、

    Marie H.

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

    尊敬的 Marie:

    感谢您的答复。 如何 在未修改的收集器示例中可视化收集器统计数据变量? 我简短地介绍了 CUI、甚至没有看到任何方式、包括:

     

    // collector.opt
    -DDISPLAY_PER_STATS
    -DFEATURE_SYSTEM_STATS

    在自定义的 AT 命令中,我们使用了这个统计变量并跟踪 dataCnfCb ()返回的状态代码。 当轮询间隔设置为60秒时、返回的状态代码主要为0xF0、如上一帖子中所述。

    在侧边注释中、我注意到当启用了自定义 PHY 时、在生成的 ti_radio_config.h 中常量的命名有点奇怪:

    extern const rfc_CMD_PROP_TX_ADV_t RF_cmdPropRxAdv_custom;
    extern const rfc_CMD_PROP_RX_ADV_t RF_cmdPropTxAdv_custom;

    但是、将它们更改为更一致的名称似乎没有任何好处。 我想这只是化妆品。

    此致!

    ZL

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

    您好、致勇、

    最简单的方法可能是具有活动的调试会话并 在表达式视图中添加 Collector_statistics (这是一个全局变量)。  

    我的理解是、 ti_radio_config.h 中生成的无线电命令不会直接由 TI 15.4-Stack 使用。 该堆栈在 Mac 文件中生成自己的射频命令。 (RF_cmdPropRadioDivSetup、 RF_cmdFsRx、 RF_cmdFsTx 等)

    谢谢、

    Marie H.

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

    以下是我从15.4收集器/传感器示例中得到的结果、其中启用了自定义 Phy、轮询间隔= 60000、报告间隔= 90000、跟踪延迟= 150000。

    按下发送后、在收集器上切换3次、中间大于3分钟。 第2次发送切换确实到达传感器、但重试3次后第一次和最后一次失败。

    判断 dataCnfCb ()在我们修改的代码中返回状态代码0xF0的时间,我强烈怀疑的是,改变的轮询间隔没有传递到射频内核,始终使用硬编码的默认值2000ms。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    堆栈在 Mac 文件中生成自己的射频命令。 (RF_cmdPropRadioDivSetup、 RF_cmdFsRx、 RF_cmdFsTx 等)[/QUOT]

    我很确定所使用的是 ti_radio_config.c 中生成的命令。 如果我只是将这些常量的名称更改为更符合标准的常量、如:

    extern const rfc_CMD_PROP_TX_ADV_t RF_cmdPropTxAdv_custom;
    extern const rfc_CMD_PROP_RX_ADV_t RF_cmdPropRxAdv_custom;

    在 ti_radio_config.h 和 ti_radio_config.c 中、收集器不会运行。 因此、这些命令必须以某种方式被闭源 MAC 文件利用。

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

    您好、致勇、

    感谢您发布重现问题和分析的说明。 我将生成错误通知单、然后发送给软件开发人员。 请注意、反馈可能需要大约一周时间。

    关于射频命令、我认为某些值是从 SysConfig 命令中提取的、但我认为 MAC 命令是实际发送到无线电的命令。 因此、如果您要查看运行时的 RF 命令、我认为您需要查看 MAC 命令。

    谢谢、

    Marie H.

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

    收集器在轮询间隔长达50000ms 的情况下向传感器发送数据似乎没有问题、但一旦轮询间隔设置为55,000,59000或600000、收集器开始产生大量事务超时状态代码。 似乎有某种神奇的数字在50000和55000之间。

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

    您好、致勇、

    以下是来自软件设计人员的反馈:

    我认为轮询间隔不能设置为超过10000ms。 SysConfig 指出:

     
    范围:轮询间隔必须在    传感器项目中定义的 MIN_POLLING_INTERVAL 和 MAX_POLLING_INTERVAL 的范围内。 默认情况下、该范围是1000ms 到10,000ms。

    您可以尝试使用较低的轮询间隔吗?

    谢谢、

    Marie H.

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

    尊敬的 Marie:

    我尝试了2,000,50050001001000020020000,30000、 40,000,50050000,55055000,59059000,60000ms 作为轮询间隔。 仅当轮询间隔大于50000ms 且启用了自定义 PHY 时、收集器才开始向传感器发送数据时出现问题。 当轮询间隔设置为60000ms 并且在 Fh 模式下或使用非自定义 PHY 的非信标模式时、收集器在向传感器发送数据时也没有问题。  

    如果传感器从收集器接收到的 PollingInterval 超过 MAX_POLLING_INTERVAL、则传感器将回退到其自己的 CONFIG_POLLING_INTERVAL。  

    if((pollingInterval < MIN_POLLING_INTERVAL)
       || (pollingInterval > MAX_POLLING_INTERVAL))
    {
        stat = Smsgs_statusValues_partialSuccess;
    }
    else
    {
        configSettings.pollingInterval = pollingInterval;
        Jdllc_setPollRate(configSettings.pollingInterval);
    }
    configRsp.pollingInterval = configSettings.pollingInterval;

    这不应导致收集器过早超时的传感器缓存消息。

    我仍然认为、 在计算 indird_persistent_time 或如何将其传递到 MAC 层代码中、还会出现某种溢出。

    /* MAC Indirevt Persistent Timeout */
    #define INDIRECT_PERSISTENT_TIME (MAX((5 * 1000 * CONFIG_POLLING_INTERVAL / 2), MIN_PERSISTENCE_TIME_USEC)/ \
                                      (BASE_SUPER_FRAME_DURATION * \
                                       SYMBOL_DURATION_CUSTOM))

     

    此致!

    ZL

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

    您好、致勇、

    感谢您的测试。

    我会继续讲下去、但我不确定我们可以在这里提供多少帮助。

    谢谢、

    Marie H.

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

    我现在很高兴。 只是想帮助你的官方支持 WB-DSSS。

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

    您好、致勇、

    非常感谢!

    我们找到了您问题的根本原因;  

    ApiMac_attribute_transactionPersistenceTime PIB 值为 uint16_t 值、因此上限为65535。 如果 WB-DSSS 的轮询间隔和符号持续时间增加到60000、则在调用以下项时将溢出此值:
      ApiMac_mlmeSetReqUint16 (ApiMac_attribute_transactionPersistenceTime、
                  indird_persistent_time);

    遗憾的是、将这个值从 uint16_t 更改为 uint32_t 需要大量工作、因此我们不打算进行此更改。 但会添加一个 CAP 和一个 SysConfig 警告、以避免这种情况在将来显示为神秘问题。

    collector.h:

    #define INDIRECT_PERSISTENT_TIME (MIN((MAX((5 * 1000 * CONFIG_POLLING_INTERVAL / 2), MIN_PERSISTENCE_TIME_USEC)/ \
                                      (BASE_SUPER_FRAME_DURATION * \
                                       SYMBOL_DURATION_CUSTOM)), 65535))

    谢谢、

    Marie H.