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-Q1:关于广播传输事件

Guru**** 2595800 points
Other Parts Discussed in Thread: BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1349361/cc2340r5-q1-about-advertise-transmission-evne

器件型号:CC2340R5-Q1
Thread 中讨论的其他器件:BLE-STACK

大家好、TI_Team。

请告诉我在广播包传输期间发生的事件的时间。

我已确认该软件的操作、并在事件处理程序中添加了"BLEAPPUTIL_ADV_END"和"BLEAPPUTIL_ADV_ENTERMIND"。

我将在事件发生时切换一个端口。

如下图所示、可以看到"BLEAPPUTIL_ADV_END"事件在传输前后都发生了、

TIL_ADV_Terminated 事件期间结束。

@SDK 7.40

Q1.传输前为什么会出现"BLEAPPUTIL_ADV_END"?

-传输前执行 API: GapAdv_disable ()是否会产生影响?

Q2.为什么会出现"BLEAPPUTIL_ADV_Terminated"?

我已经进行了以下设置、但我想知道是否会触发原因"当广播集因连接建立而终止时发送"

是否发生了"BLEAPPUTIL_ADV_Terminated"事件?

-设备角色:Broadcastaer、传统事件属性选项:非连接和不可扫描的非定向

请随时提出您的问题、我很乐意提供回复。

