0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何解决zigbee&BLE 模块最大的不足

AGk5_ZLG_zhiyua 来源:未知 作者:刘勇 2017-12-06 06:30 次阅读

第九章为BLE&zigbee 无线模块,本文内容为9.1 BLE 核心板。

本章导读

市面上现有zigbee&BLE 模块最大的不足就是不能很好地支持用户进行二次开发,即便某些模块能够实现二次开发,却因为不具备完整的软硬件生态链和稳定可靠的组网协议软件。因此用户还需要花很多时间学习与zigbee&BLE 相关的知识,非得将自己培养成通晓zigbee&BLE 技术的专家,才有可能开发出稳定且具有竞争力的产品

其实,人与人之间的差别不在于知识和经验,而是思维方面的差异决定了每个人的未来。虽然大多数开发者都很勤奋,但其奋斗目标不是企业和个人收益最大化,而是以学习与MCU和zigbee&BLE 相关的非核心域技术为乐趣。不愿意与市场人员和用户交流,不注重提升个人挖掘用户需求的创造力,还为自己的错误行为贴上高大上的标签——一切都在掌握之中。

事实上,每个人不可能做到面面俱全,你只是自己所在领域的专家,所以不要将精力用错了地方。以至于很多人在辛辛苦苦奋斗十多年之后,还是找不到失败的原因时,只是表面地叹息自己怀才不遇,甚至将失败的责任推给他人。这种落后的开发思维,导致很多企业无法开发出具有行业领先地位产品。

基于此,ZLG 推出了各种功能的MCU+zigbee或BLE 模块,MCU 包括M0+、M4、ARM9、A7 和A8 内核,支持AMetal 和AWorks 平台。

9.1 BLE 核心板

>>> 9.1.1 产品简介

AW824BPTBLE 核心板是广州致远电子有限公司基于NXP蓝牙4.0 BLE 芯片和MCU芯片LPC824 开发的,一款低功耗、高性能,支持二次开发的蓝牙4.0 BLE 模块。其中的LPC824 是基于ARM® Cortex®-M0+内核设计的32 位处理器,30MHz 主频,32KB 片内Flash 和8KB 片内SRAM,支持4 种低功耗模式。

如图9.1 所示的AW824PBT 核心板采用外置天线的封装、通过半孔工艺将I/O 引出,帮助客户绕过繁琐的射频硬件设计、开发与生产,加快产品上市。

图9.1 AW824BPT 实物图

完善的软件开发平台可满足快速开发需求,减少软件投入,缩短研发周期。该模块方便迅速桥接电子产品智能移动设备,可广泛应用于有此需求的各种电子设备,如仪器仪表、健康医疗、智能家居、运动计量、汽车电子和休闲玩具等。

1. 产品特征

  • 32 位ARM® Cortex®-M0+内核处理LPC824,32KB 片内Flash,8KB 片内SRAM;

  • 3 路USART(可分配给任意I/O 管脚),4 路I2C,2 路SPI,12 路ADC,6 路PWM;

  • 支持主从模式,主机最多连接8 个从机;

  • 高达50kbps 数据传输速率,支持蓝牙4.0;

  • 宽工作电压2.4~3.6V;

  • 接收灵敏度:-93dBm;

  • 发射功率:-20dbm~4dbm,通过AT 指令可调;

  • 天线类型:外置天线。

AW824BPT 模块相关参数详见表9.1。

表9.1 选型表

2. 硬件描述

AW824BPT 无线核心模块默认运行在桥接模式(透传模式)下,模块启动后会自动进行广播,已打开特定 APP 的手机会对其进行扫描和对接,连接成功之后就可以通过 BLE 在模块和手机之间进行数据传输。

在桥接模式下,用户MCU 可以通过模块的通用串口和移动设备进行双向通讯;用户也可以通过特定的串口AT 指令,对某些通讯参数进行修改,比如,串口波特率、广播周期等。AW824BPT 的引脚分布详见图9.2,引脚说明详见表9.2。

表9.2 AW824BPT 引脚说明

图9.2 AW824BPT 引脚分布

为了便于快速开发,在AW824BPT 内部,已经固定的将LPC824 的一些引脚(PIO0_16、PIO0_24 ~ PIO0_28)与AW824BPT 中的蓝牙模块相连接,示意图详见图9.3。

图9.3 LPC824 与蓝牙模块连接示意图

蓝牙模块相关的引脚有7 个,但其中5 个引脚已经在AW824BPT 内部与LPC824 连接,另外两个引脚BLE_LKSLP 和BLE_LKCON 作为蓝牙模块的输出信号,直接通过AW824BPT 的1、2 脚引出。蓝牙模块的相关引脚简介详见表9.3。

表9.3 蓝牙模块引脚功能描述

特别注意,LPC824 的PIO0_26 和PIO0_27 与蓝牙模块的串口相连,当使用AW824BPT进行二次开发时,需要将LPC824 的PIO0_26 配置为串口TX 功能,PIO0_27 配置为串口的RX 功能。

>>> 9.1.2 协议说明

