微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 总是断开连接是什么情况?

总是断开连接是什么情况?

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

使用btool连接从机,连接上以后使用discovery char by uuid 之后,连接就断开了,原因是超时。为什么?

下面是收到的数据

[1] : <Rx> - 01:24:01.859
-Type  : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x06 (6) bytes(s)
 Event  : 0x0509 (ATT_ReadByTypeRsp)
 Status  : 0x14 (Can't Perform Function When Not In A Connection)
 ConnHandle : 0x0000 (0)
 PduLen  : 0x00 (0)
Dump(Rx):
04 FF 06 09 05 14 00 00 00
------------------------------------------------------------------------------------------------------------------------
[2] : <Info> - 01:24:01.875
Device Disconnected
Handle = 0x0000
Addr Type = 0x00 (Public)
BDAddr = 88:33:14:DD:8A:63
------------------------------------------------------------------------------------------------------------------------
[3] : <Rx> - 01:24:01.875
-Type  : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x06 (6) bytes(s)
 Event  : 0x0606 (GAP_TerminateLink)
 Status  : 0x00 (Success)
 ConnHandle : 0x0000 (0)
 Reason  : 0x08 (Supervisor Timeout)
Dump(Rx):
04 FF 06 06 06 00 00 00 08
------------------------------------------------------------------------------------------------------------------------

还发现了 有时候底层会调用GAP_UpdateLinkParamReq ,但是有时候却不会,如果调用了更新的话这边连接时间长一点~但是也会断开,这是什么原因呢?

admsadm,

你的supervision timeout时间应该设置长一点。

这个在BTool上也可以设置。记得设置好以后按一下set按钮。

GAP_UpdateLinkParamReq ()这个取决于你的外设端,有没有把DEFAULT_ENABLE_UPDATE_REQUEST设置成TRUE。

hi YAN

谢谢你的回答,但是我还有一些问题。

supervision timeout我设置成最大过的,问题还是存在,DEFAULT_ENABLE_UPDATE_REQUEST 这边默认是TRUE的。

不过我现在问题已经解决,是等到从机设备启动事件以后再进行连接,这样的话没有出现supervision timeout 这样的事情。

然后主机这也会出现Param Update ,

static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )

{

...

case GAP_LINK_PARAM_UPDATE_EVENT:
      {
        LCD_WRITE_STRING( "Param Update", HAL_LCD_LINE_1 );
        SerialPrintString("Param Update\r\n"); 
      }
      break;

...

}

我的问题是,DEFAULT_ENABLE_UPDATE_REQUEST 一直是默认的,那为什么我从机这边会没有Param Update呢?

admsadm,

你的情况是正常的。

从机的DEFAULT_ENABLE_UPDATE_REQUEST 设置成TRUE,从机就会发送param update的一个请求,所以主机能收到GAP_LINK_PARAM_UPDATE_EVENT。
然而蓝牙协议栈规定,真正的param update更新这个动作是只能由主机来做的,从机不能做,所以从机这边没这个事件。。。 

hi Yan

我在主机中查找了一下这个更新动作,是不是这个函数,如下

static void simpleBLECentral_HandleKeys( uint8 shift, uint8 keys )

{

...

if ( keys & HAL_KEY_RIGHT )
{
SerialPrintString(" [KEY RIGHT pressed!]\r\n");
// Connection update
if ( simpleBLEState == BLE_STATE_CONNECTED )
{
GAPCentralRole_UpdateLink( simpleBLEConnHandle,
DEFAULT_UPDATE_MIN_CONN_INTERVAL,
DEFAULT_UPDATE_MAX_CONN_INTERVAL,
DEFAULT_UPDATE_SLAVE_LATENCY,
DEFAULT_UPDATE_CONN_TIMEOUT );
  }
}

...

}

但是这个是按键更新啊,我没有用按键来更新怎么会有param update。或者这个更新动作最终是在协议栈里面完成的么?

admsadm,

你看一下simpleBLEPeripheral里面 DEFAULT_ENABLE_UPDATE_REQUEST 是否为TRUE.

这个为TRUE的话peripheral会自动请求(注意,是请求,不是主动更新)central去更新连接参数。

谢谢 你的回答,大致已经明白了

Hi Yan,

1、在初始化函数SimpleBLEPeripheral_Init里面,有配置scanRspData的参数,GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );,然后在Slave和Master连接的过程,当Master请求扫描的时候,Slave用scanRspData[] 响应,scanRspData[] 里面有interval和latency等参数。流程大概是这样吗?

2、如果是,那DEFAULT_ENABLE_UPDATE_REQUEST  设置是否为TRUE如何影响Slave是否提出参数更新的请求

3、当peripheral请求central去更新连接参数的时候,central有权利决定是否更新,是否更新在central代码里面哪里能体现出来呢?

HI admsadm:

    想请教一下,我遇到了一样的discovery services就断开的一个情况,想请问题你原先是怎么解决这个问题的?你说的从机设备启动事件后是什么意思?

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

网站地图

Top