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:无法设置广播设备的广播间隔。

Guru**** 2746095 points

Other Parts Discussed in Thread: SYSCONFIG, ENERGYTRACE

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1609666/cc2340r5-unable-to-set-the-advertising-interval-for-the-broadcaster

器件型号: CC2340R5
Thread 中讨论的其他器件: SysConfigENERGYTRACE

尊敬的专家:
我有一个同时使用中央设备和广播设备角色的项目。 我要将广播间隔设置为 3000ms 并使用 100 字节扩展数据包。
我尝试将间隔设置为 3000ms、但它无法按预期工作。 能否就此提供一些指导?

CCS 版本:20.4.0.13__1.10.0

image.png

请在下面找到我的代码和 SysConfig 配置。

*****************************************************************************/

#if defined( HOST_CONFIG ) && ( HOST_CONFIG & ( BROADCASTER_CFG ) )

//*****************************************************************************
//! Includes
//*****************************************************************************
#include "ti_ble_config.h"
#include "ti/ble/app_util/framework/bleapputil_api.h"
#include "ti/ble/app_util/menu/menu_module.h"
#include <app_main.h>

//*****************************************************************************
//! Prototypes
//*****************************************************************************
void Broadcaster_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData);

//*****************************************************************************
//! Globals
//*****************************************************************************
static uint8_t test_ccnt = 0;

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

//! Store handle needed for each advertise set
uint8 broadcasterAdvHandle_1;

const BLEAppUtil_AdvInit_t broadcasterInitAdvSet1 =
{
    /* Advertise data and length */
    .advDataLen        = 0,//sizeof(advData1),
    .advData           = NULL,//advData1,

    /* Scan respond data and length */
    // .scanRespDataLen   = 0,
    // .scanRespData      = NULL,
    .scanRespDataLen   = sizeof(scanResData1),//0,
    .scanRespData      = scanResData1,//NULL,


    .advParam        = &advParams1
};

const BLEAppUtil_AdvStart_t broadcasterStartAdvSet1 =
{
  /* Use the maximum possible value. This is the spec-defined maximum for */
  /* directed advertising and infinite advertising for all other types */
  .enableOptions         = GAP_ADV_ENABLE_OPTIONS_USE_MAX,
  .durationOrMaxEvents   = 0
};

//*****************************************************************************
//! Functions
//*****************************************************************************

/*********************************************************************
 * @fn      Broadcaster_AdvEventHandler
 *
 * @brief   The purpose of this function is to handle advertise events
 *          that rise from the GAP and were registered in
 *          @ref BLEAppUtil_RegisterGAPEvent
 *
 * @param   event - message event.
 * @param   pMsgData - pointer to message data.
 *
 * @return  none
 */
void Broadcaster_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
{
    switch(event)
    {
        case BLEAPPUTIL_ADV_START_AFTER_ENABLE:
        {
            MenuModule_printf(APP_MENU_ADV_EVENT+5, 0, "Adv status: Started - handle: "
                              MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
                              ((BLEAppUtil_AdvEventData_t *)pMsgData)->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,
                              ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle);
            break;
        }
        case BLEAPPUTIL_ADV_END:
                            MenuModule_printf(APP_MENU_ADV_EVENT+5, 0, "Adv EEEEEEEs: Started - handle: "
                                  MENU_MODULE_COLOR_YELLOW "%d Count = %d" MENU_MODULE_COLOR_RESET,
                                  ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle, test_ccnt++);

                /** New Code **/
            BLEAppUtil_AdvEventData_t * pkt = (BLEAppUtil_AdvEventData_t *)pMsgData;

            if (pkt->pBuf->advHandle == broadcasterAdvHandle_1) 
            {
                bStatus_t status = FAILURE;

                status = GapAdv_prepareLoadByHandle(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE); 

                if (status != SUCCESS)
                    for(;;); // Loop

                uint8_t ADV_DATA2_LEN = (111 - 7);
                //uint8_t *advData2 = ICall_malloc(ADV_DATA2_LEN);
                uint8_t advData2[104] = {0};
                
                advData2[0] = (ADV_DATA2_LEN - 1);
                advData2[1] = GAP_ADTYPE_MANUFACTURER_SPECIFIC;

                //Company Identifier
                advData2[2] = 0x0d;
                advData2[3] = 0x00;

                for(uint8_t i = 0; i<100; i++)
                     advData2[4 + i] = (i + 1);



                // broadcasterAdvHandler.eventMask      = BLEAPPUTIL_ADV_START_AFTER_ENABLE |
                //                                        BLEAPPUTIL_ADV_END | // <--- new dynamic advertising.  
                //                                        BLEAPPUTIL_ADV_END_AFTER_DISABLE;


                status = GapAdv_loadByHandle(broadcasterAdvHandle_1, // broadcasterAdvHandle_1 ,broadcasterAdvHandler.pEventHandler
                                            GAP_ADV_DATA_TYPE_SCAN_RSP, //GAP_ADV_DATA_TYPE_SCAN_RSP , GAP_ADV_DATA_TYPE_ADV ,BLEAPPUTIL_GAP_ADV_TYPE,
                                            ADV_DATA2_LEN,
                                            advData2);

                 if (status != SUCCESS)
                     for(;;);
                /** End New Code **/

             }
                    break;
        default:
        {
            break;
        }
    }
}

