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:如何在 15.4 网络 FH 低延迟广播模式下将数据从收集器发送到特定的传感器

Guru**** 2492385 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1553682/cc1352p-how-to-send-data-from-collector-to-a-specific-sensor-in-a-15-4-network-fh-low-latency-broadcast-mode

器件型号:CC1352P


工具/软件:

您好、

我尝试将代码从 15.4 FH 模式移植到 FH 低延时广播 (FH-LLB) 模式。 到目前为止、我能够加入网络、将数据从传感器发送到收集器以便正常工作、但在尝试将数据从收集器发送到特定传感器节点时遇到了问题。

根据 此处提供的文档、收集器通过广播将数据发送到传感器、每个传感器节点都会接收消息副本、并在没有匹配地址的情况下丢弃消息。 编程 WISE、我们如何做到这一点?

我假设我们可以在`collector.c`中使用与在其他网络模式中相同的函数

// collector.c
static bool sendMsg(Smsgs_cmdIds_t type, uint16_t dstShortAddr, bool rxOnIdle,
                    uint16_t len,
                    uint8_t *pData,
                    uint8_t *frameIdPtr);

到目前为止、通过该函数发送的任何消息都不会被传感器节点接收。  

还有一个广播消息的功能:

static void sendBroadcastMsg(Smsgs_cmdIds_t type, uint16_t len,
                    uint8_t *pData)

这似乎是示例收集器工程在 FH-LLB 模式下将数据发送到传感器节点所使用的函数。 目标地址会手动汇编到有效载荷中、然后传感器节点会执行手动检查目标地址是否与其自身地址匹配。  

    /*
     Collector generate a broadcast command message for FH mode
     */
    if(Collector_events & COLLECTOR_BROADCAST_TIMEOUT_EVT)
    {
        /* Clear the event */
        Util_clearEvent(&Collector_events, COLLECTOR_BROADCAST_TIMEOUT_EVT);
        if(FH_BROADCAST_INTERVAL > 0 && (!CERTIFICATION_TEST_MODE))
        {
#ifdef FH_LOW_LATENCY_BROADCAST
            if(broadcastQueue < 1)
            {
                uint8_t buffer[SMSGS_BROADCAST_CMD_LENGTH];
                uint8_t *pBuf = buffer;

                /* Build the message */
                if(sendCamCmd)
                {
                    *pBuf++ = (uint8_t)Smgs_cmdIds_broadcastCtrlMsg;
                    *pBuf++ = Util_loUint16(destDevAddr);
                    *pBuf++ = Util_hiUint16(destDevAddr);
                    *pBuf = 0x1;
                    sendCamCmd -= 1;
                }
                else
                {
                    *pBuf++ = (uint8_t)Smgs_cmdIds_broadcastCtrlMsg;
                    *pBuf++ = 0xF;
                    *pBuf++ = 0xF;
                    *pBuf = 0xF;
                }
                broadcastQueue += 1;
                sendBroadcastMsg(Smgs_cmdIds_broadcastCtrlMsg, SMSGS_BROADCAST_CMD_LENGTH,
                                 buffer);
            }
            /* set clock for next broadcast command */
            Csf_setBroadcastClock(FH_BROADCAST_INTERVAL / 2);
#else  // FH_LOW_LATENCY_BROADCAST
            generateBroadcastCmd();
            /* set clock for next broadcast command */
            Csf_setBroadcastClock(FH_BROADCAST_INTERVAL);
#endif // FH_LOW_LATENCY_BROADCAST
        }
    }

我的问题是、地址检查是否可以由 MAC 层完成? 还是有不同的方法来实现?  

谢谢、