AW824BPT 中包含蓝牙模块,AW824BPT 可以快捷的与其它BLE 设备(如手机)之间进行双向数据通讯。在BLE 的连接过程中,AW824BPT 是从机设备,与之连接的其它BLE设备(如手机)是主机设备。

为叙述方便,后文描述时,均假定与AW824BPT 连接的主机设备为手机端。由于BLE属于蓝牙4.0 的范畴,因此要求手机的蓝牙模块是4.0 以上的版本。iPhone4S 及后续版本的苹果手机都支持;Android 手机则需要4.3.1 以上的版本才能够支持。

AW824BPT 中蓝牙模块发送数据的速率理论可达5.5K byte/s,速率主要与BLE 的连接间隔相关,若 BLE 连接间隔较短,则速率较高,平均功耗也较高;反之,若BLE 连接间隔较长,则数据传输的速率会降低,但同样平均功耗也会降低。蓝牙模块的BLE 连接间隔默认值为20ms(最小值),可以使用接口函数对其进行修改,最大支持2000ms。

每个连接间隔最多传输110 个字节的数据,若连接间隔为T(单位:ms),那么每秒最高传输速率 V(单位:byte/s)为:V =110*1000 /T (byte s),式中乘以 1000 是由于 T 的单位为ms。显然,T 值越小,数据传输速率越高,当T 为最小值20ms 时,可得到最高传输速率为:

当然,这只是理论值,实际测试表明,转发速率在4K 以下,丢包率很低,高于4K 时,丢包率将有所提高。但是为了安全起见,无论是低速或者高速转发大数据量应用时,都建议在上层做校验重传处理。

使用蓝牙进行数据传输是双向的。对于AW824BPT 发送数据至手机端,其流程是首先通过LPC824 的串口发送数据至蓝牙模块,然后蓝牙模块通过BLE 将数据转发至手机端。这就存在一个速率匹配的问题。若串口传输速率高于BLE 传输速率。则数据通过串口发送至蓝牙模块的速率高,而通过BLE 转发数据的速率低,若数据不间断传输,则会导致蓝牙模块内部200 字节的缓冲区很快被填满,使得后续数据不得不丢弃,这种情况下,LPC824通过串口每发送200 字节数据至蓝牙模块后,均需要延时一段时间,以确保下次发送数据前,蓝牙模块已经通过BLE 完成对数据的转发,内部有可用空间用于装载新的数据。

同理,对于手机端发送数据至主控AW824BPT,其流程是首先手机端通过BLE 发送数据至蓝牙模块,然后蓝牙模块通过串口将数据发送至LPC824。若串口传输速率低于BLE 传输速率。则数据通过BLE 发送至ZLG9021 的速率高,而通过串口转发数据的速率低,也将导致传输速率的不匹配。

最理想的情况就是,串口波特率与BLE 数据传输速率刚好匹配,发送至蓝牙模块一个数据的时间与BLE 转发一个数据的时间恰好相等,这样的话,就不存在速率不匹配的问题了。若BLE 的传输速率为5.5K,则平均传输一个数据的时间为:

若串口波特率为baudrate,由于串口使用格式为1 位起始位、8 位数据位、无校验位、1位停止位。因此发送一个字节数据大约需要传输10 位的时间。即:

UART 传输速率与BLE 传输速率恰好相等,可以得出:

由此可见,当BLE 传输速率为5.5K 时,串口波特率为55556 时,可以达到速率匹配。若波特率高于此值,则UART 传输速率高于BLE 传输速率。若波特率低于此值,则UART传输速率低于BLE 传输速率。

实际上,蓝牙模块的UART 只支持常见的波特率:4800、9600、19200、38400、57600、115200。因此,若使用AW824BPT 主要是用于发送大数据至手机端,则UART 传输速率应该低于BLE 传输速率,此时,波特率设置为38400 较为合适。若使用AW824BPT 主要用于接收来自手机端的大数据,则UART 传输速率应该高于BLE 传输速率,此时,波特率设置为57600 较为合适。一般地,若双方都有大数据传输,则确保每发送200 字节数据之间存在一定的时间间隔(30 ~ 60ms)即可。

>>> 9.1.3 蓝牙模块初始化

AMetal 已经支持AW824BPT 中的蓝牙模块,提供了相应的驱动,可以直接使用相应的API 完成蓝牙模块的配置及数据的收发,用户无需关心底层的通信协议,即可快速使用AW824BPT 进行BLE 数据通信。使用其它各功能函数前必须先完成初始化,初始化函数的原型(am_zlg9021.h)为:

其中,p_dev 为指向am_zlg9021_dev_t 类型实例的指针,p_devinfo 为指向am_zlg9021_devinfo_t 类型实例信息的指针。

注,AW824BPT 中的蓝牙模块为ZLG9021,因此,接口使用zlg9021 作为蓝牙模块驱动的命名空间。对于用户来讲,只需要使用接口进行蓝牙相关的操作即可,无需关心具体使用的何种蓝牙模块。

  • 实例

定义am_zlg9021_dev_t 类型(am_zlg9021.h)实例如下:

