主题中讨论的其他器件: CC2652R、 CC2652R7、 SysConfig
您好!
以下是实现与 CC2642R、CC2652R 或 CC2652R7上的周期性广播列车同步的一些步骤。
本指南假定您针对所选器件使用 simple_central 示例。 本指南已在 SDK 7.10.00.98上进行了测试。
1-启用对"周期性广播同步"的支持
保存并关闭 SysConfig
3-在 SimpleCentral_processGapMsg ()中的 GAP_DEVICE_INIT_DONE_EVENT 下,确保 GAP 层不会滤除您感兴趣的广播包。 注释掉"temp16 = SCAN_FLT_PDU_CONNECTABLE_ONLY | SCAN_FLT_PDU_COMPLETE_ONLY;"行、并将其替换为"temp16 = SCAN_FLT_PDU_NONCONNECTABLE_ONLY;"。
4-(可选)通过在 SimpleCentral_processGapMsg ()中的 GAP_DEVICE_INIT_DONE_EVENT 的外壳末尾添加以下代码来自动触发扫描操作:
// Automatically trigger scan GapScan_enable(0, 0, 0);
5-添加代码以创建与收到的广播的同步。 应在 SimpleCentral_processAppMsg ()中的"SC_EVT_ADV_REPORT"条件下添加以下代码:
GapScan_Evt_AdvRpt_t* pAdvRpt = (GapScan_Evt_AdvRpt_t*) (pMsg->pData); //// BEGIN if(0 != pAdvRpt->periodicAdvInt) { // this is a periodic advertisement GapScan_PeriodicAdvCreateSyncParams_t pSyncParams; pSyncParams.options = SCAN_PERIODIC_DO_NOT_USE_PERIODIC_ADV_LIST | SCAN_PERIODIC_REPORTING_INITIALLY_ENABLED; pSyncParams.advAddrType = (uint8)pAdvRpt->addrType; // only ADDRTYPE_PUBLIC and ADDRTYPE_RANDOM are allowed osal_memcpy(pSyncParams.advAddress, pAdvRpt->addr, B_ADDR_LEN); pSyncParams.skip = 0; // should be between 0 and SCAN_PERIODIC_SKIP_MAX pSyncParams.syncTimeout = 1000; // synchronization timeout for the periodic advertising train is 1000*10ms = 10s // should be between SCAN_PERIODIC_TIMEOUT_MIN and SCAN_PERIODIC_TIMEOUT_MAX pSyncParams.syncCteType = SCAN_PERIODIC_CTE_TYPE_ALL; uint8_t status = GapScan_PeriodicAdvCreateSync(pAdvRpt->advSid, &pSyncParams); if(SUCCESS != status){ // handle error } GapScan_disable(""); break; } //// END //Auto connect is enabled
6-声明一个易失性全局变量来计算接收到的广播数量。
volatile uint32_t numberOfReports = 0;
7-在 SimpleCentral_processGapMsg ()中,添加对以下情况的处理:GAP_SCAN_CREATE_SYNC_EVENT、GAP_SCAN_PERIOD_ADV_SYNC_EST_EVENT 和 GAP_SCAN_PERIOD_ADV_REPORT_EVENT:
case GAP_SCAN_CREATE_SYNC_EVENT: { GapScan_PeriodicAdvEvt_t *pPkt = (GapScan_PeriodicAdvEvt_t *)pMsg; uint8_t status; if(pPkt->status == SUCCESS) { status = GapScan_enable(0, DEFAULT_SCAN_DURATION, 0); if(SUCCESS != status){ // handle error } } break; } case GAP_SCAN_PERIODIC_ADV_SYNC_EST_EVENT: { GapScan_Evt_PeriodicAdvSyncEst_t *pPkt = (GapScan_Evt_PeriodicAdvSyncEst_t *)pMsg; uint8_t status; if(pPkt->status == SUCCESS) { status = GapScan_SetPeriodicAdvReceiveEnable(pPkt->syncHandle, 0x01); if(SUCCESS != status){ // handle error } } break; } case GAP_SCAN_PERIODIC_ADV_REPORT_EVENT: { GapScan_Evt_PeriodicAdvRpt_t *pPkt = (GapScan_Evt_PeriodicAdvRpt_t *)pMsg; numberOfReports++; // Free report payload data if (pPkt->pData != NULL) { ICall_free(pPkt->pData); } break; }
8-构建和刷写设备
9-打开周期性广播器件
在调试模式下运行程序。 确保变量 numberOfReports 已添加到"Expressions"视图。
11-器件同步并报告广播事件:
注:如果已启用自动扫描启动(步骤4),则不会执行任何操作。 如果尚未启用自动扫描启动、则应使用双按钮菜单来触发扫描。
注2:即使启用了自动扫描启动(步骤4),也可能需要使用双按钮菜单重复此操作。
另请查看此主题、其中展示了如何将 CC2642R 或 CC2652R7器件设置为周期性广播器: https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1294888/faq-cc2642r-periodic-advertising-with-cc2642r-cc2652r7
我希望这将有所帮助、
此致、