微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540广播间隔

CC2540广播间隔

时间:10-02 整理:3721RD 点击:

大家好,我现在做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有更好的解决办法吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top