其中,g_zlg9021_dev 为用户自定义的实例,其地址作为p_dev 的实参传递。

  • 实例信息

实例信息主要描述了与ZLG9021 通信时,与引脚、UART 波特率、缓冲区等相关的信息。其类型am_zlg9021_devinfo_t 的定义(am_zlg9021.h)如下:

其中,pin_en、pin_brts、pin_rst、pin_restore 分别表示LPC824 与蓝牙模块对应功能引脚相连接的引脚号,通过图9.3 可知,pin_en 与PIO0_16 连接,pin_brts 与PIO0_25 连接,pin_rst 与PIO0_28 连接。RESTORE 引脚用于恢复出厂设置,AW824BPT 未使用该引脚,pin_restore 的值设置为-1 即可。

baudrate 表示UART 使用的波特率,ZLG9021 出厂默认波特率为9600,对于出厂设置的模块,该值必须设置为9600。初始化完成后,后续可以使用ZLG9021 控制函数修改波特率(支持的波特率有:4800、9600、19200、38400、57600、115200)。若修改了波特率,则必须确保下次调用初始化函数时,实例信息中baudrate 的值为修改后的波特率值。

为了提高数据处理的效率和确保接收数据不会因为正在处理事务而丢失。UART 发送和接收都需要一个缓冲区,用于缓存数据,缓冲区的实际大小由用户根据实际情况确定,建议在64 字节以上,一般设置为128 字节。p_uart_rxbuf 和rxbuf_size 描述了接收缓冲区的首地址和大小,p_uart_txbuf 和txbuf_size 描述了发送缓冲区的首地址和大小。如分别定义大小为128 字节的缓冲区供发送和接收使用,定义如下:

其中,g_zlg9021_uart_txbuf[128]为用户自定义的数组空间,供发送使用,充当发送缓冲区,其地址(数组名g_zlg9021_uart_txbuf 或首元素地址&g_zlg9021_uart_txbuf[0])作为实例信息中p_uart_txbuf 成员的值,数组大小(这里为128)作为实例信息中txbuf_size 成员的值。同理,g_zlg9021_uart_rxbuf[128]充当接收缓冲区,其地址作为实例信息中p_uart_rxbuf成员的值,数组大小作为实例信息中rxbuf_size 成员的值。

基于以上信息,实例信息可以定义如下:

其中,g_zlg9021_devinfo 为用户自定义的实例信息,其地址作为p_devinfo 的实参传递。

  • UART 句柄uart_handle

若使用LPC824 的USART2 与ZLG9021 通信,则UART 句柄可以通过LPC82x 的USART1 实例初始化函数am_lpc82x_usart2_inst_init()获得。即:

获得的UART 句柄即可直接作为uart_handle 的实参传递。

  • 实例句柄

ZLG9021 初始化函数am_zlg9021_init()的返回值即为ZLG9021 实例的句柄。该句柄将作为其它功能接口函数的handle 参数的实参。

其类型am_zlg9021_handle_t(am_zlg9021.h)定义如下:

若返回值为NULL,说明初始化失败;若返回值不为NULL,说明返回了一个有效的handle。基于模块化编程思想,将初始化相关的实例、实例信息等的定义存放到ZLG9021的配置文件(am_hwconf_zlg9021.c)中,通过头文件(am_hwconf_zlg9021.h)引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单9.1 和程序清单9.2。

程序清单9.1 ZLG9021 实例初始化函数实现(am_hwconf_zlg9021.c)

程序清单9.2 ZLG9021 实例初始化函数声明(am_hwconf_zlg9021.h)

后续只需要使用无参数的实例初始化函数即可获取到ZLG9021 的实例句柄。即:

>>> 9.1.4 蓝牙模块控制接口

ZLG9021 控制接口用于控制ZLG9021,完成所有与ZLG9021 相关的控制,如参数设置、参数获取、软件复位等。其函数原型(am_zlg9021.h)为:

其中,cmd 用于指定控制命令,不同的命令对应不同的操作。p_arg 为与命令对应的参数。当命令不同时,对应p_arg 的类型可能不同,因此,这里p_arg 使用的类型为 void *,其实际类型应该与命令指定的类型一致。常见命令(am_zlg9021.h)及命令对应的p_arg 类型详见表9.4。

表9.4 支持的命令及命令对应的p_arg 类型

有些命令无需参数(表中p_arg 类型标识为“—”),如复位模块命令。此时,调用am_zlg9021_ioctl ()函数时,只需将p_arg 的值设置为NULL 即可。带“*”的类型表示指针类型。若函数返回值为AM_OK,表示操作成功,否则表示操作失败。

虽然控制命令较多,看似使用起来较为复杂,但由于在绝大部分应用场合下,默认值即可正常工作,因此,若无特殊需求,可以直接使用读写数据接口完成“透传数据”的发送和接收。一般地,也仅可能使用少量命令完成一些特殊应用需求。下面详细介绍各个命令的使用方法。

1. 设置/获取BLE 连接间隔

