主题中讨论的其他器件: 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
我希望这将有所帮助、
此致、