如何解读蓝牙 HCI 数据

关键字 :BLEQN9080HCI
  • 概述

在 BLE 的开发过程中,相信大家都会过 FCC/CE 认证的,在过 FCC/CE 的过程中,在这个过程中我们通常会烧录一个开放了 HCI 功能的代码给认证机构用于进行测试。在今天我们就来聊聊这个 HCI 是什么的一个东西。

  • 功能描述

HCI 的全称是 Host Control Interface(主机控制接口),是蓝牙联盟定义规范的蓝牙协议层中的其中一层,如下图所示:


主要是作为 Host 部分与 Controller 部分进行沟通的一个桥梁,其中 HCI 支持的通讯方式有:General UART、Three-Wire UART、USB、Secure Digital(SD) 这四种方式,如下图所示

在一个完整的 Soc 中,例如我们现在使用的 QN9080 中 SDK 已经包含有整个 BLE 协议栈(Host 部分以及 Controller 部分),如果有一天我们“突发奇想”用 QN9080 Controller 部分,然后用其他的 MCU 来实现 Controller 部分的话,我们就可以将 QN9080 设成 HCI 模式,然后用其他 MCU 通过 Uart,SD,USB 连接到 QN9080 中,这样也可以完成 BLE 的完整功能。以上就是一个对 HCI 的简单通俗描述,其中想要了解更加详实的话,可以参考蓝牙核心规范,例如 Core V5.3 Vol4 :Host Controller Interface,其中不同版本具体位置会有差异。

  • 数据分析。

我们现在就以 QN9080 的产测流程为例来简单讲解一下我们如何来分析 HCI 数据。关于 QN9080 的产测流程描述可以参考原厂文档 AN11942 QN90xx TEST Commands of the Host Controller Interface

接下来,我们就截取里面其中一部分的流程出来分析一下,例如下图


其中这一段的流程就是上位机(电脑)通过串口发送到 QN9080 中,让其发射特定数据。上位机发送的第一个数据 01 1E 20 03 00 25 00,虽然文档中已经说明这个是 LE Transmitter Test Command,但是我们这么求真的人肯定是会深究的嘛,接下来我们就将这个 Command 拆分来细细分析一下:

首先,01 是代表这个段数据包是一个 HCI Command Packet,你问我为什么知道?在蓝牙核心规范 Vol 4 Part A Section 2Protocol中就有详细的定义了,目前蓝牙联盟定义了 5 种 HCI 数据类型,如下图所示:

我们确定了这段 HCI 数据为 Command Packet,接下来我们就在核心规范 Vol 4 Part E Section 5.4 中找到对应的 HCI Command Packet 的数据格式是怎么样。如下图所示:


在找到了 data formats 之后,我们就能将这个 Command 进行拆解了

01 1E 20 03 00 25 00 拆分如下:

01:HCI Command Packet;

1E 20:Opcode;

03:Parameter Total Length

00 25 00 :Parameter

其中,1E 20 为 Opcode,其中 Opcode 拆分如下:



低 10 bits 为 OCF(Opcode Command Filed),高 6 bits 为 OGF(Opcode Group Filed),蓝牙联盟将所有的 HCI Command 分成几个大类,其中不同的OGF数据就代表不同的数据类型,例如关于 Informational Parameters Command 的 OGF 就是 0x04,其中同一种类型 Command 中的不同指令就根据 OCF 来查询,通俗来说 OGF 就是组编号,OCF 就是组内的个人编号。

根据 Section 5.2 中提到,其中传输的数据都是以小端格式进行排列的,所以我们重新将 Opcode 进行调换,就是为 0x201E。



我们现在将 0x201E 转换为二进制就是 0B0010 0000 0001 1110,高 6 bits 是 0x08,低 10 bits 为 0x1E,我们先找到 OGF 为 0x04 的定义在 Vol 4 Part E Section 7.8,关于 BLE 的控制命令(LE Controller Command)都是归在 0x08 中,接着在这个章节中找到关于 OCF 为 0x1E 的 Command 定义在 Vol 4 Part E Section 7.8.29 中:



我们根据这个表格可以看到,Parameters 中有三个,所以 00 25 00 就分别对应里面的 TX_Channel,Test_Data_Length,Packet_Payload,接下来我们在看看这几个参数的定义数据,如下图:



所以,这个 00 25 00 的意思就是:频率为2402 MHz,测试数据长度为 37(0x25) Bytes,填充的数据类型为 PRBS9。

我们看到表格最后还有一列是 Return Parameters,这一列的表示下发了这个 Command 之后,Controller 层针对这个 Command 回复的事件里需要包含哪一些参数,具体细节我们下一章节再来细谈。

在分段进行分析之后,我们现在就来总结一下这个 Command 具体代表这个是 LE Transmitter Test Command,频率为 2042MHz,填充数据为 37Bytes 的 PRBS9 格式数据。

在分析完了 Command 的具体格式之后,我们接下来就一鼓作气分析完设备返回的 HCI 数据 04 0E 04 0B 1E 20 00 吧。

首先,我们查到 0x04 是代表着这个 HCI 类型为 HCI Event Packet。然后我们再来找到 HCI Event Packet 的Data Format,如下图所示:


这个时候我们就能将 04 0E 04 0B 1E 20 00 进行数据拆分了,如下所示:

04 :HCI Event Packet

0E :Event Code

04 :Parameter Total Length

0B 1E 20 00 :Event Parameter 0

在拆分之后,我们可以在 Vol4 Part E Section 7.7.14 中找到 Event Code 0x0E 的定义:


接下来再来分析 Event Parameters 的定义:



所以 0B 1E 20 00 可以拆分为:

0x0B : Num HCI Command Packets

0x201E : Command Opcode,即为上面的 LE Transmitter Test Command

0x00 : Return Parameters,这个就是上面分析 Command时所提及的 Status。


所以综上所述,这个返回的 HCI 数据是一个 HCI Event Packet,事件为收到了 0x2E10 的 Command,状态为指令运行成功。

  • 总结

在上面一个章节中,我们针对了两个 HCI 数据简单的分析了一下 HCI Command Packet 以及 HCI Event Packet 这两个类型的数据分析,同理的,在遇到其他几个 HCI 类型的数据时,也可以按照上面的思路在核心规范 Vol4 Part E 中按图索骥对数据进行拆分,然后在逐步分析出具体含义。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论