模块与手机相连时,会定时进行同步,保证手机与模块一直处于连接状态,且数据交互操作也是在同步的时候进行的。若 BLE 连接间隔较短,则速率较高,平均功耗也教高;反之,若BLE 连接间隔较长,则数据传输的速率会降低,但同样平均功耗也会降低。

连接间隔的单位为ms,有效值有:20、50、100、200、300、400、500、1000、1500、2000,出厂默认值为20,即最小时间间隔。

如设置连接间隔为50ms,范例程序详见程序清单9.3。注意,设置连接间隔后掉电会丢失,并且连接间隔的修改只有在重新连接后才生效。

程序清单9.3 设置BLE 连接间隔范例程序

连接间隔设置成功与否主要取决于手机端对连接间隔的限制。不同手机的实际连接间隔也可能不同,如魅族手机的实际连接间隔会比设定值少25%左右;iPhone 手机在连接时均是先以30ms 间隔运行1 分钟,然后切换成设定值。

可以通过命令获取当前的连接间隔,范例程序详见程序清单9.4。

程序清单9.4 获取BLE 连接间隔范例程序

程序执行结束后,interval_ms 的值即为当前使用的连接间隔。若使用程序清单9.3 所示的代码修改了时间间隔,则此处获取的值应该为50。

2. 模块重命名/获取模块名

模块名即手机端发现ZLG9021 时,显示的ZLG9021 模块的名字。模块名限定在15 字节以内。如修改模块名为“ZLGBLE”,范例程序详见程序清单9.5。注意,修改模块名后,掉电不会丢失。

程序清单9.5 模块重命名范例程序

修改模块名为“ZLGBLE”后,手机端发现ZLG9021 时,将显示其名字为“ZLGBLE”。显然,当使用ZLG9021 开发实际产品时,在同一应用场合,可能存在多个ZLG9021 模块,若全部命名为“ZLGBLE”,将不容易区分具体的ZLG9021 模块。此时,可以使用自动添加MAC 后缀的模块重命名命令,使用方法与AM_ZLG9021_RENAME 相同,范例程序详见程序清单9.6。

程序清单9.6 模块重命名(自动添加MAC 后缀)范例程序

使用该命令修改模块名后,会自动添加6 个字符(MAC 地址后3 个字节的Hex 码),若ZLG9021 模块的MAC 地址为:08:7C:BE:CA:A5:5E,则重命名后,ZLG9021 的模块名被设置为“ZLGBLECAA55E”。可以通过命令获取当前的模块名,范例程序详见程序清单9.7。

程序清单9.7 获取ZLG9021 模块名范例程序

程序中,由于模块名的最大长度为15 字符,为了存放'',需将存储模块名的缓冲区大小设置为16。程序执行结束后,name 中即存放了ZLG9021 的模块名。

3. 设置/获取波特率

ZLG9021 支持的波特率有4800、9600、19200、38400、57600、115200。在大数据传输时,由于BLE 数据转发速率有限,为了数据可靠稳定传输,建议将波特率设置为38400 及以下。如设置波特率为38400,范例程序详见程序清单9.8。注意,修改波特率后,掉电不会丢失。

程序清单9.8 波特率修改范例程序

设置成功后,会在2 秒后启用新的波特率,因此,建议修改波特率成功2 秒后,再进行传输数据或其他命令操作。由于设置波特率后,掉电不会丢失。因此,下次启动时,将直接使用修改后的波特率。这就要求修改波特率后,在下次启动调用初始化函数初始化ZLG9021时,需确保实例信息中波特率(baudrate)的值为修改后的值(如:38400)。

可以通过命令获取当前使用的波特率,范例程序详见程序清单9.9。

程序清单9.9 获取模块使用的波特率范例程序

程序执行结束后,baudrate 的值即为当前使用的波特率。若使用程序清单9.8 所示的代码修改了波特率,则此处获取的值应该为38400。

4. 获取ZLG9021 的MAC 地址

应用程序可以使用命令直接获取ZLG9021 的MAC 地址,获取的值为字符串,范例程序详见程序清单9.10。

程序清单9.10 获取MAC 地址范例程序

程序中,由于MAC 字符串的长度为12(MAC 地址为48 位,数值需要6 个字节表示,每个字节的16 进制对应的字符串为两个字符),为了存放'',需将存储MAC 字符串的缓冲区大小设置为13。程序执行结束后,mac 中即存放了ZLG9021 的mac 字符串。

若ZLG9021 模块的MAC 地址为:08:7C:BE:CA:A5:5E,则对应的MAC 字符串为“087CBECAA55E”。

5. 复位模块

可以使用复位命令对ZLG9021 进行一次软件复位,程序范例详见程序清单9.11。

程序清单9.11 复位模块范例程序

6. 设置/获取BLE 广播周期

当使能ZLG9021 模块后(EN 引脚设置为低电平时),ZLG9021 将以广播周期为时间间隔,广播自身信息,以便被手机端发现,直到与手机端连接成功。广播周期越短,ZLG9021被发现的速度越快,进而可以更快的建立连接,但其平均功耗也会更高;反之,广播周期越长,被发现的速率就越慢,建立连接的过程就更长,但平均功耗会更低。

