第九章为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 字符,为了存放'