image.png

image.png

image.png

image.png

image.png

 

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

    您好、

    感谢您联系我们。 您共享的设置外观正确。 您能分享您看到的行为吗? 您收到任何错误吗? 代码是否挂起在某个位置?

    此致、

    1 月

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

    您好、Jan、如果广播设备设置为每 3 秒广播 BLEAPPUTIL_ADV_END 一次、那么不应该每 3 秒触发一次? 我的 UART 日志显示其触发速度比这快得多、这很令人困惑。 我对此事件的理解是否正确?





    此致、

    Anthony

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

    您好、

    感谢您联系我们。 您显示的 EnergyTrace 测量显示的广播间隔快得多、即 3 秒。 您使用的广播间隔似乎为 20ms。 一个广播事件(使用全部 3 个信道时)快速连续显示为 3 个峰值(如果没有发送扫描响应)。 您能否分享如何设置广播间隔?

    此致、

    1 月

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

    您好、Jan、

    我仅在 syscfg 的广播参数中将主 Util_Adv 间隔最小值 (ms) 和主 PHY 间隔最大值 (ms) 调整为 3000、并对 const BLEApp PHY/Init_t 广播 InitAdvSet1 进行了一些细微更正。 您可以引用我原始帖子中的代码;或许可以尝试将我的代码加载到 app_broadcaster.c 中来查看其是否有效。

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


    const BLEAppUtil_AdvInit_t broadcasterInitAdvSet1 =
    {
        /* Advertise data and length */
        .advDataLen        = 0,//sizeof(advData1),
        .advData           = NULL,//advData1,
    
        /* Scan respond data and length */
        // .scanRespDataLen   = 0,
        // .scanRespData      = NULL,
        .scanRespDataLen   = sizeof(scanResData1),//0,
        .scanRespData      = scanResData1,//NULL,
    
    
        .advParam        = &advParams1
    };


            case BLEAPPUTIL_ADV_END:
                                MenuModule_printf(APP_MENU_ADV_EVENT+5, 0, "Adv EEEEEEEs: Started - handle: "
                                      MENU_MODULE_COLOR_YELLOW "%d Count = %d" MENU_MODULE_COLOR_RESET,
                                      ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle, test_ccnt++);
    
                    /** New Code **/
                BLEAppUtil_AdvEventData_t * pkt = (BLEAppUtil_AdvEventData_t *)pMsgData;
    
                if (pkt->pBuf->advHandle == broadcasterAdvHandle_1) 
                {
                    bStatus_t status = FAILURE;
    
                    status = GapAdv_prepareLoadByHandle(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE); 
    
                    if (status != SUCCESS)
                        for(;;); // Loop
    
                    uint8_t ADV_DATA2_LEN = (111 - 7);
                    //uint8_t *advData2 = ICall_malloc(ADV_DATA2_LEN);
                    uint8_t advData2[104] = {0};
                    
                    advData2[0] = (ADV_DATA2_LEN - 1);
                    advData2[1] = GAP_ADTYPE_MANUFACTURER_SPECIFIC;
    
                    //Company Identifier
                    advData2[2] = 0x0d;
                    advData2[3] = 0x00;
    
                    for(uint8_t i = 0; i<100; i++)
                         advData2[4 + i] = (i + 1);
    
    
    
                    // broadcasterAdvHandler.eventMask      = BLEAPPUTIL_ADV_START_AFTER_ENABLE |
                    //                                        BLEAPPUTIL_ADV_END | // <--- new dynamic advertising.  
                    //                                        BLEAPPUTIL_ADV_END_AFTER_DISABLE;
    
    
                    status = GapAdv_loadByHandle(broadcasterAdvHandle_1, // broadcasterAdvHandle_1 ,broadcasterAdvHandler.pEventHandler
                                                GAP_ADV_DATA_TYPE_SCAN_RSP, //GAP_ADV_DATA_TYPE_SCAN_RSP , GAP_ADV_DATA_TYPE_ADV ,BLEAPPUTIL_GAP_ADV_TYPE,
                                                ADV_DATA2_LEN,
                                                advData2);
    
                     if (status != SUCCESS)
                         for(;;);
                    /** End New Code **/
    
                 }
                        break;

    此致、

    Anthony

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

    尊敬的 Anthony:

    明白。 您正在使用的代码看起来不错,但在使用 GapAdv API 时,您必须使用 GapAdv_setParam () API 设置广播间隔。 请尝试使用所需的时间间隔将其添加到代码中。

    此致、

    1 月

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

    您好、Jan、

    即使在实施 GapAdv_setParam () 之后,结果也没有改变。 如果 SysConfig 指定 3000ms 的间隔、则默认情况下系统应遵循这些初始参数、而不需要额外调用 GapAdv_setParam () 来“设置“已定义的参数。 此行为是否特定于扩展广播?

    此致、

    Anthony

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

    您好、Jan、
    “我发现、删除 BLEAPPUTIL_ADV_END 中的代码会恢复正确的广播间隔。 然而,这不是期望的结果,因为我需要动态调整扩展广告中的数据。 一旦我重新包含该代码、广播间隔再次偏离。 您还有其他建议吗?

            case BLEAPPUTIL_ADV_END:
                                MenuModule_printf(APP_MENU_ADV_EVENT+5, 0, "Adv EEEEEEEs: Started - handle: "
                                      MENU_MODULE_COLOR_YELLOW "%d Count = %d" MENU_MODULE_COLOR_RESET,
                                      ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle, test_ccnt++);
    
                    /** New Code **/
                BLEAppUtil_AdvEventData_t * pkt = (BLEAppUtil_AdvEventData_t *)pMsgData;
    
                if (pkt->pBuf->advHandle == broadcasterAdvHandle_1) 
                {
                    bStatus_t status = FAILURE;
    
                    status = GapAdv_prepareLoadByHandle(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE); 
    
                    if (status != SUCCESS)
                        for(;;); // Loop
    
                    uint8_t ADV_DATA2_LEN = (111 - 7);
                    //uint8_t *advData2 = ICall_malloc(ADV_DATA2_LEN);
                    uint8_t advData2[104] = {0};
                    
                    advData2[0] = (ADV_DATA2_LEN - 1);
                    advData2[1] = GAP_ADTYPE_MANUFACTURER_SPECIFIC;
    
                    //Company Identifier
                    advData2[2] = 0x0d;
                    advData2[3] = 0x00;
    
                    for(uint8_t i = 0; i<100; i++)
                         advData2[4 + i] = (i + 1);
    
    
    
                    // broadcasterAdvHandler.eventMask      = BLEAPPUTIL_ADV_START_AFTER_ENABLE |
                    //                                        BLEAPPUTIL_ADV_END | // <--- new dynamic advertising.  
                    //                                        BLEAPPUTIL_ADV_END_AFTER_DISABLE;
    
    
                    status = GapAdv_loadByHandle(broadcasterAdvHandle_1, // broadcasterAdvHandle_1 ,broadcasterAdvHandler.pEventHandler
                                                GAP_ADV_DATA_TYPE_SCAN_RSP, //GAP_ADV_DATA_TYPE_SCAN_RSP , GAP_ADV_DATA_TYPE_ADV ,BLEAPPUTIL_GAP_ADV_TYPE,
                                                ADV_DATA2_LEN,
                                                advData2);
    
                     if (status != SUCCESS)
                         for(;;);
                    /** End New Code **/
                    
                                     uint32_t advInterval = 0;
    
    
                     advInterval = 4800;
                     GapAdv_setParam(broadcasterAdvHandle_1,
                                     GAP_ADV_PARAM_PRIMARY_INTERVAL_MIN,
                                     &advInterval);
    
                     GapAdv_setParam(broadcasterAdvHandle_1,
                                     GAP_ADV_PARAM_PRIMARY_INTERVAL_MAX,
                                     &advInterval);
    
                 }
                        break;


    此致、

    Anthony

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

    尊敬的 Anthony:

    很高兴您能找到根本原因。 不建议在启用广播时更改广播参数。 您是否可以尝试禁用广播、更改速度并重新启用它们?  

    此致、

    1 月

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

    您好、Jan、

    我尝试禁用广告,调整播放速度,然后重新启用它们,但结果保持不变。 后来,我发现,通过注释掉 GapAdv_prepareLoadByHandle(广播 AdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE );广播间隔恢复正常。 它现在正确遵循 SysConfig 中配置的主 PHY 间隔最小值/最大值设置。

    此致、

    Anthony

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

    您好、

    很高兴听到您能够找到此问题的修复程序。 使用该 API 时、SysConfig 更新的全局变量可能会被忽略。 感谢您与社区分享此内容!

    此致、

    1 月