BLE 的广播周期单位为ms,有效值有:200、500、1000、1500、2000、2500、3000、4000、5000。出厂默认为200ms,即最小广播周期。如设置广播周期为1000ms,范例程序详见程序清单9.12。注意,修改广播周期后,掉电不丢失。

程序清单9.12 设置BLE 广播周期范例程序

可以通过命令获取当前的广播周期,范例程序详见程序清单9.13。

程序清单9.13 获取BLE 广播周期范例程序

程序执行结束后,period_ms 的值即为当前使用的广播周期。若使用程序清单9.12 所示的代码修改了广播周期,则此处获取的值应该为1000。

7. 设置/获取BLE 发射功率

BLE 发射功率影响着模块的传输距离,功率越大传输的距离越远,相应的平均功耗也会越大。BLE 的发射功率的单位为dBm,有效值有:-20、-18、-16、-14、-12、-10、-8、-6、-4、-2、0、2、4。出厂默认为0dBm。如设置发射功率为-2dBm,范例程序详见程序清单9.14。注意,修改发射功率后,掉电不丢失。

程序清单9.14 设置BLE 发射功率范例程序

可以通过命令获取当前的广播周期,范例程序详见程序清单9.15。

程序清单9.15 获取BLE 发射功率范例程序

程序执行结束后,tx_power 的值即为当前使用的发射功率。若使用程序清单9.14 所示的代码修改了发射功率,则此处获取的值应该为-2。特别注意,tx_power 可能为负值。

8. 设置/获取数据延时

在介绍ZLG9021 引脚和硬件电路时,描述了引脚BCTS 的作用。当ZLG9021 有数据需要发送至主控MCU 时,BCTS 引脚则会立即输出为低电平。设置为低电平后,延时一段时间才开始传输数据。这里设置的数据延时,即为引脚输出低电平至实际开始传输数据之间的时间间隔。

该延时在一些低功耗应用场合中非常有用,主控MCU 正常情况下均处于低功耗模式以降低功耗,并将BCTS 引脚作为主控MCU 的唤醒源,使得仅仅有数据需要接收时,主控MCU 才被唤醒工作。由于MCU 唤醒是需要时间的,因此提供了该数据延时功能,以确保主控MCU 被完全唤醒后再发送数据,避免数据丢失。

延时时间的单位为ms,有效值有:0、10、20、30。默认值为0,即不延时。如设置数据延时为10ms,范例程序详见程序清单9.16。注意,修改数据延时时间后,掉电不会丢失。

程序清单9.16 设置数据延时范例程序

可以通过命令获取当前的数据延时,范例程序详见程序清单9.17。

程序清单9.17 获取数据延时范例程序

程序执行结束后,bcts_delay 的值即为当前使用的数据延时。若使用程序清单9.16 所示的代码修改了数据延时,则此处获取的值应该为10。

9. 进入低功耗模式

可以使用进入低功耗命令使ZLG9021 进入低功耗模式,范例程序详见程序清单9.18。

程序清单9.18 进入低功耗模式范例程序

注意,在介绍ZLG9021 引脚和硬件电路时,描述了引脚EN 的作用。当EN 为高电平时,模块被禁能,处于极低功耗模式。只有变为低电平后模块才能正常工作。若EN 引脚未使用(固定为低电平),此时可以使用该命令使ZLG9021 进入低功耗模式,进入低功耗模式后会关闭BLE 端和串口端,数据透传被禁止,也不能使用串口发送命令至ZLG9021。此时,只有当EN 引脚或BRTS 引脚发生边沿跳变时才能唤醒ZLG9021,唤醒后方可正常工作。

10. 获取软件版本号

当前ZLG9021 最新的软件版本号为“V1.01”,历史版本有“V1.00”。可以使用获取版本号命令获取当前ZLG9021 的软件版本号。范例程序详见程序清单9.19。

程序清单9.19 获取软件版本号范例程序

程序执行结束后,version 的值即表示了ZLG9021 的软件版本号。注意,获取的值为整数类型,100 表示“V1.00”版本,101 表示“V1.01 版本”,以此类推。

11. 获取BLE 连接状态

可以使用命令直接获取当前BLE 的连接状态,范例程序详见程序清单9.20。

程序清单9.20 获取BLE 连接状态范例程序

程序执行结束后,conn_stat 的值即表示了当前的连接状态,若值为TRUE,则表示当前BLE 已连接,若值为FALSE,则表示当前BLE 未连接。

12. 断开BLE 连接

若当前BLE 处于连接状态,可以使用命令强制断开当前的BLE 连接,范例程序详见程序清单9.21。

程序清单9.21 断开BLE 连接范例程序

13. 设置/获取BLE 配对码

出厂默认情况下,ZLG9021 的BLE 未设置配对码,此时,任何手机端均可连接ZLG9021。为了防止非法手机连接,可以设置一个配对码。设置配对码后,在手机端与ZLG9021 模块刚连接的10s 内,必须发送配对码字符串至ZLG9021。如果配对码错误或者ZLG9021 在10s内没有接收到配对码,ZLG9021 会主动断开此连接。

