电子说
周立功教授新书《面向AMetal框架与接口的编程(上)》,对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。经周立功教授授权,即日起,致远电子公众号将对该书内容进行连载,愿共勉之。
第九章为BLE&zigbee 无线模块,本文内容为9.2 zigbee 核心板。
9.2 zigbee 核心板
AW824P2EF 是由广州致远电子有限公司开发的,基于LPC824+JN5161 组合而成的支持Fastzigbee 组网协议和用户二次开发的核心板,JN5161 是NXP 半导体公司提供的zigbee 芯片,其支持的频段为IEEE802.15.4 标准ISM(2.4-2.5GHz)。该模块最大的特点是具备完整的软硬件生态链,因此可快速应用于工业控制、数据采集、农业控制、矿区人员定位、智能家居和智能遥控器等场合。
>>> 9.2.1 产品简介
AW824P2EF 核心板的特性如下:
工作电压2.1V~3.6V;
最大发射功率20dbm;
最大接收灵敏度-95dbm;
内置zigbee 串口透传;
ARM Cotex-M0+处理器,内置8 KB SRAM 和32KB Flash,支持12 位ADC、SPI、I2C 和UART。
AW824P2EF 核心板将无线产品极其复杂的通讯协议集成到内置的MCU 中,极大地大幅简化了无线产品复杂的开发过程,用户只需通过串口就可以对核心板进行配置和透明收发数据。AW824P2EF 核心板共计35 个引脚,引脚分布详见图9.6,引脚功能描述详见表9.6。
表9.6 AW824P2EF 核心板引脚功能描述
图9.6 AW824P2EF 引脚分布图
为了便于快速开发,在AW824P2EF 内部已经将LPC824 的串口1(PIO0_26 和PIO0_27)与内置的zigbee 芯片的串口相连,并将PIO0_28 连接到了ZM5161 的复位引脚, 示意图详见图9.7 。当使用对AW824P2EF 进行二次开发时,需要将LPC824 的PIO0_26配置为串口RX 功能,PIO0_27 配置为串口TX 功能。
图9.7 硬件连接示意图
ZB_RST 是ZM5161 的复位引脚,当通过PIO0_28 管脚输出大于1us 的低电平信号时,可以让核心板可靠地复位。
在AW824P2EF 中,zigbee 核心板默认运行的是广州致远电子有限公司结合多年的行业应用经验,自主研发的适合各种工业领域应用的zigbee 协议栈:Fastzigbee。为与原始芯片JN5161 进行区分,将该zigbee 模块命名为ZM5161。
>>> 9.2.2 组网应用
ZM516x 系列模块除支持Fastzigbee 协议外,还可以支持其它多行业的无线协议栈,比如,zigbee Pro、zigbee Pro Home Automation、zigbee Pro Smart Energy、zigbee Pro Light Link、zigbee RF4CE、JenNet-IP 等。AW824P2EF zigbee 模块默认运行的是Fastzigbee 协议栈。Fastzigbee 具有以下特点:
设备启动速度、响应速度、数据传输效率出众;
网络容量终端节点数真正达到65535 个;
终端节点功耗低至100nA,低于目前100%的zigbee 模块;
支持多级中继功能,网络具备自调整、自修复等特性;
支持多路远程I/O 和远程ADC,支持短地址功能,可随用户应用自由修改;
具有更大的链路预算。
使用ZM516X 模块搭载的健壮的Fastzigbee 组网透传协议网络,可构建多种型态的网络拓扑结构,其最大的特点是实用性极强、传输效率高、性能可靠稳定、二次开发简单、工程布网灵活,Fastzigbee 的网络拓扑图详见图9.8。
图9.8 Fastzigbee 网络拓扑图
Fastzigbee 的终端节点负责传感设备的数据采集,一般是使用电池供电间歇工作,要求设备功耗很低;Fastzigbee 的路由节点负责信号的中继,当终端节点信号不能直接到达网关节点时,由路由节点负责终端节点信号的中继,路由节点还有一个功能是给终端节点提供多条信号路径,保证信号传递的健壮性,路由节点不能休眠;Fastzigbee 网关节点负责把终端节点采集的数据上传到云端服务器,网关节点可使用有线的以太网络或无线3/4G 网络传输采集数据到云端服务器。组建Fastzigbee 网络需配置几个重要的参数。
1. 通道号
通道号决定了zigbee 网络使用哪个无线频率工作,zigbee 可工作在2.4GHz(全球流行)、868MHz(欧洲流行)、915MHz(美国流行)3 个频段上。2.4GHz 频段的zigbee 网络使用的频率范围从2405MHz~2480MHz,共分为16 个通道,通道号从11~26,每个通道的中心频率间隔是5MHz。同一个zigbee 网络的所有节点必须工作在同一个通道,通过把两个不同的zigbee 网络分配在不同的通道上,可以把两个不同的网络物理上隔离,杜绝了两个不同网络的无线干扰。
2. 节点类型
Fastzigbee 网络把zigbee 节点分为两种类型:终端节点和路由节点。终端节点是负责执行具体功能的节点,该节点需要休眠;路由节点是负责信号的中继,当终端节点间信号不可达时,可通过加装路由节点实现信号的中继,增加无线的传输距离。Fastzigbee 网络是一个对等网路,所有终端节点和路由节点都是对等的,都能相互收发数据,不需要像传统的zigbee网络一样需要有一个协调器建立网络,对等网络使网络组建更加简单、稳定可靠。
3. PanID
PanID 为zigbee 的网络ID 号,通过PanID 可以把两个不同的zigbee 网络区分开来,跟通道号不同的是,PanID 只是逻辑上把两个网络区分开来,如果两个不同PanID 的网络工作在同一个通道下,也会造成相互的无线干扰。
4. 网络地址
同一个zigbee 网络下的所有节点都有一个唯一的16 位地址,通过这个地址标识每个节点和进行数据收发的寻址。
5. 数据发送模式
zigbee 数据发送模式分为单播和广播两种方式。单播是发送数据时需要指定一个目标网络地址,只有这个目标网络地址的节点能接收这个数据,广播是一个节点发送数据,在同一网络下其他所有节点都能接收这个数据。
>>> 9.2.3 zigbee 初始化
AMetal 平台已经支持ZM516X 模块,可以直接使用相应的API 完成相关网络参数的配置与收发数据,用户无需关心底层的通信协议。在使用各个功能函数前必须先完成初始化,其函数原型(am_zm516x.h)为:
该函数意在获取ZM516X 模块的实例句柄,其中,p_dev 为指向am_zm516x_dev_t 类型实例的指针,p_devinfo 为指向am_zm516x_devinfo_t 类型实例信息的指针,uart_handle为与zigbee 模块通信使用的串口句柄。
实例
定义am_zm516x_dev_t 类型(am_zm516x.h)实例如下:
其中,g_zm516x_dev 为用户自定义的实例,其地址作为p_dev 的实参传递。
实例信息
实例信息主要描述了与zigbee 模块相关的信息,其类型am_zm516x_devinfo_t 的定义(am_zm516x.h)如下:
其中,rst_pin 表示模块的复位引脚,以便程序在需要复位模块时,通过该引脚复位zigbee模块。在AW824P2EF 中,zigbee 的复位引脚ZB_RST 与LPC824 的PIO0_28 相连接,因此rst_pin 的值应该赋值为PIO0_28。
为了提高数据处理的效率和确保接收数据不会因为正在处理事务而丢失,zigbee 模块的数据发送和接收都需要一个用于缓存数据的缓冲区,缓冲区的实际大小由用户根据实际情况指定,建议在256 字节以上,一般设置为256 字节。p_txbuf 和txbuf_size 描述了发送缓冲区的首地址和大小,p_rxbuf 和rxbuf_size 描述了接收缓冲区的首地址和大小。比如,分别定义其大小为256 字节的缓冲区供发送和接收使用:
其中,g_zm516x_txbuf[128]为用户自定义的数组空间,供发送使用,充当发送缓冲区,其地址(数组名g_zm516x_txbuf 或首元素地址&g_zm516x_txbuf[0])作为实例信息中p_txbuf成员的值,数组大小作为实例信息中txbuf_size 成员的值。同理,g_zm516x_rxbuf[256]充当接收缓冲区,其地址作为实例信息中p_rxbuf 成员的值,数组大小作为实例信息中rxbuf_size成员的值。基于以上信息,实例信息可以定义如下:
其中,g_zm516x_devinfo 为用户自定义的实例信息,其地址作为p_devinfo 的实参传递。
UART 句柄uart_handle
若使用LPC824 的USART2 与ZM516x 通信,则通过LPC82x 的USART2 实例初始化函数am_lpc82x_usart2_inst_init()获得UART 句柄作为uart_handle 的实参传递。即:
实例句柄
ZM516X 初始化函数am_zm516x_init ()的返回值即为ZM516X 实例的句柄,该句柄将作为其它功能接口函数的zm516x_handle 参数的实参。
其类型am_zm516x_handle_t 类型(am_zm516x.h)定义如下:
若返回值为NULL,说明初始化失败;若返回值不为NULL,说明返回了一个有效的handle。基于模块化编程思想,将初始化相关的实例、实例信息等的定义存放到ZM516X 的配置文件(am_hwconf_zm516x.c)中,通过头文件(am_hwconf_zm516x.h)引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单9.34 和程序清单9.35。
程序清单9.34 ZM516X 实例初始化函数实现(am_hwconf_zm516x.c)
程序清单9.35 ZM516X 实例初始化函数声明(am_hwconf_zm516x.h)
后续只需要使用无参数的实例初始化函数即可获取到ZM516X 的实例句柄。即:
>>> 9.2.4 zigbee 配置接口
AMetal 提供了10 个ZM516X 模块配置相关的接口函数,用户可以直接使用这些接口函数完成zigbee 模块的配置,详见表9.7。
表9.7 ZM516X 模块配置接口函数
1. 读取本地配置
该函数用于读取当前永久配置参数的信息,其函数原型为:
其中,p_info 是用于获取配置信息的指针,am_zm516x_cfg_info_t 为配置信息结构体的类型,包含了ZM516X 模块所有的永久配置参数的信息,其定义详见程序清单9.36。
程序清单9.36 ZM516X 永久配置信息结构
各参数的详细描述详见表9.8。
表9.8 ZM516X 模块永久配置参数描述
读取 ZM516X 本地配置的范例程序详见程序清单 9.37。
程序清单9.37 读取ZM516X 本地配置范例程序
2. 修改本地配置
该函数用于修改当前永久配置参数的信息,修改后的配置信息在掉电后不会丢失,其函数原型为:
其中,p_info 是指向配置信息的指针。在函数执行完毕后,如果要想配置参数生效,需要执行模块复位函数去复位模块,让模块重新加载新的配置参数运行,修改本地配置的范例程序详见程序清单9.38。
程序清单9.38 修改ZM516X 本地配置范例程序
3. 模块复位
该函数用于控制ZM516X 模块产生硬件复位,其函数原型为:
复位函数让用户可以对模块执行复位操作,如用户使用am_zm516x_cfg_info_set()函数修改配置后,需要执行模块复位函数,让模块复位后重新加载新的参数运行。模块复位的范例程序详见程序清单9.39。
程序清单9.39 模块复位范例程序
4. 恢复出厂设置
该函数用于将ZM516X 模块的永久参数恢复为出厂的默认参数,其函数原型为:
模块恢复出厂设置的范例程序详见程序清单9.40。
程序清单9.40 恢复出厂设置范例程序
5. 设置通道号
该函数用于在系统运行过程中临时改变ZM516X 模块的通道号,其函数原型为:
该函数设置的通道号仅临时有效,模块重新启动(掉电重启或软件复位)后,该设置将丢失,模块会重新使用永久参数配置信息中的通道号。设置模块通道号的范例程序详见程序清单9.41。
程序清单9.41 设置模块通道号范例程序
6. 设置目的地址
该函数用于在系统运行过程中临时改变ZM516X 模块的目的地址,其函数原型为:
其中,p_zb_addr 是指向目标节点的zigbee 模块地址的指针,am_zm516x_addr_t 类型定义如下(am_zm516x.h):
其中,p_addr 指向按字节存放的网络地址的缓冲区,addr_size 指定地址的长度。如目标地址为0x2002,则其zigbee 模块地址可以定义如下:
该函数设置的目的地址仅临时有效,模块重新启动后,该设置将丢失,模块会重新使用永久参数配置信息中的目的地址。设置模块目的地址的范例程序详见程序清单9.42。
程序清单9.42 设置模块目的地址范例程序
7. 设置包头显示
ZM516X 模块提供的是透明的数据传输通道,如果只有两个模块进行通信,就不用关心接收到的数据是从哪个模块发送过来的,但如果是接收多个模块的数据,用户想知道当前接收到的数据到底是从哪个模块发过来的,就可以使用该函数设置显示接收数据的来源,其函数原型为:
其中,flag 为包头显示标志,当其值为TRUE 时,表示当模块收到一帧数据时,数据包的前2 个字节为数据包源节点的网络地址,用户就可以区分当前接收到的数据是从哪个模块发送过来的;反之,若值为FLASE,则不会增加前2 个字节来表示数据包源节点的网络地址。该设置仅临时有效,模块重新启动后,设置的信息将丢失。设置模块包头显示的范例程序详见程序清单9.43。
程序清单9.43 设置模块包头显示范例程序
8. 进入休眠
该函数用于使ZM516X 模块进入休眠以降低功耗,其函数原型为:
模块进入休眠后不保存临时的参数配置,通过复位模块函数可以唤醒模块。使模块进入休眠的范例程序详见程序清单9.44。
程序清单9.44 使模块进入休眠范例程序
9. 设置通讯模式
ZM516X 模块支持单播(默认)和广播两种通讯模式,使用该函数可以改变使用的通讯模式,其函数原型为:
其中,mode 表示通信模式,其类型am_zm516x_comm_mode_t 是枚举类型,枚举了所有可能的取值,am_zm516x_comm_mode_t 定义如下:
该函数设置的通讯模式仅临时有效,模块重新启动后,该设置将丢失。设置模块通讯方式的范例程序详见程序清单9.45。
程序清单9.45 设置模块通讯方式范例程序
10. 读取信号强度
该函数用于读取指定地址的节点与本地节点之间的信号强度,用于评估两个节点间链路的质量,其函数原型为:
其中,*p_zb_addr 是指向目标节点的zigbee 模块地址的指针,p_signal 用于得到信号强度。读取模块信号强度的范例程序详见程序清单9.46。
程序清单9.46 读取模块信号强度范例程序
>>> 9.2.5 zigbee 数据传输接口
数据传输接口实现了数据的透传,数据传输包含数据的发送与接收,其接口详见表9.9。
表9.9 ZM516X 数据传输接口函数(am_zm516x.h)
3. 发送数据
ZM516X 模块在参数配置好后提供给用户是一个透明的通道,用户只需往ZM516X 模块的串口发送数据,模块就会把数据发送到配置好的目的地址,AMetal 提供了专门的发送数据接口函数,用户只需调用该接口即可完成用户数据的发送,该函数原型为:
ZM516X 模块发送函数调用的是带有环形队列的串口发送函数,环形队列的长度在驱动初始化函数里定义。发送的数据指针定义为void *,用户可发送指定长度的任意类型的数据。
发送数据的范例程序详见程序清单9.47。
程序清单9.47 发送数据范例程序
4. 接收数据
AMetal 也提供了专门的接收数据接口函数,用户只需调用该接口函数即可完成用户数据的接收,该函数原型为:
接收函数调用的是带有环形队列的串口接收函数,用户需根据系统的需要在驱动初始化函数里定义环形队列的长度。接收函数存放数据的指针定义为void *,可将接收的数据放在任意类型的数据缓存里。接收数据的范例程序详见程序清单9.48。
程序清单9.48 接收数据范例程序
其中一个模块配置本地网络地址为0x2001,目标网络地址为0x2002,另一个模块配置本地网络地址为0x2002,目标网络地址为0x2001,两个模块间隔1s 发送一次数据,然后接收对方的数据,将接收到的数据打印出来,详见程序清单9.49。
程序清单9.49 两个模块相互收发数据范例程序
程序中ZM516X 模块的数据接收函数接收超时时间为10ms,snd_tick 累加到100 后,既时间累加到1s 后调用一次数据发送函数,向目标节点发送一次数据。
上述应用程序将本地网络地址配置为0x2001,目标网络地址配置为0x2002。而另一个模块的地址恰恰是相反的,因此另一模块的程序需要修改程序清单9.49(20 ~ 23)如下:
>>> 9.2.6 应用案例
AM824ZB 是广州致远电子有限公司基于AW824P2EF 开发的zigbee 二次开发评估板。评估板集成了多种实验用的电路,如看门狗、蜂鸣器、数字温度传感器、热敏电阻、按键等,方便用户使用zigbee 进行无线通讯的交互实验。
AM824ZB 开发套件包括两块AM824ZB 开发板、MiniCK100 仿真器和两根天线用于远距离组网应用。AM824ZB 开发板的示意图详见图9.9,主控核心为AW824P2EF,详见广州致远电子有限公司网站(www.zlg.cn)。
图9.9 AM824ZB 开发板接口分布
其完整资料详见www.zlg.cn(广州致远电子有限公司)和www.zlgmcu.com(广州周立功单片机科技有限公司)网站,索取样品请联系各地办事处。
基于开发套件中的两块AM824ZB 开发板,可以做一个简单的应用:通过独立按键控制对方LED0 灯状态的翻转,每次按键按下,对方LED0 的状态就发生变化(由点亮变为熄灭,或由熄灭变为点亮)。
1. 应用程序编写
为了实现该应用案例,作为简单的示例,我们定义,当按键按下时,发送一个字符串“key_pressed”到目标节点,当目标节点收到“key_pressed”字符串时,翻转LED0。
对于两块模块来讲,虽然应用程序的逻辑是完全一样的,但是在组网应用中,必须为各个节点分配不同的网络地址,比如,它们的地址分别设定为0x2001 和0x2002。为此,需要编写一个通用的函数,实现核心的应用逻辑,不同之处(比如,本地地址和目标地址),通过参数指定,详见程序清单9.50。
程序清单9.50 使用zigbee 实现LED 控制的应用程序范例(app_led_control.c)
在这里,首先根据参数,完成本地地址和通信目标地址的配置,配置完成后,通过模块复位使设置生效,然后在while(1)主循环中检测是否有按键按下,按键按下时,则发送字符串“key_pressed”,接着接收数据,若接收到“key_pressed”,则翻转本地LED0 的状态。
为了便于主程序使用,将其接口声明到app_led_control.h 文件中,详见程序清单9.51。
程序清单9.51 应用程序接口声明(app_led_control.h)
2. 主程序编写
为了便于区分,特将两块板分别称为A 板和B 板。其中,A 板的网络地址为0x2001,目标地址为0x2002,详见程序清单9.52。
程序清单9.52 A 板(网络地址为0x2001)主程序
B 板的网络地址为0x2002,目标地址为0x2001,详见程序清单9.53。
程序清单9.53 B 板(网络地址为0x2002)主程序
全部0条评论
快来发表一下你的评论吧 !