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.

LAUNCHXL-CC26X2R1: 无法建立Periodic Advertising同步

Part Number: LAUNCHXL-CC26X2R1

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一直没有出现,我检查了代码、读了文档手册不知道问题出现在哪?请给予帮助,万分感谢