ZL

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

    嗨、志勇:

    从收集器到传感器的通信仅使用广播传输来实现。

    收集器定期发送广播消息(广播间隔)。 负责的事件是 Collector BROADCAST_TIMEOUT_EVT 和您在上面共享的事件处理。

    默认消息格式如下所示、您可以在 smgs.h 中对其进行更改(请记住在收集器和传感器上对其进行更改)。

    所有传感器都接收所有广播信息、并将其用作检测信号、以检查它们是否仍连接到收集器。

    所有传感器在收到广播消息后检查目标设备地址是否与其自己的设备地址相同。 如果是、他们将处理命令。

    传感器处理 以下 sensor.c -> processBroadcastCtrlMsg () 中的广播消息。

    要现在寻址特定传感器、您需要将其设备地址附加到广播消息中。 当传感器接收到命令事件时、这将触发命令事件。

    是在收集器上实现这一过程的一个示例。 当按下收集器的按钮 1 时、它将附加网络中第一个传感器的器件地址、您将在收到命令时看到传感器的绿色 LED 切换。 通过收集器的按钮 2、您可以逐个寻址网络中的所有传感器、并观察相同的 LED 切换。 (签出 collector.c -> collector_broadcast_CAMCMD_EVT)  



    每个命令都由传感器确认、收集器绿色 LED 在接收到确认时切换。

    此致、
    Theo

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

    尊敬的朗格先生:

    感谢您的快速回复、并确认从收集器向传感器发送数据的唯一方法是通过广播。

    两个后续问题:

    1) 如果我们要发送自定义消息,在 smsgs.h 中有什么变化? 我假设至少有两个代码块、即宽 cmd length 和 typedef。

    /*! Broadcast Command message length (over-the-air-length) */
    #ifdef FH_LOW_LATENCY_BROADCAST
    #define SMSGS_BROADCAST_CMD_LENGTH  4   // Change this to whatever fits?
    #else  // FH_LOW_LATENCY_BROADCAST
    #define SMSGS_BROADCAST_CMD_LENGTH  3
    #endif // FH_LOW_LATENCY_BROADCAST
    
     Broadcast Cmd Request message: sent from controller to the sensor.
     */
    typedef struct _Smsgs_broadcastcmdmsg_t
    {
        /*! Command ID - 1 byte */
        Smsgs_cmdIds_t cmdId;
    #ifdef FH_LOW_LATENCY_BROADCAST
        uint16_t destdevAddr; // destination device address
        uint8_t camCmd;       // camera command for the destination device
    #else  // FH_LOW_LATENCY_BROADCAST
        uint16_t broadcastMsgId;
    #endif
    }Smsgs_broadcastcmdmsg_t;

    2) 最大广播间隔:SYSCFG 中建议的范围是  0 到 uint32_t MAX。 广播频率是否有任何实际限制? RX 每 1 秒~ 20ms 仍会产生约 100 μ A 200uA 的功耗。 但是、如果我们可以将广播间隔推至 5 或 10 秒、那么这部分功耗将是可以接受的大幅增加。

    此致、

    ZL

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

    嗨、志勇:

    1.当前 camCmd = 0x01 用于触发传感器端的摄像头命令。 您可以重复使用它、例如使用不同的值 0x02 以触发您的命令。

    Sensor.c

     

                    /* process camera commands */
                    if(camCmd == 0x1) //--> This is the camCmd
                    {
                        /* send the acknowledgment message */
                        uint8_t buffer[SMSGS_TOGGLE_LED_RESPONSE_MSG_LEN];
                        uint8_t *pBuf = buffer;
    
                        *pBuf = (uint8_t)Smsgs_cmdIds_toggleLedRsp;
    
                        Sensor_sendMsg(Smsgs_cmdIds_toggleLedRsp,
                                        &pDataInd->srcAddr, true,
                                        SMSGS_TOGGLE_LED_RESPONSE_MSG_LEN,
                                        buffer);
    
                        Util_setEvent(&Sensor_events, SENSOR_BROADCAST_CAMCMD_EVT);
                    }
                }

    collector.c

                    /* Build the message */
                    if(sendCamCmd)
                    {
                        *pBuf++ = (uint8_t)Smgs_cmdIds_broadcastCtrlMsg;
                        *pBuf++ = Util_loUint16(destDevAddr);
                        *pBuf++ = Util_hiUint16(destDevAddr);
                        *pBuf = 0x1; // -> this is the camCmd
                        sendCamCmd -= 1;
                    }

    如果除了命令之外还需要一个额外的有效载荷、则应该增加 (smsgs.h) SMSGS_BROADCAST_CMD_LENGTH 并 向 结构 Smsgs_broadcastcmdmsg_t 添加一个额外的成员 然后从上一个代码片段中填充*pBuf。

    2. 5 到 10 秒的宽间隔应正常。 请记住、您还应  按照 用户手册中的说明、将 low_delaying_broadcasting_configuration_timeout (sensor.c) 更改为广播间隔的两倍。 我来看看实际限值是多少。

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

    尊敬的 Aguiar 先生:

    感谢您的答复。

    关于广播间隔、似乎有一个介于 30 和 60 秒之间的限制。 30 年代似乎很正常、但 60 年代似乎不正常。 30 多岁的孩子对我来说应该足够好。

    我还在不同的线程中询问了如何设置广播间隔的问题。 请查看您是否也能提供帮助。

    此致、

    ZL

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

    您好、  

    我会看一下。 作为参考、此处是链接线程

    CC1312R:启用广播的 15.4 Stack FH 低延迟广播模式和 FH 模式之间有哪些优缺点? -低于 1GHz 论坛 — 低于 1GHz - TI E2E 支持论坛