配对码是由6 个数字字符(字符'0'~'9')组成的字符串。如设置配对码为“123456”,范例程序详见程序清单9.22。注意,修改配对码后,掉电不会丢失。

程序清单9.22 设置BLE 配对码范例程序

设置配对码成功后,手机端与ZLG9021 建立连接时,必须输入配对码“123456”才能连接成功。特别地,若设置配对码为“000000”,则表示取消配对码。

可以通过命令获取当前的配对码,范例程序详见程序清单9.23。

程序清单9.23 获取BLE 配对码范例程序

程序中,由于配对码的长度为6 字符,为了存放'',需将存储配对码的缓冲区大小设置为7。程序执行结束后,pwd 中即存放了ZLG9021 当前使用的配对码。特别地,若获取的配对码为“000000”,表示当前未使用配对码功能。

14. 传输加密的设置和状态获取

出厂默认情况下,ZLG9021 未对传输加密,此时,数据都是明文传输,很容易被破解。为了确保数据通信的安全性,可以使能ZLG9021 传输加密的功能,详见程序清单9.24。

程序清单9.24 使能BLE 传输加密范例程序

程序中,将p_arg 参数的值设置为了TRUE,表示使能传输加密。若将p_arg 的值设置为FALSE,则表示禁能传输加密。注意,修改传输加密的设置后,掉电不会丢失。

可以通过命令获取当前传输加密的状态,范例程序详见程序清单9.25。

程序清单9.25 获取BLE 传输加密的状态范例程序

程序执行结束后,enc 的值表示了当前传输加密的状态。若值为TRUE,则表示当前已经使能传输加密,若值为FALSE,则表示当前未使能传输加密。

15. 获取接收缓冲区已存储数据量

在初始化ZLG9021 时,提供了一个接收缓冲区供UART 接收使用,当ZLG9021 发送数据至主控MCU 时,首先会将UART 接收到的数据存储到接收缓冲区中,应用程序使用接收函数(详见表6.24)接收数据时,直接提取出接收缓冲区中的数据返回给应用即可。

应用程序可以实时查询当前接收缓冲区中已经存储的数据量(字节数),以便决定是否使用接收数据函数(详见表6.24)接收数据。范例程序详见程序清单9.26。

程序清单9.26 获取接收缓冲区已接收数据量范例程序

程序执行结束后,nread 的值即表示了当前接收缓冲区中已存储的数据量。

16. 设置数据接收超时时间

默认情况下,没有设置接收超时时间,使用接收数据函数(详见表6.24)接收数据时,若接收缓冲区中的数据不够,将会一直“死等”,直到达到期望接收的字节数后才会返回。

为了避免出现“死等”,可以使用该命令设置一个超时时间,当等待时间达到超时时间时,也会直接返回。特别地,可以将超时时间设置为0,即不进行任何等待,接收函数会立即返回。如设置超时时间为100ms,范例程序详见程序清单9.27。注意,设置超时时间后,掉电会丢失。

程序清单9.27 设置数据接收超时时间范例程序

>>> 9.1.5 蓝牙模块读写数据接口

读写数据接口实现了数据的透传,详见表9.5。只有当BLE 处于连接状态时,ZLG9021才能正确的将数据透传至与之连接的BLE 设备,否则ZLG9021 会将数据丢弃。

表9.5 ZLG9021 读写数据接口函数(am_zlg9021.h)

1. 发送数据

发送数据的函数原型为:

其中,p_buf 为待发送数据存放的缓冲区首地址,len 为发送数据的长度(字节数)。若返回值为负数,表示发送失败,非负数表示成功发送的字节数。

如程序清单9.28 所示,为发送一个字符串“Hello World!”的范例程序。

程序清单9.28 发送数据范例程序

若已经有BLE 设备(如手机)与ZLG9021 相连,则在手机APP 端可以接收到使用该段程序发送的“Hello World!”字符串。

注意,由于ZLG9021 会将“TTM:”开始的数据视为命令数据,因此,使用此接口发送的数据不应该包含“TTM:”。

2. 接收数据

接收数据的函数原型为:

其中,p_buf 为接收数据存放的缓冲区首地址,len 为期望接收的长度(字节数)。若返回值为负数,表示接收失败,非负数表示成功接收的字节数。

如程序清单9.29 所示,为接收10 字节数据的范例程序。

程序清单9.29 接收数据范例程序

默认情况下,没有设置接收超时时间,该段程序会直到10 个数据接收完成后才会返回。若发送端迟迟未发送满10 个字节,则会一直“死等”。

在一些应用中,可能不期望出现“死等”的情况,此时,可以使用“设置数据接收超时时间(AM_ZLG9021_TIMEOUT)”命令设置一个超时时间,从而避免“死等”。实际读取的字节数可以通过返回值得到。

可以实现一个简单的数据收发测试应用:AW824BPT 收到主机端(往往是手机APP 端)发送的数据后,将数据原封不动的回复到手机端。范例程序详见程序清单9.30。

