CH573 CH582 CH579 peripheral通用外设讲解 演示设备主动断开连接

发布时间 2023-10-12 11:01:41作者: debugdabiaoge

顾名思义,在实际使用中可能需要从机主动与主机的连接,重新进入广播状态或者睡眠状态等,以下示例从原理和实现角度讲述从机主动断开连接具体过程。

从机主动断开连接很简单,LIB提供了接口函数可以直接调用。

/**
 * @brief       Terminates the existing connection.
 *
 * @return      SUCCESS or bleIncorrectMode
 */
extern bStatus_t GAPRole_TerminateLink( uint16_t connHandle );

关于该函数的使用,举个简单的例子(以peripheral 为例程)

//peripheral例子中定义了一个结构体用于保持连接信息,具体如下,其中connHandle 连接的handle值在断开连接时需要用到
typedef struct
{
    uint16_t connHandle; // Connection handle of current connection
    uint16_t connInterval;
    uint16_t connSlaveLatency;
    uint16_t connTimeout;
} peripheralConnItem_t;

// Connection item list
static peripheralConnItem_t peripheralConnList;

连接参数是在连接刚刚建立时获取并保存下来的

有了连接handle值后就可以随时调用 GAPRole_TerminateLink(uint16_t connHandle)主动断开连接

以下演示一种实现

在连接参数更新时,10s后启动断开连接的任务

    if(events & SBP_DISCONNECT_EVT)
    {
        PRINT("peripheral 主动断开\r\n");
        GAPRole_TerminateLink(peripheralConnList.connHandle);
        return (events ^ SBP_DISCONNECT_EVT);
    }

当任务开始执行,会进入BLE的状态回调函数 static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEvent_t *pEvent),并打印具体断连原因

 对应具体的断连原因是0x16

 0x16的断连原因在协议文档的具体解释是

顺便看下BLE分析仪 WCH_BLEAnalyzer.zip - 南京沁恒微电子股份有限公司 )抓包的的数据

 从机发给主机的断连原因0x13(注意上图抓包的方向S->M)

所以592主动调用断开,592显示的断连原因是0x16

                                       主机端显示的断连原因是592发给主机的,0x13