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, ¶ms ) != 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有更好的解决办法吗?