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.

[参考译文] LP-EM-CC2340R5:在广播角色中启用制造特定数据时、无法广播广播广播包。

Guru**** 2770785 points

Other Parts Discussed in Thread: CC2340R5, UNIFLASH, ENERGYTRACE

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1276824/lp-em-cc2340r5-unable-to-broadcast-the-advertisement-packet-when-manufacture-specific-data-is-enabled-in-broadcast-role

器件型号:LP-EM-CC2340R5
主题中讨论的其他器件:CC2340R5UNIFLASHENERGYTRACE

我尝试将 CC2340R5模块设置为广播角色、并将广播间隔设置为1000ms、并 使用默认参数启用制造商特定数据。

但 TI 的 BLE 模块无法广播数据包。

请参考下图。

/resized-image/__size/320x240/__key/communityserver-discussions-components-files/538/pastedimage1696332129961v2.png.

此致、

Sapthagiri.

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

    您好、Sapthagiri、

    感谢您的联系。

    图像很模糊、您能否详细说明您是如何配置器件的。

    如果可能的话、我建议包含 based_ble 项目代码来尝试复制它。

    此致、

    大卫。

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


    我针对广播执行的步骤:
    从适用于 CC2340R5板的 SDK 7.20中导入了基本 BLE 示例代码。
    在中、我将器件角色从外设角色更改为广播。
    3.启用1000ms 的广播间隔
    并在 BLE 堆栈、公司标识符中启用三个特定于制造的数据、使其具有默认值、并将"附加数据"添加为0x11。


    配置后我面临的问题:
    1.无法检测我的 Android 应用程序中的数据包。
    2、如果我尝试禁用广告间隔,我只能在一部手机中发现包,但在所有手机中。


    以及我应如何在制造商特定数据中添加额外的特定数据。 因为在我的项目中、我需要从 I2C 获取数据并将这4个字节的 I2C 数据发送到制造特定数据中。

    我尝试在文件(ti_ble_config.c)中添加一些硬代码数据、例如0xFF。 但是、当我尝试构建代码时、硬代码会被删除、因为它是派生文件。

    请告诉我如何在代码中添加特定于制造商的数据。

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

    您好、Sapthagiri、

    1. 要配置广播设备上的广播间隔、请在主要 PHY 间隔最小值主要 PHY 间隔最大值下使用广播参数1执行广播间隔、广播数据1不配置设备的广播间隔。
    2. 要在应用程序中查看广播设备的名称、必须有一个扫描响应(在 app_broadcaster .c 中没有这种响应)。 请考虑以下情况:                                                                                                                      
      const BLEAppUtil_AdvInit_t broadcasterInitAdvSet1 =
      {
          /* Advertise data and length */
          .advDataLen        = sizeof(advData1),
          .advData           = advData1,
      
          /* Scan respond data and length */
          //.scanRespDataLen   = 0,
          //.scanRespData      = NULL,
      
          //ADD these two lines and comment the previous ones:
          /* Scan respond data and length */
          .scanRespDataLen   = sizeof(scanResData1),
          .scanRespData      = scanResData1,
      
          .advParam        = &advParams1
      };
    3. 我根据您的说明复制了设置、广播设备在两个电话/应用程序上可见。
    4. 您可以将特定于制造商的数据作为 Adv 数据的一部分或作为扫描响应的一部分发送。 对于最后一个、我建议查看 Stk_Gap Evt_Adv R.pt_t 结构(在 ble_stack_api.h 内)、其中包含一个可在其中找到和修改制造商数据的指针(* pData)。

    希望它有所帮助。

    大卫。

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

    先生,

    1.我应用了所有的更改,正如你提到的,但仍然无法检测到它在我的手机。

    2.bq452_EVT_ADVRpt_t  Stk_Gap 结构存在于 bleStk_pfnGapScanCB_t 结构中、用作函数指针。

    声明的函数指针的所有位置都不会在任何位置使用(在 ble_stack_api.h 文件中)。

    3.主席先生,请告诉我或提供一些代码片段,说明 如何调用该函数并插入4个 字节的数据。 我尝试了所有的方法,但无法找到解决方案。

    typedef void (*bleStk_pfnGapScanCB_t) (uint32_t event,
                                           GapScan_data_t *pBuf,
                                         uint32_t *arg);

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

    您好、Sapthagiri、

    请帮助我回答以下问题:

    1. 您是否正在使用 SimpleLink Connect 应用程序、或者您是指适用于 Android 的定制应用程序?
    2. 您为传统事件属性选项使用的配置值是什么:不可连接和不可扫描的不直接或可扫描的不直接?

    此致、

    大卫。

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

    尊敬的 David:

    1.我使用的是 TI 的 Simplelink Connect 应用

    2.我为"传统事件属性选项"使用的配置值:可扫描的不直接。

    我卸载了 Simplelink Connect 应用程序并重新安装它。 现在、我能够看到 BLE 器件。

    -->但我应该如何在广告包中添加 I2C 数据。

    您能为其提供任何代码片段吗?

    我正在执行一个 TPMS (轮胎气压监控系统)项目、在其中我需要在广告包本身中宣传压力、温度数据。

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

    尊敬的 David:

    我尝试了一种根据 TI BLE5堆栈指南 https://dev.ti.com/tirex/explore/content/simplelink_lowpower_f3_sdk_7_20_00_29/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/gap-cc23xx.html#gap-roles 更新广播数据的方法

    请参阅上面链接中的列表44图片。

    但通过添加该代码、我的 BLE 模块无法发送任何广播包。 请参考我添加的以下代码。

    void Update_Parameters(void)
    {
        bStatus_t status;
    
        status = GapAdv_prepareLoadByHandle(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE);
    
        if (status == SUCCESS)
          {
            // Sample buffer modification
            advData1[26] = 0xAA;
    
            // Reload buffer to handle
    
            GapAdv_loadByHandle(broadcasterAdvHandle_1, GAP_ADV_DATA_TYPE_ADV, broadcasterInitAdvSet1.advDataLen, advData1);
          }
    }

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

    尊敬的 David:

    还有一个问题是如何使 MAC ID 对于 BLE 模块来说是静态的。 因为每次 MAC ID 被随机改变时、

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

    您好、Sapthagiri、

    1.您在何处/何时调用 Update_Parameters (void)函数? 我建议从 Broadcaster_Adv 处理程序调用它、添加 BLEAPPUTIL_ADV_END 事件的案例。 不要忘记在 broadcasterAdvHandler.EventMask 中添加 BLEAPPUTIL_ADV_END 事件标志。 不过、这将触发持续的广播修改、因此最好考虑使用额外的标志(updateAdvData)来评估何时更新数据。 可以通过您选择的中断(例如计时器)将该额外标志设置为 true。

    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
    };
    
    void Peripheral_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
       switch(event)
       {
            .
            .
            .
            
            case BLEAPPUTIL_ADV_END:
            {
                if(updateAdvData)
                {
                
                    updateAdvData = false;
                    
                    //Don't free anything since we're going to use the same buffer to re-load
                    status = GapAdv_prepareLoadByBuffer(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE);
                    //Only update the data when return is successful
                    
                    if (status == SUCCESS)
                    {
                        // Sample buffer modification
                        advData1[26] = 0xAA;
                        
                        // Reload buffer to handle
                        // Here the advDataLen = sizeof(advData1) and it is setup in the app\_peripheral.c
                        // under advSetInitParamsSet_1
                        GapAdv_loadByHandle(broadcasterAdvHandle_1, GAP_ADV_DATA_TYPE_ADV, broadcasterInitAdvSet1.advDataLen, advData1);
                    }
    
                    break;
                }
            }
        }
     }

    3、要使用固定地址、可以在 BLE -一般配置-地址模式下从 SYSCFG 执行该操作、然后选择公共地址。 要查找公用地址值、请连接您的电路板、转到 Uniflash - 存储器、然后搜索存储在地址为0x4E000058的特殊寄存器中的6字节长值。                                                                          

    此致、

    大卫。

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

    先生,

    1.我已经通过 分别添加 BLEAPPUTIL_ADV_END 事件尝试了上述方法。

    但之后仍然没有发生广播。

    2.我能够使用以下命令修复 MAC 地址:

    #ifdef CC23X0
    // IMPORTANT: Please change the the address below
    // Note: addresses are byte resevered in the arrays.
    uint8_t ownAddr[B_ADDR_LEN] = { 0x0D, 0x35, 0x1E, 0xB0, 0x6F, 0x80 };
    #endif
    
    #ifdef CC23X0
        // Set the BD Address
        HCI_EXT_SetBDADDRCmd(ownAddr);
    #endif

    在"BLE - General Configurations - Address Mode"中的 SYSCFG 中设置参数、然后选择"Public Address"。

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

    您好、Sapthagiri、

    1. 您如何评估是否正在广播? 是否可以在刷写代码并检查电流消耗图后运行 EnergyTrace? 如果正在广播、则在每个 Adv 事件中、电流消耗应类似于以下内容:

    2. 如何处理 updateAdvData 变量?
    3. 确保写入 advDATA1数组中的正确元素。

    此致、

    大卫。