基于NXP QN9080 BLE 框架浅谈(二)

  • 前言

从上次的 BLE 框架浅谈之后,这次笔者要推出 BLE 框架第二部分了。BLE 部分的内容相当丰富,不可能在短时间内熟练掌握整个框架。以下部分主要涉及 BLE 框架中连接建立

过程,以及数据包的发送、接收。本文以 NXP QN9080 平台为例子给大家进行讲解。

  • 环境搭建

2.1 SDK 及软件下载

本文基于 NXP QN9080 IC,SDK 和软件可在 NXP 官网 https://mcuxpresso.nxp.com 下载。

2.2 硬件

本文基于 QN9080 官方板进行开发,官方板如图 2.2 所示:

图 2.2

  • 开发软件

SDK 支持 IAR、Keil、MCUXpreeso IDE 三种开发软件、本文以 IAR 为开发环境作为介绍。

 

  • BLE 建立连接过程

 在浏览本文之前,我们需要先了解 BLE 协议栈的工作原理,以及每一层具体是干什么的,为什么这么分层等。可以参考我前面的基于 NXP QN9080 BLE 框架浅谈(一)

进行一个初步的学习和了解。

下面我以如何发送一个数据包为例并用理论的方式去解释 BLE 协议栈各层是如何紧密配合,以完成发送任务的。

假设有设备 A 和设备 B ,设备 A 为鼠标外设,设备 B 为电脑,设备 A 要把鼠标左键值(十六进制表示成 0x01)发送给设备 B,该如何实现这个过程呢?作为一个开发者,

当然是希望越简单越好,能够简单到单纯调用一个 API 就能够实现这个过程,比如 Send_Value(0x01),API 中所用到的所有函数通过 BLE 协议栈来完成。实际上我们所

用到的蓝牙芯片就是有这样设计好的 BLE 协议栈。开发者只需去调用这个 API 赋值就可以把数据发送出去了,其余的事情BLE协议栈会进行处理。很多人会简单地认为,

BLE 协议栈是不是直接在物理层就把 0X53 发出去了,如下图:

这种方式看起来很简便,但是还有很多细节需要考虑,实际上是不可行的。首先,BLE 是有多个不同的射频信道的,这个 API 没有考虑到用哪个射频信道来进行传输。

在不更改 API 的情况下,我们需要对协议栈进行分层处理,为此引入 LL 层,LL 层作用在具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把

数据包发送出去,怎么保证数据的完整性,ACK 如何接收,如何进行重传,以及如何对链路进行管理和控制等等。在原有 API 基础上,我们再去调用一个信道频率 API

去进行传输信道的选择,例如 2402M 。但是,进行上述操作之后设备 B 还不能辨别这个数据包是发给谁的。在此,BLE 会引入 access address 概念,用来指明接收者

身份。这个访问地址比较特殊,它表示要发给周边所有设备,即广播方式。如果你要实现一对一的通信,即称作连接,设备 A 的数据包只能被设备B接收,同样设备B的

数据只能被设备 A 接收,那么必须生成一个随机的访问地址来标识设备 A、B 之间的连接。下图中,代码部分是扫描和广播的数据部分,存放于 app_config.c 头文件中

,红框部分第一行是广播类型,第二行是数据长度,第三行是数据,即为设备 B 中扫描广播所发现的设备 A 广播名称。这个名称是可以按照自身需求去修改的。

下图为设备 A 广播名称:NXP_HOD

连接成功之后,设备 A 连接名称为:Rambo_Mouse




下图红框中,“11”表示名称长度(包含下划线),“Rambo_Mouse”为设备连接名称。

 

下面我们来了解一下简单的广播情况,我们把设备 A 叫 Advertiser(广播者),设备 B 叫 Scanning(扫描者)。前面我们所说到的广播状态下 API 将变成

Send_Value(0x01,信道频率,访问地址),由于设备 B 作为扫描者会接收到很多设备的广播,因此数据包中还需包含设备 A 的设备地址来确认该广播包

是来自设备 A 的。LL 层还需要一件重要的事:检查数据的完整性,即数据在传输过程中有没有发生改变,这个校验位对于 2.4G 通信来说也是同样重要的。

为此,NXP QN9080 引入了 CRC24 对数据包进行校验。

QN9080 的用户手册中,对 CRC 校验位的使用有非常详细的讲解。

在上述的数据包中,我们还需要讨论如下问题:

  • 数据包并有被分类组织:即是设备 B 无法找到自己想要的数据 0x01,为此我们需要在访问地址之后加上 LL 层 header 和长度字节,用来表明数据包的 LL 类型以及指明长度。
  • 设备 B 何时开启射频窗口以接收空中数据包:

LL 层必须定义通信时序。情况如下:

情况 ① :设备 A 数据包传输至空中,设备 B 把接收窗口关闭,此时通信失败。

情况 ②:当设备 A 没有在空中发送数据包时,设备 B 把接收窗口打开,此时通信也将失败。

情况 ③:设备 A 的数据包在空中传输,设备 B 刚好打开射频接收窗口,此时通信才能成功。

3、当设备 B 拿到数据之后,该如何解析这个数据呢?此时应当引入 GAP 层,这是 GAP 的本职工作,GAP 层从数据长度、数据类型、以及数据结构上来定义数据,

这部分也取决于广播包的大小,它能定义的数据类型极其有限。

  • BLE 连接方式

连接在理解层面上可以类比有线串口通信 UART,容易理解,可用 TXD、RXD 把设备 A、B 连接起来,即为连接。重要的是“同步通信”的概念,所谓建立蓝牙连接,

就是让设备 A、B 两者进行一对一同步成功:

具体如下:

  • 设备 A、B 使用相同的物理信道,保持一致性。
  • 设备 A、B 双方时间原点保持相同,为同一点。
  • 设备 A、B 两者时钟同步成功,双方的通讯协议指明对方什么时候发送和接收数据包。
  • 连接成功后,通信过程如下图:

 

 

通过以上学习,我们对 BLE 协议栈实现有了进一步的理解,这部分比较偏向于协议栈底层的东西,对于开发者而言,最重要的还是对 BLE 协议栈的使用,

根及实际,如何去开发一个 BLE 应用等。后续我还会给大家推出更多关于 BLE 、鼠标、键盘方面的博文,扩大大家的知识面,欢迎订阅关注我的博文。

 

  • 参考资料

【1】《 QN908x user manual 》

【2】 深入浅出理解 BLE 协议栈

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

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

评论