2. 低延时模式

Note

在标准的BLE协议中,通常最小连接间隔是7.5ms(回报率最大为133),这种连接频率对普通数据传输已经足够,但对于游戏鼠标等对速度有极高要求的设备来说,延迟较高。而低于1ms的连接间隔则能够极大地提升鼠标的数据传输速度和响应表现。尤其在电竞鼠标领域,能够达到低于1ms的连接间隔对于减少延迟和提升响应速度至关重要。

Note

AW31支持私有的ble低延时数据传输模式,目前支持最高单连接500us连接间隔。demo应用中也有1k回报率鼠标例子应用。

2.1. 低延时从机配置

默认使用CONFIG_APP_MOUSE_LOW_LATENCY这个鼠标应用进行低延时模拟测试

  • 选择 hid 工程选择CONFIG_APP_MOUSE_LOW_LATENCY应用

apps/demo/hid/include/app_config.h

//app case 选择,只选1,要配置对应的board_config.h
#define CONFIG_APP_KEYBOARD                 //hid按键 ,default case
#define CONFIG_APP_KEYFOB                   0//自拍器,
#define CONFIG_APP_MOUSE_SINGLE             0//单模鼠标(ble) 需搭配CONFIG_BOARD_AW313A_MOUSE_SINGLE板级
#define CONFIG_APP_MOUSE_DUAL               0//三模鼠标(ble&2.4g&usb) 需搭配CONFIG_BOARD_AW313A_MOUSE板级
#define CONFIG_APP_MOUSE_LOW_LATENCY        1//低延时从机,高回报率测试,需搭配CONFIG_BOARD_AW313A_MOUSE板级
#define CONFIG_APP_KEYPAGE                  0//翻页器
#define CONFIG_APP_REMOTE_CONTROL           0//遥控器,需搭配CONFIG_BOARD_AW31A_RC板级
#define CONFIG_APP_IDLE                     0//IDLE

  • 选择对应板级

apps/demo/hid/board/bd47/board_config.h

// #define CONFIG_BOARD_AW31N_DEMO
// #define CONFIG_BOARD_AW31A_RC
// #define CONFIG_BOARD_AW313A_MOUSE_SINGLE
#define CONFIG_BOARD_AW313A_MOUSE
  • 打开低延时测试模式

apps/demo/hid/board/bd47/board_aw313a_mouse_cfg.h

#define LOW_CONNECT_INTERVAL_TEST      1
  • 如果是测试1ms双连接和500us单连接需要关闭加密功能

#define CONFIG_BT_SM_SUPPORT_ENABLE         0 //配置是否支持加密
  • 通信模式选择,ble or 2.4g,主从需要保持一致

apps/demo/hid/examples/mouse_low_latency/app_mouse_low_latency.h

//2.4G模式: 0---ble, 非0---2.4G配对码
//#define CFG_RF_24G_CODE_ID       (0xAF9A9357) //32bits,可用void access_addr_generate(u8 *aa);生成
#define CFG_RF_24G_CODE_ID       (0) //32bits

2.2. 低延时主机配置

默认使用transfer工程的dongle应用(CONFIG_APP_DONGLE)进行低延时测试

  • 选择 transfer 工程选择CONFIG_APP_DONGLE应用

apps/demo/transfer/include/app_config.h

//apps example 选择,只能选1个,要配置对应的board_config.h
#define CONFIG_APP_LE_TRANS               0 // LE's slave
#define CONFIG_APP_MULTI                  0 //BLE多机应用,支持2.4g code,支持4主,3主1从,2主2从...
#define CONFIG_APP_NONCONN_24G            0 //2.4G 非连接收发
#define CONFIG_APP_DONGLE                 1 //usb + 蓝牙(ble 主机),PC hid设备, 使用需要配置板级board_aw31n_dongle.h
#define CONFIG_APP_AT_CHAR_COM            0 //AT com 字符串格式命令
#define CONFIG_APP_IDLE                   0 // 空闲任务
  • 开启高回报率模式,根据需求配置速率

#elif CONFIG_APP_DONGLE
#define CONFIG_BLE_CONNECT_SLOT             1 //BLE高回报率设置, 支持私有协议,所有周期单位为us,适配1k回报率鼠标需要开此宏

#if CONFIG_BLE_CONNECT_SLOT
#define HIGH_REPORT_RATE_1MS                1   //1ms,support dual conn
#define HIGH_REPORT_RATE_2SLOT              0   //2slot,1.25ms,support dual conn
#define HIGH_REPORT_RATE_4SLOT              0   //4slot,2.5ms,support dual conn
#define HIGH_REPORT_RATE_500US              0   //500us,not support dual conn
#endif

#define CONFIG_BT_GATT_CLIENT_NUM          1 // range(1~2)
  • 如果是测试1ms双连接和500us单连接需要关闭加密功能

#define CONFIG_BT_SM_SUPPORT_ENABLE        0 //配置是否支持加密
  • 通信模式选择,ble or 2.4g,主从需要保持一致

apps/demo/transfer/examples/dongle/app_dongle.h

//2.4G模式: 0---ble, 非0---2.4G配对码
//#define CFG_RF_24G_CODE_ID       (0xAF9A9357) //32bits,可用void access_addr_generate(u8 *aa);生成
#define CFG_RF_24G_CODE_ID       (0) //32bits

2.3. 示例演示

完成连接后从机会自动发数,dongle收到后通过USB发数划正方形,可以使用Mouse Test软件测试低延时的鼠标回报率。