程序清单9.30 AW824BPT 蓝牙模块与主机相互收发数据范例程序

程序中,首先通过实例初始化函数得到了蓝牙模块的句柄,然后使用控制接口对蓝牙模块进行了复位操作,接着,设置了接收数据的超时时间为100ms,最后,在主循环中接收数据,若接收到数据,则再将数据发送出去,回传给主机。设置超时的作用是,当接收数据不足10 个字符时,也能在超时后返回,并及时将数据回发给主机。

为了测试该范例程序,需要一个蓝牙主机来进行对应的收发数据操作,主机端往往通过手机APP 来模拟。相关的测试蓝牙串口透传的APP 有很多,读者可以自行下载,使用方法非常简单,和平常在PC 上使用的串口调试助手进行数据的收发非常类似。安卓端可以下载我司提供的QppDemo.apk 安装使用,IOS 端可以在App Store 中搜索BLE 助手、LightBlue等蓝牙工具软件进行测试。

以安卓端QppDemo 为例,首先下载QppDemo.apk,然后按照默认设置进行安装,安装完成后,会在手机桌面上新增一个名为Qpp Demo 的应用。打开手机蓝牙,然后启动该APP,启动后界面详见图9.4(a)。若程序清单9.30 所示的范例程序正在运行,则启动后会发现一个名为Quintic BLE 的蓝牙设备,若未发现,则可以点击右上角的【scan】启动扫描,以发现BLE 设备。

图9.4 Qpp Demo 界面

点击名为Quintic BLE 的蓝牙设备进入收发数据界面,详见图9.4(b),界面顶部显示了蓝牙设备的名字、MAC 地址、数据速率,发送计数和接收计数等信息,接着是发送窗口和接收窗口,为了正常显示接收到的信息,需要使能接收显示,点击接收窗口中的【View】即可使能接收显示,点击后,【View】为高亮,详见图9.4(c),在发送窗口中,输入hello字符串,点击【send】发送,由于测试程序会将接收到的信息原封不动的回发到主机,因此可以在接收窗口中看到hello 字符串,表明接收的信息与发送的信息一致,测试成功。

>>> 9.1.6 应用案例

AM824BLE 是广州致远电子有限公司基于AW824BPT 开发的蓝牙4.0 二次开发评估板,评估板集成了多种实验用的电路,比如,看门狗、蜂鸣器、数字温度传感器、热敏电阻、按键等,方便用户使用蓝牙进行无线通讯的交互实验。AM824BLE 开发板的示意图详见图9.5,主控核心为AW824BPT。

图9.5 AM824BLE 开发板

其完整资料详见www.zlg.cn(广州致远电子有限公司)和www.zlgmcu.com(广州周立功单片机科技有限公司)网站,索取样品请联系各地办事处。

1. 应用程序编写

为了实现该应用案例,作为简单的示例,我们定义:主机发送字符串"on"、"off"和"tog"作为控制字符串,分别用于点亮、熄灭和翻转LED0。应用程序的实现详见程序清单9.31。

程序清单9.31 使用BLE 控制LED 的应用程序范例(app_ble_led_control.c)

应用程序的逻辑为:当接收到字符串"on"时,点亮LED0;接收到字符串"off"时,熄灭LED0;接收到字符串"tog"时,翻转LED0 的状态。只要控制字符串有效,就回复一个“OK!”字符串。由于控制字符串("on"、"off"或"tog")的最大长度为3,因此,将缓冲区大小定义为了4,多一个字节空间是为了存放字符串结束符'',便于使用strcmp()函数进行字符串比较。每次接收数据前,都将缓冲区buf 中的内容全部设置为'',便于清除之前的数据,同时保证字符串比较时,最后一个字符为''。

值得注意的时,程序在一开始就将接收超时时间设置为了100ms。这是由于控制字符串"on"仅包含两个字符,其长度达不到期望的长度(期望长度为3),如果不设置超时,就会导致控制字符串为"on"时接收数据函数始终不返回。

在这里,由于实例初始化函数在不同硬件平台中可能存在不同,因此,为了应用程序的通用化和跨平台复用,蓝牙模块的句柄不在应用程序中获取,应用程序使用的句柄通过参数传递给应用程序。为了便于主程序使用,将其接口声明到app_ble_led_control.h 文件中,详见程序清单9.32。

程序清单9.32 应用程序接口声明(app_ble_led_control.h)

2. 主程序编写

主程序的核心职责就是启动应用程序,显然要启动应用程序,就需要先获取到一个蓝牙模块句柄,以便通过应用程序接口的参数传递给应用程序使用,详见程序清单9.33。

程序清单9.33 使用BLE 控制LED 亮灭的主程序


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ZigBee
    +关注

    关注

    158

    文章

    2241

    浏览量

    241076
  • 周立功
    +关注

    关注

    38

    文章

    130

    浏览量

    37046
  • 智能蓝牙
    +关注

    关注

    9

    文章

    126

    浏览量

    32657

