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.

[参考译文] CC2340R5:CC2340R5:一次广播多个字。

Guru**** 2555630 points
Other Parts Discussed in Thread: CC2340R5, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1335083/cc2340r5-cc2340r5-multiple-advertising-at-a-time

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

你好。  

我是 Rushikesh。  

我使用的是 CC2340R5和 SDK 7.20。  

例如、我要在突发模式下广播数据、我要在每次广播之间广播5次、延迟小于10ms、然后进入待机状态10秒。

并重复该周期。

请指导我如何实现此目标。

谢谢。此致、

Rushikesh。

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

    尊敬的 Rushikesh:

    根据蓝牙规范、最小广播间隔为20ms。 您可以通过同时启用多个广播集来解决此限制。

    为了启用第二个(或更多)广播集、请在 SysConfig 中创建一个新的广播集(这将生成良性警告)、并确保对其进行初始化(BLEAppUtil_initAdvSet)并启用它(BLEAppUtil_advStart / BLEAppUtil_advStop)、正如在 app_peripheral.c 文件中为现有广播完成的那样。

    可以使用传递给 BLEAppUtil_advStart 的结构 Util_Adv 中的"durationOrMaxEvents "字段设置有限的广告。

    我希望这将有所帮助、

    此致、

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

    您好、Clement、  

    我已经这么做了、可以在进入待机状态30秒之前广播7次。  

    但是、我目前正在使用 GPIO 中断进行广播。 即、我仅在发生 GPIO 中断时广播。  

    为此、当中断生成时、我的当前代码可以很好地用于单次广播。  

    但是、我希望在使用中断代码进入待机状态之前逐个通告7个设置。  

    请建议如何实现此目标。 我已经尝试 在 syscfg 中添加广播集,并使用 broadcaster Handle_1 和 broadcaster StartAdvSet1 来初始化和启动它们;如下所示:但它不起作用,因为我的代码进入了 iCall_abort (void)函数。

        /*For SET 2*/
        status = BLEAppUtil_initAdvSet(&broadcasterAdvHandle_2, &broadcasterInitAdvSet2);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    
        status = BLEAppUtil_advStart(broadcasterAdvHandle_2, &broadcasterStartAdvSet2);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }

    以下是我用于该中断的代码。

    1)中断配置:

    void mainThread(void)
    {
        /* Configure GPIO pin */
        GPIO_setConfig(CONFIG_GPIO_EXT_WAKEUP, GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_FALLING);  //Since, low & high value interrupts are not available for Low Power F3 devices
    
    //    GPIO_setConfig(CONFIG_GPIO_EXT_WAKEUP, GPIO_CFG_IN_INT_FALLING);
    
        /* Install GPIO Interrupt callback */
        GPIO_setCallback(CONFIG_GPIO_EXT_WAKEUP, gpioButtonFxn0);
    
        /* Enable interrupts */
        GPIO_enableInt(CONFIG_GPIO_EXT_WAKEUP);
    
    }

    2)回叫:

    /*Interrupt Callback*/
    void gpioButtonFxn0(uint8_t index)
    {
        BLEAppUtil_invokeFunctionNoData(enableAdvertising);
    }

    3)启用广播:

    void enableAdvertising()
    {
        bStatus_t status;
    
        /*Set 1*/
        BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1);
        /*Don't free anything since we're going to use the same buffer to re-load*/
        status = GapAdv_prepareLoadByBuffer(advData1, FALSE);
    
        if (status == SUCCESS)   /*   Only update the data when return is successful*/
        {
    
            SensorMeasure();   /*Read sensor value from i2c*/
    
            uint8_t ADV_DATA2_LEN = sizeof(advData1); /* Reload buffer to handle*/
    
            GapAdv_loadByBuffer(ADV_DATA2_LEN, advData1);
    
        }
    }

    4)在 app_broadaster.c 中禁用 void Broadcaster_Adv 中的广播(Uint32事件,BLEAppUtil_msgHdr_t *pMsgData)

        switch(event)
        {
            case BLEAPPUTIL_ADV_START_AFTER_ENABLE:
            {
                MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv status: Started - handle: "
                                  MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
                                  advData->pBuf->advHandle);
                break;
            }
    
            case BLEAPPUTIL_ADV_END_AFTER_DISABLE:
            {
                MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv status: Ended - handle: "
                                  MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
                                  advData->pBuf->advHandle);
                break;
            }
    
            case BLEAPPUTIL_ADV_END:
            {
                MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv just ssent: - handle: "
                                  MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
                                  ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle);
    
                // Disable advertisement
                BLEAppUtil_advStop(broadcasterAdvHandle_1);
                break;
            }
    5)

    BLEAppUtil_EventHandler_t broadcasterAdvHandler =
    {
        .handlerType    = BLEAPPUTIL_GAP_ADV_TYPE,
        .pEventHandler  = Broadcaster_AdvEventHandler,
        .eventMask      = BLEAPPUTIL_ADV_START_AFTER_ENABLE |
                          BLEAPPUTIL_ADV_END_AFTER_DISABLE | BLEAPPUTIL_ADV_END
    
    };

    如果有任何问题、请告诉我。  

    此致、

    Rushikesh。

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

    尊敬的 Rushikesh:

    请参阅以下指南以触发时钟中断的执行- https://dev.ti.com/tirex/content/simplelink_academy_for_cc23xx_7_40_00_00/_build_simplelink_academy_for_cc23xx_7_40_00_00/source/cc2340rx_04_connections.html#task-3-create-a-oneshot-or-periodic-clock-using-clockp-module

    我不确定您为什么需要7个广播集、但您遇到的问题似乎是由广播集的配置引起的。 确保您已将第二个广播集准确配置为第一个广播集、而不会丢失扫描响应或任何其他元素。 此外、请确保传播 asterInitAdvSet1/broadcasterInitAdvSet2和广播 asterStartAdvSet1/broadcasterStartAdvSet2的结构正确。

    希望这将有所帮助,

    此致、

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

    您好、Clement、  

    我来解释一下、

    我有一个传感器连接到 BLE CC2340R5、该传感器定期发送中断(10秒)以将 BLE 从待机状态唤醒。

    此外、通过 I2C 将数据"x"发送到 BLE。  

    现在在 BLE 端、我要通告此数据"x" 7次、然后将 BLE 置于待机状态、直到下一个中断发生(10秒之后)。

    请查看下面的电流波形、以便您更好地了解我希望广播是如何发生的。

      

    这在中断代码中不起作用。

    因此,我想了解更多关于广告的这种方式。  

    希望您理解了。

    此致、

    Rushikesh。

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

    尊敬的 Rushikesh:

    -考虑使用参数 advSetStartParamsSet_1.enableOptions 和 advSetStartParamsSet_1.durationOrMaxEvents 来控制在禁用广播集之前传输广播集的次数

    -查看您的函数 enableAdvertising 的内容。 除其他外:调用 BLEAppUtil_advStart 后不应修改广播数据。 我建议编写 enableAdvertising 函数的方式是:

    1. 读取传感器数据
    2. 更新 advData1的内容
    3. 调用 BLEAppUtil_advStart

    GapAdv_prepareLoadByBuffer API 不应与 BLEAppUtil API 混合使用,因为二者会影响相同的数据并可能产生冲突。

    我希望这将有所帮助、

    此致、

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

    您好、Clement、  

    我将遵循您在此处提到的相同代码流程。  

    它无法正常工作。  

    在调用 GapAdv_prepareLoadByBuffer (advData1、false)后;函数它会进入  

     (iCall_directAPI (ICALL_SERVICE_CLASS_BLE、(uint32_t) IDX_GapAdv_prepareLoadByBuffer、##_VA_args_)

    和  

    进入  iCall_abort ();函数的 while 循环。

    是否因为我调用 GapAdv_prepareLoadByBuffer (advData1、false)而发生超时错误; 以及 GapAdv_loadByBuffer (ADV_DATA2_LEN、advData1); 多次?

    使用这些 API 以便多次广播相同数据的确切条件或方法是什么?

    此致、

    Rushikesh。

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

    您好!

    在下面的建议中、

    • 读取传感器数据
    • 更新 advData1的内容
    • 调用 BLEAppUtil_advStart
    [/报价]

    我建议直接修改 advData1的内容。 不应使用 GapAdv_prepareLoadByBuffer / GapAdv_loadByBuffer。

    此致、

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

    您好、Clement、  

    这适用于单个广播。  

    但是、我想广播7次、但没有按预期运行。  

    我将调用 BLEAppUtil_advStart (broadcasterAdvHandle_1、&broadcasterStartAdvSet1);函数

    在中断回调函数中执行7次。 但它只广播一次。  

    此外、我还尝试 在同一回调中调用在 syscfg 中配置的4个不同的设置。  

    void enableAdvertising()
    {
        SensorMeasure();   /*Read sensor value from i2c*/
    
        BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1);
    
        BLEAppUtil_advStart(broadcasterAdvHandle_2, &broadcasterStartAdvSet2);
    
        BLEAppUtil_advStart(broadcasterAdvHandle_3, &broadcasterStartAdvSet3);
    
        BLEAppUtil_advStart(broadcasterAdvHandle_4, &broadcasterStartAdvSet4);
    }

    但这也不起作用。  

    此致、

    Rushikesh。

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

    您好!

    应在任务上下文中调用 BLEAppUtil_advStart。

    如果我可以,我仍然不清楚为什么你要使用7个广播集(而不是1个广播集重复多次)。

    此外、您能解释一下如何验证广告集的数量是否有效?

    此致、

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

    您好、Clement、

    这不是我想使用7个广播集,我只是想广播 相同的数据7次.  

    我尝试了两种解决方案(使用7个广播集和1个广播集重复多次)、但它不起作用。

    此外、我正在通过监听器工具和器件电流测量工具对其进行验证、我在其中收到广播的电流尖峰。  

    请查看上面随附的波形图像是否相同。

    此致、  

    Rushikesh。

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

    您好!

    它不是我想使用7个广告集我只是想广告 相同的数据7次。  [/报价]

    然后、让我们重点讨论一下只有一个广播集。

    确保满足以下条件:

    -在打开广告之前设置数据

    -状态成功由 BLEAppUtil_advStart 报告

    - BLEAppUtil_advStart 在启用了 iCall 的任务上下文中进行调用

    -如果广播不起作用、请检查程序是否崩溃并收集调试信息

    请检查上面所附波形的图像是否相同。

    下面引用的波形是否是您所指的波形? 您现在得到的结果是什么?

      

    此致、

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

    您好、Clement、  

    在开启广播之前设置数据。

    如果我通告单组、我会获得状态成功。 (当多个广播设置时、状态未成功。)

    3.BLEAppUtil_advStart 在启用 iCall 的任务上下文中进行调用。

    我不明白。 您能举个例子吗?

    4.对于单集,广告工作正常。 但对于多个集合,它会进入 Call_Abort ();  

    是的、这些波形是我应该在中断代码内广播时得到的波形。  

    现在、我将尝试多次生成中断、而不是多次调用单个集。 但这会消耗更多的功耗、也会增加 BLE 和传感器的运行时间。  

    此致、

    Rushikesh。

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

    您好!

    3.BLEAppUtil_advStart 在启用 iCall 的任务上下文中进行调用。

    我不明白。 您能举个例子吗?

    [/报价]

    此元素的解释如下: https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/7.40.00.64/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/the-application-cc23xx.html?highlight=bleapputil_stackregister#processing-stack-events-from-the-icall-message-queue

    但这似乎是正确的、因为单个广播正在工作

    4.对于单集,广告效果不错。 但对于多个集合,它会进入 Call_Abort (); 

    正如您之前提到的、您似乎只需要一个广告集。 所以我建议暂时不要把重点放在这一点上。

    如果需要更多支持、请告诉我。

    此致、

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

    您好、Clement、  

    我想我应该尝试实施不同的方法、以便能够实现给定的应用。  

    感谢您的支持。  

    如果需要您的支持、会通知您。  

    此致、

    Rushikesh。