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.

CC2540广播间隔

Other Parts Discussed in Thread: CC2540

大家好,我现在做CC2540时需要调节广播间隔,在无连接时想将广播的频率从默认的100MS降低到1S,该如何做?

  • 引用别人的blog的一句话:

    连接异常处理

    举例说明连接异常,如主机采用从机并不舒坦的参数来请求连接,有如主从机已经连接了,但从机有想法了,要改参数条约。通过“连接参数更新请求(ConnectionParameter Update Request)”来解决问题,交由L2CAP“收发室物流处”处理。连接参数上文已经说了,不再叙述。

  • 很欢迎你来这里提问, 这样大家都能看到:

    在peripheral.c里面的uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) 函数里面做下面修改, 注意红色部分:

     

      if ( events & START_ADVERTISING_EVT )

      {

        if ( gapRole_AdvEnabled )

        {

          gapAdvertisingParams_t params;

     

          // Setup advertisement parameters

    #if 0 /* For test only */

          params.eventType = gapRole_AdvEventType;

          params.initiatorAddrType = gapRole_AdvDirectType;

          VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN );

          params.channelMap = gapRole_AdvChanMap;

          params.filterPolicy = gapRole_AdvFilterPolicy;

     

          if ( GAP_MakeDiscoverable( gapRole_TaskID, &params ) != SUCCESS )

          {

            gapRole_state = GAPROLE_ERROR;

            if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange )

            {

              pGapRoles_AppCGs->pfnStateChange( gapRole_state );

            }

          }

    #else

          uint16 advIntervalMin = 1600;     /* Required adv interval. */

          uint16 advIntervalMax = 1600;     /* Required adv interval. */

          uint8  advType = HCI_CONNECTABLE_UNDIRECTED_ADV;

          uint8  ownAddrType = HCI_PUBLIC_DEVICE_ADDRESS;  /* Public addr. */

          uint8  directAddrType = HCI_PUBLIC_DEVICE_ADDRESS;  /* Useless here. */

          uint8  *directAddr = NULL;

          uint8  advChannelMap = HCI_ADV_CHAN_38;       /* Only on 38 for sniffer. */

          uint8  advFilterPolicy = HCI_ADV_WL_POLICY_ANY_REQ;

     

          HCI_LE_SetAdvParamCmd(advIntervalMin,

                                advIntervalMax,

                                advType,

                                ownAddrType,

                                directAddrType,

                                directAddr,

                                advChannelMap,

                                advFilterPolicy );     

          

          /* Now enable adv. */

          HCI_LE_SetAdvEnableCmd(HCI_ENABLE_ADV);

         

    #endif

        }

        return ( events ^ START_ADVERTISING_EVT );

      }

  • 我按照上面红色的code修改的这个函数,但是用packet sniffer抓包后发现接收到广播数据包的时间间隔没有变化啊。

    Time(us)  +384927表示什么意思啊?是不是两个数据包之间的间隔时间是384927/32=12028ms,但是时间不可能这么长啊?

    求助各位大侠解决问题。

     

  • 我在做一个射频的项目,用TRF7963读取卡片的信息,通过蓝牙4.0上传,但是会发现打开蓝牙后读卡成功率会显著下降,

    所以想把ADV interval降为1S,并且设定SlaveLatency为200,为的是降低CC2540 CPU的负担,

    但是修改code #define DEFAULT_ADVERTISING_INTERVAL          1600后,抓到ADV数据包的时间间隔并没有边长啊?

    计算时间间隔的方法是不是数据包时间栏中增加的时间除以32,得到单位为ms?

    麻烦TI的工程师帮忙看一下,问题出现在哪里啊?

    谢谢帮忙!

  • 参数在这里改了,会在哪里被调用修改呢???

  • 我按你这个添加代码之后一直处于初始化,不进广播

  • yueliangz0123,

    keyfob,通过按按键触发。。。

  • 我把所有带GAPROLE_ADVERT_ENABLED的语句都注释掉了,咋还能广播呢?

  • hi,如果使用广播例程:SimpleBLEBroadcaster

    在广播的过程中,怎么修改广播间隔?

    我将advInt 的值修改后,直接参照初始化时调用的函数,在主循环里间隔2秒设置一次,结果设置失败

    uint16 advInt = Para_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 );

    请各位大神指点一下,谢谢

  • 同问,你好 kong lei你在抓包软件中计算时间间隔方法是怎么做的,才能计算出前后广播的时间间隔

  • 我想问下Yan,为什么不在DEFAULT_ADVERTISING_INTERVAL这个宏进行修改呢?我的理解是改为1600就是间隔一秒广播一次了。如有认识错误谢谢指正。来自CQ_JIMI

  • 嗨Yan,我是CQ_JIMI我问你好多个问题啦?我正耐心等待你的回答。这个问题是我想实现从机一分钟广播一次,我发现用这个代码

    // Set advertising interval
      {
        uint16 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 );
      }

    实现不了我的意图,GAP_SetParamValue(),第二个参数是无符号16位的,所以最大是65536,而我一分钟一次广播按理说advint = 96000

    你好,Yan有更好的解决办法吗?