原文标题:周立功:BLE 核心板的应用

文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ble_ZigBee_dyn进行移植rt thread系统有哪些注意事项?

    我在从官方示例程序中ble_ZigBee_dyn进行移植rtthread系统,但是我遇到了问题:我移植完成后bleZigBee能同时进行广播,但是我的安卓手机蓝牙连接stm32wb55rg的蓝牙
    发表于 03-08 07:21

    何解决车载部品测试过程中峰值电流不足的问题?

    何解决车载部品测试过程中峰值电流不足的问题? 随着汽车电子系统的不断发展和普及,车载部品的测试过程变得更加复杂和严峻。其中一个常见的问题是峰值电流不足。峰值电流不足可能导致测试结果不
    的头像 发表于 11-23 10:33 208次阅读

    基于ZigBee&;amp;amp;云平台的物联网工业设备监控方案

    发电、制造等工业领域,工业设备是否正常运行会影响整个生产过程,因此,监控工业设备至关重要。本文将介绍ZLG致远电子的ZigBee网关和节点,搭配ZWS云平台,实现智慧工厂设备监控方案。应用场景在发电
    的头像 发表于 10-28 08:25 528次阅读
    基于<b class='flag-5'>ZigBee&</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;云平台的物联网工业设备监控方案

    介绍一款高性能的Zigbee无线模块--SUN-JN5169 Zigbee模块

    大家好,我是的鸣涧, 介绍给大家介绍一个款高性比、低功耗、高性能的的Zigbee无线模块--SUN-JN5169 Zigbee模块
    的头像 发表于 10-19 09:41 857次阅读
    介绍一款高性能的<b class='flag-5'>Zigbee</b>无线<b class='flag-5'>模块</b>--SUN-JN5169 <b class='flag-5'>Zigbee</b><b class='flag-5'>模块</b>

    BLE蓝牙模块功能应用②——定位功能

    蓝牙定位是BLE蓝牙模块的重要功能,可以弥补GPS无法覆盖室内定位的场景。本文将从iBeacon概述、定位技术原理以及行业应用来展开介绍,带大家熟悉了解BLE蓝牙模块的定位功能。iBe
    的头像 发表于 10-18 08:25 399次阅读
    <b class='flag-5'>BLE</b>蓝牙<b class='flag-5'>模块</b>功能应用②——定位功能

    FCC & CE认证 蓝牙5.1协议 主从并存 低功耗蓝牙模块BLE5101# 蓝牙

    BLE蓝牙模块
    思为无线
    发布于 :2023年10月12日 09:31:13

    zigbee模块电路图

    zigbee模块电路图
    发表于 09-22 16:24 4次下载

    BLE & HID & HOGP

    BLE
    橙群微电子
    发布于 :2023年09月15日 09:06:04

    STM32WB&amp;amp;amp amp WL开拓蓝牙BLE及LoRa无线新市场

    射频收发支持SPI屏显及内置段码LCD显示智能家居及工业应用 .支持BLE+Zigbee双协议并发模式,支持BLE Mesh组网12-bit ADC 4.2MSPS采样率,比较器,Timer .耐受105C高温环境,支持功能安全认证
    发表于 09-08 06:47

    BLE的配对流程(二)

    BLE
    橙群微电子
    发布于 :2023年08月07日 09:57:20

    车规级BLE5.2蓝牙模块,超强耐高温!

    E104-BT53C3是一款基于蓝牙协议5.2版本的串口转BLE蓝牙模块。是基于SiliconLabs的EFR32BG22C224F512IM40-C芯片研发的车规级蓝牙模块,可在-40~+125
    的头像 发表于 08-04 08:24 866次阅读
    车规级<b class='flag-5'>BLE</b>5.2蓝牙<b class='flag-5'>模块</b>,超强耐高温!

    BLE 5.4 新功能介绍

    BLE
    橙群微电子
    发布于 :2023年07月04日 10:20:24

    使用网关解决方案将ZigbeeBLE设备连接到AWS IoT平台

    在本文中,我们将向您展示如何使用 AWS IoT 平台、HomeBridge® 网关和互联移动应用程序轻松连接和控制 ZigbeeBLE 传感器或设备。在这种情况下,我们将引导您完成如何配置
    发表于 06-14 09:26 296次阅读

    内置BLE 照明演示程序——蓝牙Mesh自组网模块了解一下

    很多客户对我们的照明灯控模块非常满意,这次泽耀全新完善推出的A72系列蓝牙Mesh自组网模块,也一样不会让你失望:A72系列基于TLSR8258,工作在2.4GISM频段,支持多种协议包括BLE
    的头像 发表于 05-06 09:38 802次阅读
    内置<b class='flag-5'>BLE</b> 照明演示程序——蓝牙Mesh自组网<b class='flag-5'>模块</b>了解一下

    Zigbee无线通信模块的特点和应用场景

      Zigbee无线通信模块是一种基于Zigbee协议的无线通信模块,常常被用于无线传感器网络中的数据采集、传输和控制操作。通过与其他Zigbee
    发表于 05-05 18:06 1341次阅读