一、概述
继上一篇 2.4G 模式封包格式的解析。本文我们先给大家介绍一下 2.4G 模式下如何实现一对一的配对以及需要注意的地方。
二、环境搭建
2.1 SDK 下载
本文基于 NXP QN9080 IC,SDK 可在NXP 官网 https://mcuxpresso.nxp.com 下载。
2.2 硬件
本文基于 QN9080 DK 板进行开发,DK 板如图 2.2 所示。
图 2.2
2.3 开发软件
SDK 支持 IAR、Keil、MCUXpreeso IDE 三种开发软件、本文以 IAR 为开发环境作为介绍。
三、工程介绍
在 SDK_2.2.0_QN908XCDK\boards\qn908xcdk\wireless_examples\genfsk\Connectivity_test 目录下的工程是描述 2.4G 的基本功能,这次将给大家介绍一下 2.4G 模式的配对方式,使得大家可以实现接收端以及发送端能够配套一对一,不至于出现设备混乱传输的情况。
3.1 配对流程
2.4G 模式如果不能做到一个 Mouse 对应一个 Dongle,那么当多个 Mouse 或者 Dongle 处于近距离时就会出现在同一个频道下传输的 Mouse 以及 Dongle 能够数据互换,导致数据乱窜,引出不必要的麻烦。因此这里向大家介绍一下如何实现 Mouse 和 Dongle 的一对一配对传输流程以及恢复通用配对流程。
2.4G 模式实现一对一的配对主要流程如下:
① 先给所有设备一个默认相同的 Access address 地址
② 当使用默认地址连接进行连接
③ 连接成功后 Tx 端发送信号去给 Rx 端,请求获取 Rx 端的唯一地址
④ Rx 端获取唯一地址,并且发送给 Tx 端
⑤ Tx 端接收 Rx 端的唯一地址并且成功后返回 ACK
⑥ Tx 端接收到 Rx 端的唯一码后将默认 Access address 地址进行替换
⑦ Rx 端接收到 Tx 的 ACK 后将默认 Access address 地址替换成自身的唯一码
2.4G 模式恢复使用默认 Access address 地址配对流程比较简单,只需要两端都将 Rx 端的唯一码替换成原本的默认的 Access address 地址就可以了。
这里给大家解释一下上述的 7 个步骤,首先 ① 和 ② 是由于发送的每一包数据都必须存在 Access address 地址,并且为了在生产时任意的 Mouse 以及 Dongle 都能进行配对,所以这里就先预设一个默认的 Access address 地址并且先使用默认值进行连接。③ 是因为 Rx 是被动方,并不知道 Tx 这个主动方想要做什么,因此 Tx 必须先发出相应的信号让 Rx 去做指定的事情。④ 和 ⑤ 是为了确认双方都知道传输 Access address 已经完成了,可以同步进行 Access address 的切换。⑥ 和 ⑦ 是为了确保两端真的已经完成 Access address 的传输才能开始切换,要不然一遍切换了,但是如果另一端没接收到 Access address 的话就会出现一直传输不成功的问题。
3.2 获取接收端唯一地址
在接收到 Tx 端的请求之后我们要怎么获取,其实这个比较简单,在 QN9080 之中是本身含有一个 IC 的唯一码,我们只需要获取到这个码就可以了,具体的获取方式可以参照图 3.2 -1。
图 3.2 - 1
其中的 0x210B0000 是基地址,而 0x210B0000 + 0x7FA 是用于存放蓝牙地址的,由于蓝牙地址是拥有唯一性,所以我们可以直接使用蓝牙地址当做我们 2.4G 的 Access address 地址。当然,由于通信的主动权在于 Tx,因此我们选择获取 Rx 端的唯一地址是比较方便的。
3.3 切换新地址
当 Rx 端获取到唯一码之后以及 Tx 端接收到 Rx 端发送过来的唯一码后需要怎么处理才能进行替换呢,下面给大家讲述一下。
切换新地址的步骤可以分为以下几步:
- 定义一个用于表示当前配对码状态的变量,并将变量值存于 NVDS 中
- 将获取到的 Rx 端的唯一码存储到 NVDS 中
- 将 Rx 端的唯一码赋值给原本的默认 Access address 地址
- 重新设置使能 Access address 地址
具体的编写方式可参考图 3.3 – 1。
图 3.3 – 1
如果是恢复回默认的 Access address 地址需要做的修改只是将相关的值进行替换并且重新写入 NVDS 就行了,具体可参考图 3.3 – 2。
图 3.3 - 2
此时我们只需要判断记录当前配对码状态的变量就能知道目前是需要用什么 Access address 地址去通信,这样也可以在每次上电时从 NVDS 中读出 Access address 去加载使能我们就可以直接使用,而不需要每次都去获取了。但是需要注意的是,在每一次切换了 Access address 后都必须重新使能,要不然新的地址将不会起作用。
3.4 读写 NVDS
对于上述的写 NVDS 以及读取 NVDS 操作,这里简单向读者介绍一下。
首先需要给你要存储的变量申请一个地址(可参考图 3.4 - 1)。
图 3.4 - 1
接下来的是调用读写 NVDS 的函数进行操作。
读 NVDS:uint8_t nvds_get(uint8_t tag, uint16_t *lengthPtr, uint8_t *buf);
写 NVDS:uint8_t nvds_put(uint8_t tag, nvds_tag_len_t length, uint8_t *buf);
经过上面的解析说明,相信大家都对于QN9080 SDK 2.4G 模式的配对方式已经有所了解了,后面将会给大家介绍一下如何在 SDK 中实现一个简单的鼠标。欢迎大家继续观看。
四、参考资料
[1] Device Class Definition for Human Interface Devices (HID)
评论