Hi,
我现在有两块LAUNCHXL-CC26X2R1评估板A和B,修改了rtls_slave example代码,让A实现仅仅发送unconnectable unscanable undirect的 ble 5.0 extend periodic adv packet。
修改了simple_central example代码,参考 "ble5 stack user guide"实现了scan Synchronize with a periodic advertising train。但是问题是没有GAP_SCAN_PERIODIC_ADV_SYNC_EST_EVENT上报,
即无法建立Periodic Advertising同步。
我简单介绍下我的环境:
step1:在ccs10的工程选项中添加了ARM Linker pre-define macro “”“USE_PERIODIC_SCAN”;
step2:初始化GAP_PROFILE_CENTRAL角色
static void SimpleCentral_init(void)
{
BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- init ", SC_TASK_PRIORITY);
// ******************************************************************
// 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);
// Create an RTOS queue for message from profile to be sent to app.
appMsgQueue = Util_constructQueue(&appMsg);
GGS_AddService(GATT_ALL_SERVICES); // GAP
// Register with GAP for HCI/Host messages (for RSSI)
GAP_RegisterForMsgs(selfEntity);
BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- call GAP_DeviceInit", GAP_PROFILE_CENTRAL);
// Initialize GAP layer for Central role and register to receive GAP events
GAP_DeviceInit(GAP_PROFILE_CENTRAL, selfEntity, addrMode, &pRandomAddress);
dispHandle = Display_open(Display_Type_UART, NULL);
Display_printf(dispHandle, SC_ROW_SEPARATOR_1, 0, "====================");
}
step3:先设置scan参数,此时不发送scan_enable。然后发送
GapScan_PeriodicAdvCreateSync,其中sid以及广播设备地址已知直接指定
static void SimpleCentral_processGapMsg(gapEventHdr_t *pMsg) { switch (pMsg->opcode) { case GAP_DEVICE_INIT_DONE_EVENT: { uint8_t temp8; uint16_t temp16; gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- got GAP_DEVICE_INIT_DONE_EVENT", 0); // Setup scanning // For more information, see the GAP section in the User's Guide: // http://software-dl.ti.com/lprf/ble5stack-latest/ // Register callback to process Scanner events GapScan_registerCb(SimpleCentral_scanCb, NULL); // Set all Scanner Event Mask GapScan_setEventMask(GAP_EVT_SCAN_EVT_MASK); // Set Scan PHY parameters GapScan_setPhyParams(SCANNED_PHY_1M, SCAN_TYPE_PASSIVE, SCAN_PARAM_DFLT_INTERVAL , SCAN_PARAM_DFLT_WINDOW ); // Set all Advertising report fields to keep temp16 = SCAN_PARAM_ALL_RPT_FIELDS; GapScan_setParam(SCAN_PARAM_RPT_FIELDS, &temp16); // Set Scanning Primary PHY temp8 = SCANNED_PHY_1M; GapScan_setParam(SCAN_PARAM_PRIM_PHYS, &temp8); // Set LL Duplicate Filter temp8 = SCAN_FLT_DUP_ENABLE; GapScan_setParam(SCAN_PARAM_FLT_DUP, &temp8); // Set PDU type filter - // Only 'Connectable' and 'Complete' packets are desired. // It doesn't matter if received packets are // whether Scannable or Non-Scannable, whether Directed or Undirected, // whether Scan_Rsp's or Advertisements, and whether Legacy or Extended. //temp16 = SCAN_FLT_PDU_CONNECTABLE_ONLY | SCAN_FLT_PDU_COMPLETE_ONLY; //temp16 = SCAN_FLT_PDU_EXTENDED_ONLY; temp16 = SCAN_FLT_PDU_NONCONNECTABLE_ONLY; BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- GapScan_setParam", 0); GapScan_setParam(SCAN_PARAM_FLT_PDU_TYPE, &temp16); #ifdef USE_PERIODIC_SCAN // this is a periodic advertisement GapScan_PeriodicAdvCreateSyncParams_t pSyncParams; //uint8 t_addr[6]={0xCB,0x98,0x2D,0x5E,0x8A,0xF8}; pSyncParams.options = SCAN_PERIODIC_DO_NOT_USE_PERIODIC_ADV_LIST | SCAN_PERIODIC_REPORTING_INITIALLY_DISABLED; pSyncParams.advAddrType = ADDRTYPE_PUBLIC; // only ADDRTYPE_PUBLIC and ADDRTYPE_RANDOM are allowed //osal_memcpy(pSyncParams.advAddress, t_addr, B_ADDR_LEN); pSyncParams.advAddress[5] = 0xF8; pSyncParams.advAddress[4] = 0x8A; pSyncParams.advAddress[3] = 0x5E; pSyncParams.advAddress[2] = 0x2D; pSyncParams.advAddress[1] = 0x98; pSyncParams.advAddress[0] = 0xCB; 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(0x01, &pSyncParams); Display_printf(dispHandle, SC_ROW_SCAN_3, 0, "PeriodicAdvCreateSync status! 0x%x",status); #endif break; } case GAP_SCAN_CREATE_SYNC_EVENT: { GapScan_PeriodicAdvEvt_t *pPkt = (GapScan_PeriodicAdvEvt_t *)pMsg; uint8_t status; Display_printf(dispHandle, SC_ROW_SCAN_EVT_5, 0, "GAP_SCAN_CREATE_SYNC_EVENT Status 0x%x",pPkt->status); if(pPkt->status == SUCCESS) { status = GapScan_enable(0, 0, 0); //if(SUCCESS != status) { Display_printf(dispHandle, SC_ROW_SCAN_EVT_2, 0, "GapScan_enable again status 0x%x",status); } } } break; case GAP_SCAN_PERIODIC_ADV_SYNC_EST_EVENT: { Display_printf(dispHandle, SC_ROW_SCAN_EVT_3, 0, "GAP_SCAN_PERIODIC_ADV_SYNC_EST_EVENT"); } break; case GAP_SCAN_PERIODIC_ADV_SYNC_LOST_EVENT: { Display_printf(dispHandle, SC_ROW_SCAN_EVT_7, 0, "GAP_SCAN_PERIODIC_ADV_SYNC_LOST_EVENT"); } break; default: break; } }
step4:生成GAP_SCAN_CREATE_SYNC_EVENT后,开启scan_enable
等待GAP_SCAN_PERIODIC_ADV_SYNC_EST_EVENT。
现在就是GAP_SCAN_PERIODIC_ADV_SYNC_EST_EVENT一直没有出现,我检查了代码、读了文档手册不知道问题出现在哪?请给予帮助,万分感谢