LE Data Length Extension

cc2640r2f,ble,mcu 2017-08-26 1455 次浏览 次点赞


概要

数据长度扩展( LE Data Length Extension )功能允许 LE 控制器在连接状态下发送高达 251 字节的 PDU,在连接期间的任何时刻,主从设备可以协商该 PDU 大小。

对比 BLE4.0/4.1 的控制器数据通道最大有效载荷为 27 字节,使能数据扩展功能后的 BLE4.2/BLE5.0 能够达到 251 ,数据速率提高了大约 2.5 倍。

I. 数据长度更新过程

一旦建立连接,控制器将以两种可能的方式之一进行操作:

提示:本文所有的提及默认 PDU/传输时间,均是指兼容 BLE4.0/4.1 的 27Byte/328us ,数据长度扩展( LE Data Length Extension )只被 BLE4.2/5.0 支持。
  • 如果在连接之前,PDU 大小和传输时间都被设置为默认值(即 TX 和 RX 都为 27B,328us),则 CC2640R2F 将不会发起数据长度交换命令(即 LL_LENGTH_REQ 不发送)。

    如果对等连接的主从设备发送 LL_LENGTH_REQ ,此时对等设备同样以默认大小 LL_LENGTH_RSP 回应。

  • 如果在连接之前,PDU 的大小和传输时间收发双方或者有一方不是默认值,则设备的 LE 控制器将使用 LL_LENGTH_REQLL_LENGTH_RSP 控制 PDU 协商,选择一个较大的 PDU 有效负载。

    数据长度更新可由 Host 发起或 Controller 自主执行,主机或从机可以启动该过程。

数据长度更新过程完成后,两个控制器都会根据两个参数选择新的数据长度:PDU 大小和传输时间,同时被主从设备支持的最大长度将会被选择。考虑到时间来支持不同的数据速率。这些参数定义如下:

  • PDU 大小

Controller 支持的最大应用数据有效载荷大小。该大小不包括数据包的其他固定开销,例如访问地址或前导码。

  • 时间

设备以 PHY 速率发送或接收 PDU 的最大微秒数。该参数使用微秒单位(us)。

注意:有关数据长度更新过程的更多信息,请参考蓝牙核心规范版本 5.0 的数据长度更新过程部分([Vol 6],B 部分,第 5.1.9 节)。

下表可以参考支持的最大时间和大小,CC2640R2F 支持这些最大值。

表1. 数据长度扩展支持的最大时间和大小

II. 初始值

BLE4.2/5.0 工程为了兼容B LE4.0/BLE4.1,默认的 TX PDU 设置为 27 字节,同时使用 328 作为最大传输时间。

在 RX PDU 上面,默认使能 LE Data Packet 功能,也就是默认支持接收 251,以及 RX PDU 最大传传输时间为 2120us。

为了最大吞吐量,诸如 BLE 主机的高层协议也应使用较大的 PDU 大小(请参见最大传输单元(MTU))。 下图 1 显示出了协议栈中的各种 PDU 大小。

图1. 协议栈中的各种 PDU 大小

注意:正如数据长度更新过程章节介绍过,

应用工程可以通过以下两种方式更新数据长度:

1. 直接初始化到最大值,每次建立连接后 Controller 会自动申请一个更大 PDU ;
2. Controller 可以设置默认的 PDU 大小和时间( 27byte/328us ),然后再建立连接时动态协商该值;

III. 数据长度扩展 HCI 命令和事件

以下 HCI 命令可用于与数据长度扩展功能相关的控制器交互:

  • LE 读取建议的默认数据长度命令( HCI_LE_ReadSuggestedDefaultDataLenCmd()
  • LE 写入建议的默认数据长度命令( HCI_LE_WriteSuggestedDefaultDataLenCmd()
  • LE 读取最大数据长度命令( HCI_LE_ReadMaxDataLenCmd()
  • LE 设置数据长度命令( HCI_LE_SetDataLenCmd()

以上命令可能会产生 LE 数据长度更改事件。

  • LE 数据长度更改事件( Data Length Change Event )

除了 Bluetooth SIG 定义的 HCI 命令之外,以下 TI Vendor Specific 命令还可以与数据长度扩展功能相关的控制器进行交互:

  • HCI_EXT_SetMaxDataLenCmd

在连接后设置包长度

初始值章节已经讲解过,为了兼容 BLE4.0/4.1 设备,默认传输的 TX PDU 设置为 27字节/328us,Controller 会在设备连接之初,共同协商一个的数值。如果要禁止该功能,可以将以下代码段放入应用工程的初始化话阶段(例如 simple_peripheral_init )

    #define APP_TX_PDU_SIZE 27 
    #define APP_RX_PDU_SIZE 27 
    #define APP_TX_TIME 328 
    #define APP_RX_TIME 328
    
    //这个 API 记录在 hci.h 
    HCI_EXT_SetMaxDataLenCmd (APP_TX_PDU_SIZE  ,  APP_TX_TIME ,
       APP_RX_PDU_SIZE , APP_RX_TIME )中。

一旦建立了连接,Controller 对等的主从设备协商数据包大小。如果两个设备都设置为使用数据长度扩展,可以直接观察到吞吐量提高。

如果需要重新使能连接建立之初的自动协商功能,只需使用上述相同的命令调整值即可。使用代码段搜所示。

否则控制器将拒绝此调用。除了 TI Vendor Specific 命令外,还可以使用蓝牙 SIG HCI 命令,如下所示:

    #define APP_SUGGESTED_PDU_SIZE 251 
    #define APP_SUGGESTED_TX_TIME 2120
    
    //这个 API 记录在 hci.h 中
    HCI_LE_WriteSuggestedDefaultDataLenCmd (APP_SUGGESTED_PDU_SIZE  ,
    APP_SUGGESTED_TX_TIME )
    
    HCI_LE_WriteSuggestedDefaultDataLenCmd()仅改变发送端的PDU大小和时间。

IV. 在连接中设置包长度

也可以使用以下 API 代码片段在连接中动态更改数据包长度。应用程序可以根据任何逻辑(如传感器数据或按钮按下)确定何时发生。

    uint16_t cxnHandle; //Request max supported size
    uint16_t requestedPDUSize = 251;
    uint16_t requestedTxTime = 2120;
    
    GAPRole_GetParameter(GAPROLE_CONNHANDLE, &cxnHandle); //This API is documented in hci.h
    
    if (SUCCESS != HCI_LE_SetDataLenCmd(cxnHandle, requestedPDUSize, requestedTxTime))
       DISPLAY_WRITE_STRING("Data length update failed", LCD_PAGE0);

V. 加入我们

文章所有代码、工具、文档开源。加入我们QQ群 591679055获取更多支持,共同研究CC2640R2F&BLE5.0。

CC2640R2F&BLE5.0-乐控畅联 © Copyright 2017, 成都乐控畅联科技有限公司.


本文由 Jay 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处,点赞1

还不快抢沙发

添加新评论