image-20241109161557212

Note

1、正常1ms和500us都会达到980+的回报率,并且500us的连接发数会更快,由于USB限制,500us回报率未能突破1k(ble通信为2k),可以使用分析仪查看连接间隔是否为500us;

2、dongle要使用USB方口线接入电脑,以使能USB功能,否则会影响蓝牙连接;

2.4. API说明

Note

目前低延时只适配了上述两个应用,如果开发者需要自行开发低延时应用,可以熟悉以下接口

CONFIG_BLE_CONNECT_SLOT:低延时高回报率宏需要打开

  • 从机端(以下两个接口为弱函数,需要自行在应用层覆盖写发数逻辑)

/* --------------------------------------------------------------------------*/
/**
 * @brief  库函数,蓝牙事件中断后会被调用一次
 *
 * @param  [in] priv_hw
 * @param  [in] link
 * @param  [in] hw_state
 * @param  [in] flag 能否压包标志
 * @return 0: 发送成功; 非0:发送失败
 * @note   用法参考app_mouse_dual.c
 */
/* ----------------------------------------------------------------------------*/
void ble_event_irq_hook(void *priv_hw, void *link, uint8_t hw_state, u8 flag);

/* --------------------------------------------------------------------------*/
/**
 * @brief  私有协议调用快速发数
 *
 * @param  [in] packet
 * @param  [in] len
 * @param  [in] tx_octets 发送申请的buffer
 * @return 0: 发送成功; 非0:发送失败
 * @note   用法参考app_mouse_dual.c
 */
/* ----------------------------------------------------------------------------*/
int hw_send_packet_fast(u16 att_handle, void *priv_hw, const u8 *packet, int len, int tx_octets, uint8_t hw_state);

连接前调用以下接口

/*************************************************************************************************/
/*!
 *  \brief      us 为单位连接  set 配置1开启 0关闭   如果要用这个功能 必须要统一配置
 */
/*************************************************************************************************/
#define ble_op_conn_us_unit(set)     \
	ble_user_cmd_prepare(BLE_CMD_US_UNIT, 1, set)

/*************************************************************************************************/
/*!
 *  \brief     获取是否配置了us为单位连接
 */
/*************************************************************************************************/
#define ble_op_is_us_unit(ptr)     \
	ble_user_cmd_prepare(BLE_CMD_GET_IS_US_UNIT, 1, ptr)

// 设置高回报率模式
ble_op_conn_us_unit(1);
ble_op_conn_init_2Mphy(1);
// 关闭more data
set_config_vendor_le_bb(VENDOR_BB_MD_CLOSE);

配置从机广播包,如果使能的是1拖2双连接模式,则需要将从机广播数据放在adv data中,不使用scan rsp


/*************************************************************************************************/
/*!
 *  \brief      生成adv包,放入buff
 *
 *  \param      [in]
 *
 *  \return
 *
 *  \note  1. 低延时模式下的1拖2应用(ble/2.4g), 广播数据需在adv data里填充, 不能填充在scan rsp里.
 *            避免蓝牙带宽被占用导致搜索不到scan rsp.
 */
/*************************************************************************************************/
static int hogp_make_set_adv_data(u8 adv_reconnect, u8 *adv_name_ok)
  • 主机端(下面两个接口为弱函数,需要自行在应用层覆盖写逻辑)

/* --------------------------------------------------------------------------*/
/**
 * @brief  库函数,使用私有协议连接后调用捕获蓝牙接收数据
 *
 * @param  [in] data
 * @param  [in] len
 * @return true释放rx buffer,false走原本协议栈流程
 * @note   用法参考ble_dg_central.c
 */
/* ----------------------------------------------------------------------------*/
bool ll_conn_rx_acl_hook_get(const uint8_t *const data, size_t len);

/*************************************************************************************************/
/*!
 *  \brief      1. 用于做低时延数据发送(适用于500us,1ms双连接流程),不开sm加密功能优先级高于ll_conn_rx_acl_hook_get,
                   return false则走ll_conn_rx_acl_hook_get流程
                2. 底层有事件触发后回调直接来上层拿数据发送,函数名不可修改,无需调用;
                3. 不可做耗时操作(需要在us级);
 *
 *  \param
 *
 *  \return
 *
 *  \note
 */
/*************************************************************************************************/
bool bb_le_rx_data_pdu_hook_get(void *priv, const u8 *data, u8 len)

连接前调用以下接口:

// 设置高回报率模式
ble_op_conn_us_unit(1);
ble_op_conn_init_2Mphy(1);
/*************************************************************************************************/
/*!
 *  \brief      us 为单位连接  set 配置1开启 0关闭   如果要用这个功能 必须要统一配置
 */
/*************************************************************************************************/
#define ble_op_conn_us_unit(set)     \
	ble_user_cmd_prepare(BLE_CMD_US_UNIT, 1, set)

/*************************************************************************************************/
/*!
 *  \brief     获取是否配置了us为单位连接
 */
/*************************************************************************************************/
#define ble_op_is_us_unit(ptr)     \
	ble_user_cmd_prepare(BLE_CMD_GET_IS_US_UNIT, 1, ptr)

2.5. 注意事项

  1. 低延时模式(ble/2.4g),主机端需要发起的连接间隔需要为1000(1k回报率)或500(2k回报率)

  2. 低延时模式(ble/2.4g),不管是单连接还是双连接,连接成功后从机都会主动发数据,不过该应用可以根据实际需求进行增删