此致。

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

    抱歉、TI_Team。

    我在上一个问题中犯了一个错误。 它应该为"BLEAPPUTIL_ADV_END_AFTER_DISABLE"、而不是"BLEAPPUTIL_ADV_END"。

    图中的注释也不正确。

    很抱歉、您对此感到困惑。

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

    您好!  

    问题1: 为什么在传输之前会出现"BLEAPPUTIL_ADV_END"(BLEAPPUTIL_ADV_END_AFTER_DISABLE)?

    在最后一个广播结束后、将发送 BLEAPPUTIL_ADV_END_AFTER_DISABLE。 如下图所示、了解更多信息:  

    GapAdv_disable () API 使用此事件来禁用广播。  

    此外、GAP_EVT_ADV_END_AFTER_DISABLE  会按照 GAP 广播事件掩码 代码段中 BLE 用户指南的 GAP 部分所示映射到 BLEAPPUTIL_ADV_END_AFTER_DISABLE 事件。

    这可以在 用户指南的将 BLE-Stack 移植到 BLE5-Stack 部分中的 API 转换表中找到。  

    Q2.为什么会出现"BLEAPPUTIL_ADV_Terminated"(BLEAPPUTIL_ADV_SET_TERMINED)?

    当广播事件的时间/数量用完时、会发生 BLEAPPUTIL_ADV_SET_TERMINED。  

    这可以在 为 BLEAPPUTIL_ADV_SET_TERMINED 配置广播事件掩码中的扫描和广播基础 SLA 中找到。  

    如果您有任何进一步的问题、请告诉我!  

    谢谢。  

    艾萨克

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

    您好、 Isaac。

    感谢您的答复。

    Q1和 Q2通过上述答案理解。

    我再问一个问题。
    问题3: 请告诉我为何下图中 CH2的事件"BLEAPPUTIL_ADV_END"未发生。
    ("在每个广播之后(对于旧广播)或在每个相应广播集结束时(对于扩展广播)发送。 我从描述中了解到它是在发送广播后发生的)。

    此致。

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

    您好!  

    您是否在事件掩码中包含了 BLEAPPUTIL_ADV_END?  

    如果不是,则可以在事件掩码中添加事件。 我 在此处链接了一个填充事件掩码的示例 (列表40)。  

    请告诉我这是否有帮助!  

    谢谢。  

    艾萨克

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

    您好!

    感谢您的回复。

    您能否提供您参考的文档内容和源代码?

    然后、我可以帮助您评估是否存在任何缺失的设置或代码。

    必要条件:如下面的红色框所示、"bleapputil_api.h"和"bleapputil_init.c"文件链接到 SDK 中的文件、并且尚未修改。

    在"bleapputil_init.c"文件中、所有 GAP_ADV 事件都被屏蔽。

    bStatus_t BLEAppUtil_initAdvSet(uint8 *advHandle,
                                    const BLEAppUtil_AdvInit_t *advInitInfo)
    {
        return bleStk_initAdvSet(BLEAppUtil_advCB, advHandle, GAP_ADV_EVT_MASK_ALL,
                                 advInitInfo->advParam, advInitInfo->advDataLen,
                                 advInitInfo->advData, advInitInfo->scanRespDataLen,
                                 advInitInfo->scanRespData);
    }
    

    "bleapputil_api.h"文件也未更改。

    /// GAP ADV event mask
    typedef enum BLEAppUtil_GAPAdvEventMaskFlags_e
    {
        BLEAPPUTIL_ADV_START_AFTER_ENABLE    = GAP_EVT_ADV_START_AFTER_ENABLE,  //!< Gets advertising handle using pBuf. Sent on the first advertisement after a @ref BLEAppUtil_advStart.
        BLEAPPUTIL_ADV_END_AFTER_DISABLE     = GAP_EVT_ADV_END_AFTER_DISABLE,   //!< Gets advertising handle using pBuf. Sent after advertising stops due to a @ref BLEAppUtil_advStop.
        BLEAPPUTIL_ADV_START                 = GAP_EVT_ADV_START,               //!< Gets advertising handle using pBuf. Sent at the beginning of each advertisement (for legacy advertising) or at the beginning of each each advertisement set (for extended advertising).
        BLEAPPUTIL_ADV_END                   = GAP_EVT_ADV_END,                 //!< Gets advertising handle using pBuf. Sent after each advertisement (for legacy advertising) or at the end of each each advertisement set (for extended advertising).
        BLEAPPUTIL_ADV_SET_TERMINATED        = GAP_EVT_ADV_SET_TERMINATED,      //!< Gets @ref GapAdv_setTerm_t using pBuf. pBuf should be cast to @ref GapAdv_setTerm_t. Sent when an advertisement set is terminated due to a connection establishment
        BLEAPPUTIL_SCAN_REQ_RECEIVED         = GAP_EVT_SCAN_REQ_RECEIVED,       //!< Gets @ref GapAdv_scanReqReceived_t using pBuf. pBuf should be cast to @ref GapAdv_scanReqReceived_t. Sent when a scan request is received.
        BLEAPPUTIL_ADV_DATA_TRUNCATED        = GAP_EVT_ADV_DATA_TRUNCATED,      //!< Gets @ref GapAdv_truncData_t using pBuf. pBuf should be cast to @ref GapAdv_truncData_t. Sent when the advertising data is truncated due to the limited advertisement data length for connectable advertisements.
        BLEAPPUTIL_ADV_INSUFFICIENT_MEMORY   = GAP_EVT_INSUFFICIENT_MEMORY      //!< A memory failure has occurred.
    } BLEAppUtil_GAPAdvEventMaskFlags_e;
    

    在"app_broadc.c"文件中、仅启用了四个事件、而为每个事件切换了端口。

    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 |
                          BLEAPPUTIL_ADV_SET_TERMINATED
    };

    void Broadcaster_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
        switch(event)
        {
            case BLEAPPUTIL_ADV_START_AFTER_ENABLE:
            {
                GPIO_toggle(CONFIG_GPIO_0);
                break;
            }
    
            case BLEAPPUTIL_ADV_END_AFTER_DISABLE:
            {
                GPIO_toggle(CONFIG_GPIO_0);
                break;
            }
            case BLEAPPUTIL_ADV_END:
            {
    			GPIO_toggle(CONFIG_GPIO_1);
                break;
            }
           case BLEAPPUTIL_ADV_SET_TERMINATED:
            {
                GPIO_toggle(CONFIG_GPIO_2);
                break;
            }
            default:
            {
                break;
            }
        }
    }

    在这些条件下运行时、下图所示。

    此致。

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

    您好!  

    看起来您已经正确设置了所有内容。  

    您是否可以向我发送启用和禁用广播的实施? 目前、在您的初始设置中、我可以看到每个广播出现了 BLEAPPUTIL_ADV_END、但我需要了解启用和禁用广播的实施情况才能进一步了解。  

    请告诉我!

    谢谢。  

    艾萨克

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

    你好。

    感谢您检查设置。 首先、很高兴设置看起来是正确的。

    我将在下面提供用于广播传输的实现代码。

    假设:IC 复位后、将不会有广播传输。

    然后、它将每隔100ms 重复唤醒和广播传输过程。

    func : App_Stack skirbitDoneHandler()

           -设置 ADV_SET 和设置定时器以进行唤醒

        status = Broadcaster_start();
        if(status != SUCCESS)
        {
            // TODO: Call Error Handler
        }
        tsPrepareTimer();											/* Set up a timer for Wakeup every 100 msec */

    func : broadcer_start ()

           -i 只从示例源代码"Basic_BLE"中删除了 BLEAppUtil_advStart()。

            ※这样做是为了防止初始化期间的传输。

    bStatus_t Broadcaster_start()
    {
        bStatus_t status = SUCCESS;
    
        status = BLEAppUtil_registerEventHandler(&broadcasterAdvHandler);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    
        status = BLEAppUtil_initAdvSet(&broadcasterAdvHandle_1, &broadcasterInitAdvSet1);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    #if	0
        status = BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    #endif
        // Return status value
        return(status);
    }

    唤醒后、在缓冲区中设置用于广播传输的数据、然后继续执行下一个代码。

    bStatus_t Broadcaster_updateAdvData(char *advDat)
    {
        bStatus_t status = SUCCESS;
    
        status = GapAdv_disable(broadcasterAdvHandle_1);
        if((status != SUCCESS) && (status != bleAlreadyInRequestedMode))
        {// Return status value
            return(status);
        }
        status = GapAdv_loadByHandle(broadcasterAdvHandle_1, GAP_ADV_DATA_TYPE_ADV, advDat[0], &advDat[1]);
        if(status != SUCCESS)
        {// Return status value
            return(status);
        }
        status = GapAdv_enable(broadcasterAdvHandle_1, GAP_ADV_ENABLE_OPTIONS_USE_MAX_EVENTS , 1);
        if(status != SUCCESS)
        {// Return status value
            return(status);
        }
        return(status);
    }

    如果您有任何其他需要、请告诉我。 谢谢你。

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

    您好!  

    很抱歉给您带来不便、我仍在尝试重现此问题。 我将在星期五作出答复。  

    感谢您的耐心。  

    谢谢。  

    艾萨克

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

    您好!  

    很抱歉耽误了时间、但我仍在尝试重复这个问题。 敬请期待下周早些时候的答复。  

    再次感谢您的耐心等待。  

    此致、  

    艾萨克

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

    您好!  

    您是否可以在未修改的 Basic_ble 工程中实施 BLEAPPUTIL_ADV_END 事件? 完成后、您能否验证事件是否在您的终端上的每次广播后发生?  

    此外、您能否说明您使用此活动的原因?  

    我目前仍在尝试在最后重现此问题。 对于给您带来的不便、我深表歉意、感谢您的耐心等待。  

    谢谢。  
    艾萨克

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

    大家好。

    我对 BLE_Basic 项目进行了极少的更改并确认了它的运行。

    这些更改

    ・添加 GPIO 端口并在发生事件时实现切换处理

    ・以及在广播传输期间将事件注册为外设角色

    ※请参考以下代码(标有@@@的器件是添加的代码)

    BLEAppUtil_EventHandler_t peripheralAdvHandler =
    {
        .handlerType    = BLEAPPUTIL_GAP_ADV_TYPE,
        .pEventHandler  = Peripheral_AdvEventHandler,
        .eventMask      = BLEAPPUTIL_ADV_START_AFTER_ENABLE |
                          BLEAPPUTIL_ADV_END_AFTER_DISABLE |
                          BLEAPPUTIL_ADV_END    /* @@@ */
    };
    

    void Peripheral_AdvEventHandler(uint32 event, 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,
                                  ((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;
            }
    #if 1  /* @@@ */
            case BLEAPPUTIL_ADV_END:
            {
                GPIO_toggle(CONFIG_GPIO_0);
                break;
            }
    #endif  /* @@@ */
            default:
            {
                break;
            }
        }
    }

    因此、我能够确认每次广播后都发生了事件(请参阅下图)。

    为什么它能够正常运行?

    我还将回答问题:"此外、您能否说明您使用此活动的原因?"

    目前在这一事件中没有采取任何具体行动。

    我将其用于确认事件发生的时间、但并未发生。

    在此活动中、通常建议采取哪些措施?

    由于我们仍在考虑规格、请提供任何建议的处理(如果可用)。

    此致。

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

    您好!  

    对于未修改的 Basic_ble 工程、该事件似乎能够正常运行。 您发送的结果与我的结果看起来是相同的。  

    首先、我注意到在提供的前面的图中、您看到 BLEAPPUTIL_ADV_SET_TERMINED 标记为 GPIO 之一。 您是否确定这是正确的事件标签?

     

    在代码中、显示 GPIO 2标记为 BLEAPPUTIL_ADV_SET_Terminated、但根据您发送给我的代码、广播永远不会终止、并且器件永远不会形成连接、因此该事件不会发生。 我将链接活动信息  纹波。   

    波形的行为看起来与 BLE_ADV_END 事件的行为非常相似。 下面我将包括我观察到的两张图片。

     

    如您所见、BLEAPPUTIL_ADV_END 和标记为 BLEAPPUTIL_ADV_SET_TERMINED 的行为类似。 您能否仔细检查设置以确保这些事件是准确的?  

    此外、您能否提供项目、以便我查看差异以更好地了解问题?  

    请告诉我!  

    谢谢。  
    艾萨克

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

    您好、 Isaac。

    非常感谢您的友好帮助。

    我想知道为什么事件发生在我目前正在开发的项目中,如你提到的"BLEAPPUTIL_ADV_SET_TERMINATED "的描述中所述,其中说,"事件发生在连接建立时"。

    此外、我发现预期事件"BLEAPPUTIL_ADV_END"未发生令人困惑。

    我认为、您来看看该项目以更好地了解情况将会有所帮助。

    但是,我不知道分享它的方法。 您能告诉我如何操作吗?

    此致。

    注意:请注意、公司将在~5/5之前度假、因此请等待分享、直至那时。

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

    您好!  

    您是否能够确认上图中的 GPIO2是 BLEAPPUTIL_ADV_SET_Terminated 而不是 BLEAPPUTIL_ADV_END? 波形看起来是相同的、因此我只想确认一下。  

    此外、请遵循  导出到存档 下载和下载部分。  

    谢谢。  

    艾萨克

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

    您好、Isaac。

    很抱歉等待。 我将共享存档文件。

    当您在广播期间、而不是在"BLEAPPUTIL_ADV_END"事件期间运行该共享文件时、

    仅将出现"BLEAPPUTIL_ADV_SET_ENTIVED"事件、如下图所示。

    评注部分/*@@@*/中说明了 Basic_BLE 项目的更改。

    e2e.ti.com/.../BLE_5F00_Adv_5F00_Event.zip

    就这些、请检查并确认。

    此致。

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

    您好!  

    我希望您的假期过得愉快! 我将在本周星期三之前作出答复。  

    很抱歉给您带来不便。  

    谢谢。  

    艾萨克

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

    您好!  

    BLEAPPUTIL_ADV_SET_TERMINED 似乎存在问题。 事件应仅在建立连接时发生。  

    我对您的项目做了一些改动、如下所示。 完成这些改动后、BLEAPPUTIL_ADV_END 事件即会完成。 当我将程序改回其原始状态并观察到 BLEAPPUTIL_ADV_END_AFTER_DISABLE 和 BLEAPPUTIL_ADV_END 时、我没有看到 BLEAPPUTIL_ADV_END、只看到了 BLEAPPUTIL_ADV_END_AFTER_DISABLE。 看到这一点后、我知道当广播持续被禁用时、BLEAPPUTIL_ADV_END 事件不会发生、而是替换为 BLEAPPUTIL_ADV_END_AFTER_DISABLE。 您可以在最后一张图片中看到这个逻辑曲线。  

    bStatus_t Broadcaster_start()
    {
        bStatus_t status = SUCCESS;
    
        status = BLEAppUtil_registerEventHandler(&broadcasterAdvHandler);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    
        status = BLEAppUtil_initAdvSet(&broadcasterAdvHandle_1, &broadcasterInitAdvSet1);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    #if	1															/* To avoid having to send at initialization */ /* @@@ */
    //@@@Changed to #if 1 to execute BLEAppUtil_advStart  
        status = BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1);
        if(status != SUCCESS)
        {
            // Return status value
            return(status);
        }
    #endif															/* @@@ */
        // Return status value
        return(status);
    }

    #if 1														/* To send modified Adv data */ /* @@@ */
    bStatus_t Broadcaster_updateAdvData(char *advDat)
    {
    
        bStatus_t status = SUCCESS;
        //@@@commented out all GapAdv functions.
    /*
        status = GapAdv_disable(broadcasterAdvHandle_1);
        if((status != SUCCESS) && (status != bleAlreadyInRequestedMode))
        {// Return status value
            return(status);
        }
    
        status = GapAdv_loadByHandle(broadcasterAdvHandle_1, GAP_ADV_DATA_TYPE_ADV, advDat[0], &advDat[1]);
        if(status != SUCCESS)
        {// Return status value
            return(status);
        }
        status = GapAdv_enable(broadcasterAdvHandle_1, GAP_ADV_ENABLE_OPTIONS_USE_MAX_EVENTS , 1);
        if(status != SUCCESS)
        {// Return status value
            return(status);
        }
    */
        return(status);
    }
    #endif		

    您的广告加载方式可能存在问题。 我建议在 GapAdv_disable ()函数之后设置一个标志,然后在收到标志时在 BLEAPPUTIL_ADV_END_AFTER_DISABLE 事件中执行 GapAdv_loadByHandle 和 GapAdv_enable 函数。 这样可确保在加载广播之前完全禁用广播。  

    总而言之、除了 BLEAPPUTIL_ADV_SET_TERMINED 事件外、我认为这些事件是按预期工作的。 很抱歉等待回复。  

    请告诉我这是否解答了您的问题!  

    谢谢。  

    艾萨克