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.

[参考译文] CC2640R2F:移除32kHz RTC 时钟会影响简单广播设备的广播间隔。

Guru**** 2617815 points

Other Parts Discussed in Thread: CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1232518/cc2640r2f-does-removing-32khz-rtc-clock-affects-the-broadcasting-interval-of-simple-broadcaster

器件型号:CC2640R2F
主题中讨论的其他器件:CC2640

我使用 Simplelink_cc2640r2_SDK_5_30_00_03 SDK、展示了简单的广播设备示例(而非 Ble5)。  用这个例子,我正面临广播延误的问题。 目前我已经把它设置为10000ms。 此外,我还删除了外部32kHz 晶体用于 RTC ,因为。 这是否会影响广播间隔? TI_RTOS 是否使用外部 RTC 晶体来计算广播间隔? 目前我正在使用 NRF 连接应用程序接收广播数据

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

    Ankit、您好!

    "面对广播延误的问题"是什么意思? 您将值设置为10s、现在的值是多少?

    您能否向我提供您的广告参数?

    如果保留外部晶体、广播间隔是否是您设置的时间间隔?

    请随时 在操作系统 Android 和 iOS 上找到 TI SimpleLink Connect 应用程序。

    Apple 应用商店中的 TI SimpleLink Connect

    Google 应用商店中的 TI SimpleLink Connect

    此致、

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

    面对广播延迟的问题意味着,它最初是在10000ms 或9997ms 广播,但几小时或几天后,有时是在14s 广播,有时20秒等。

    我使用的是简单的广播设备示例。 刚刚修改了 simple_broadcenter.c 中的广播间隔并添加了注释/禁用扫描响应数据  

    // What is the advertising interval when device is discoverable (units of 625us, 160=100ms)
    #define DEFAULT_ADVERTISING_INTERVAL          16000//8000
    

    static void SimpleBroadcaster_init(void)
    {
    	// ******************************************************************
      // N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp
      // ******************************************************************
      // Register the current thread as an ICall dispatcher application
      // so that the application can send and receive messages.
      ICall_registerApp(&selfEntity, &syncEvent);
    
      // Hard code the DB Address till CC2650 board gets its own IEEE address
      //uint8 bdAddress[B_ADDR_LEN] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 };
      //HCI_EXT_SetBDADDRCmd(bdAddress);
    
    #ifdef USE_RCOSC
      RCOSC_enableCalibration();
    #endif // USE_RCOSC
    
      // Create an RTOS queue for message from profile to be sent to app.
      appMsgQueue = Util_constructQueue(&appMsg);
    
     // Util_constructClock(&periodicClock, SimpleBroadcaster_clockHandler,
       //                    SBP_PERIODIC_EVT_PERIOD, 0, false, SBP_PERIODIC_EVT);
      // Open LCD
     // dispHandle = Display_open(SBB_DISPLAY_TYPE, NULL);
    
      // Setup the GAP Broadcaster Role Profile
      {
        // For all hardware platforms, device starts advertising upon initialization
        uint8_t initial_advertising_enable = TRUE;
    
        // By setting this to zero, the device will go into the waiting state after
        // being discoverable for 30.72 second, and will not being advertising again
        // until the enabler is set back to TRUE
        uint16_t gapRole_AdvertOffTime = 0;
    
    #ifndef BEACON_FEATURE
        uint8_t advType =  GAP_ADTYPE_ADV_NONCONN_IND;//GAP_ADTYPE_ADV_SCAN_IND; // use scannable undirected adv
    #else
        uint8_t advType = GAP_ADTYPE_ADV_NONCONN_IND; // use non-connectable adv
    #endif // !BEACON_FEATURE
    
        // Set the GAP Role Parameters
        GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t),
                             &initial_advertising_enable);
        GAPRole_SetParameter(GAPROLE_ADVERT_OFF_TIME, sizeof(uint16_t),
                             &gapRole_AdvertOffTime);
    
    
    
      //  GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof (scanRspData),
        //                     scanRspData);
    
    
        GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
    
        GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &advType);
    
    
      }
    
      // Set advertising interval
      {
        uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL;
    
        GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MIN, advInt);
        GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MAX, advInt);
        GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt);
        GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt);
      }
    
      // Start the Device
      VOID GAPRole_StartDevice(&simpleBroadcaster_BroadcasterCBs);
    
      Display_print0(dispHandle, 0, 0, "BLE Broadcaster");
    }

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

    Ankit、您好!

    根据蓝牙规范: 核心规范|蓝牙Registered技术网站

    在两个广播事件之间、我们具有广播间隔+广播延迟、这一个可以在0ms 到10ms 之间。

    例如、假设我们的间隔为30ms、

    -广播1延迟30ms + 2ms

    -广告2没有延迟,所以它现在是30ms -2ms "延迟",当在现实中,它根本没有延迟,但由于先前的广告被延迟,它看起来这样

    您觉得这很合理吗?

    因此、在经过数小时或数天的广播后、两次广播之间的时间可能会略有改变。

    为了避免这个问题,你可以停止和重新启动广播,它应该重新同步广播间隔。

    此致、

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

    纪尧姆、您好!

    感谢您的建议、您能告诉我哪些函数用于停止和重新启动广播以及在何处调用这些函数吗? 我将 BLE 堆栈 与 Simplelink_cc2640r2_SDK_5_30_00_03 SDK 配合使用。

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

    Ankit 您好!

    您可能会感兴趣地了解一下 扫描和广播实验、即使该示例位于 simple_peripheral 上、simple_broadcast 的架构也是相同的。

    您应该能够使用 GAPRole_SetParameter () 功能和 定义 GAPROLE_advert_enabled.
    被调用来停止广播的函数是 GAP_EndDiscoverable()。

    此致、

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

    纪尧姆、您好!

    我尝试了你以上建议的方法,但我仍然面临着问题,数据包在几分钟后延迟。 我认为在我的 Android 手机上运行的扫描应用程序有一些问题。 为了检查应用程序是否丢失了数据包,我正在考虑把一个计数器在 ADV 数据包中,并使它每次广播数据包时递增,我应该把这个计数器放在哪里?

    此致、

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

    Ankit、您好!

    好的、现在我们需要看到在数据包级别发生了什么情况。 是否有 BLE 监听器可以做到?

    如果不是这样、您可以按照 调试指南 一节中的说明调试射频输出、因此您可以使用 GPIO 来查看射频活动以及数据包是否在正确的时间发送。

    此致、

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

    另外、让我们退一步讲您的初始问题:

    您去除了 LF 晶体(32kHz)、但是否还有其他 LF 晶体? 由于此晶体的用途是处理睡眠模式、因此当设备未进行广播时、它处于睡眠模式。 因此、延迟广播其实并不是问题、因为在最坏的情况下、您会丢失一个广播包、并返回正确的广播间隔。

    我真的不知道为什么你需要专门针对10秒进行广告宣传、但这对你的应用来说应该不是一个大问题。

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

    不,我没有嗅探器与我. 调试射频活动时必须使用 GPIO。

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

    之前的32kHz 和24MHz 都用于 LF 和 HF 时钟、但现在仅使用24MHz 晶体、如果我错了、请更正我、想象简单的广播设备示例使用内部 LF 进行睡眠时间计算。

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

    是的、您适合使用内部时钟(称为 RCOSC)进行睡眠时间计算。 因此、移除外部晶体应该不会影响 Adv 间隔。 再强调一下、每10s 广播一次的目的是什么?

    您以前是如何计算两个数据包之间的时间的呢? (假设它可能是计时器问题、而不是通告问题)

    此致、

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

    我的应用是胎压监测,我每隔10秒向移动应用发送一次压力和温度值,这样,如果在压力和温度值中观察到任何异常,用户每隔10秒就会收到通知。 我的定制移动应用程序使用计时器来计算2个间隔之间的计时。 我认为它不是延迟广播包、而是缺少广播包。 因为计时器将获取新数据、并且一旦在惯性值(为10的倍数)内接收到数据包、计时器就会变为零。 例如、如果在10秒内收到第一个数据包、则计时器在达到10秒后将变为零、另一个数据包将在30秒之后接收、这意味着它错过了2个数据包、而第三个数据包在第30秒接收。 因此、为了确认数据包是否被移动应用错过了或者 CC2640错过了、我想在广播数据包中添加一个数据包计数器。

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

    Ankit、您好!

    首先、我会将您的问题转交给我们的汽车团队、他们是适合您应用的专家。

    事实上、即使您的广告设置了适当的10秒间隔、也并不意味着您每隔10秒就会在中央侧收到正确的数据。 中央设备可能丢失广播、这种情况很频繁、两侧(外设和中央设备)在广播/扫描期间都不同步、您无法将其与连接事件进行比较。  

    所以我认为你的行为是完全正常的,至少对于广告.

    此致、

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

    安盖特

    一些需要注意的事项/需要提问的问题。  

    扫描器尝试查找此广告的扫描设置是什么?

    为了可靠地看到广播、我们建议扫描窗口/间隔至少为广播间隔的2倍。   

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

    有4个广告主和一个移动应用程序用于扫描广告。 广告客户 Mac 地址在将广告客户安装到轮胎时通过 QR 码扫描白名单。

    移动应用程序处于连续扫描模式。 一旦它发现任何设备的数据包、它就会将数据发送到应用层、并再次开始扫描。  

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

    Ankit、

    根据我的经验,手机供应商不允许修改扫描参数,也不允许扫描整个占空比。 它们可以更仔细地扫描~10-20%的时间、具体取决于它们处理的其他连接。 这是为了节省/节省移动设备的电源。  

    简而言之-您的两个增加看到广告的选项是:

    *更快地进行宣传  

    *扫描更长的时间

    由于您无法控制移动设备扫描参数、您可能只需要更频繁地进行广播。

    不过我的问题是、为什么您需要 TPMS 传感器来与手机连接? 通常、汽车内有一个 BLE 器件、用于聚合来自 TPMS 传感器的消息、然后在需要时将其传输到某种类型的移动应用。  

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

    您好 Evan:

    感谢的答复,是的,你是正确的,因为我在我的广播包中添加了一个数据包计数器,并在每次广播间隔前增加它,发现应用程序丢失了数据包.

    并回答您的问题:我为什么使用移动应用、是的、我同意您的看法:汽车中有 BLE 仪表组。 但是、我们将该应用用于两轮车制造商的客户演示、因为除了电动汽车外、两轮车中的大多数都没有 BLE 仪表组。

    我只想再问一件事、对于 BLE 监听器、我还会面临同样的问题吗。 我应该使用 simple_observer 示例作为您正在讨论的聚合器。

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

    如果使用 simple_observer 等示例进行聚合、则可以更好地控制查看更多广告、因为可以将扫描窗口和间隔设置为比手机上显示的窗口和间隔大得多的东西。 我们倾向于建议扫描窗口/间隔=广播间隔的2倍、这样扫描器就有机会在其扫描的通道上看到两次广播。

    为了进行演示、您甚至可以考虑使用多角色项目扫描所有 TPMS 节点、同时连接到手机。 连接到手机(例如 iPhone)将为您提供~40ms 的连接间隔、因此您的扫描将在此连接间隔内被截断一些、但我认为这是可行的、并且仍然比您在当前设置中看到的更好。 只是一个想法、但开始使用观测器是很好的第一步。