物联网技术的实现中,无线技术是不可缺少的部分。近年无线技术的发展,将ZigBee推入人们的视线中,那么ZigBee是怎样的一种技术呢?带着疑问,我查询了它的来历:
ZigBee,来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,可以想象蜜蜂依靠这样的方式构成了群体中的通信网络!
是不是有点意思,那么随之 ZigBee的出现就成了一种我们熟知的无线组网通讯技术并广为应用。本篇就带你认识ZigBee,并实现一种常见应用:ZigBee转以太网网关。
图1 智能家居中ZigBee应用示意图
ZigBee是一种低成本,低功耗的近距离无线组网通讯技术,在智能家居、智能楼宇、工业监控等领域均有广泛应用。基于ZigBee的智能家居应用,如图1所示,用户在家庭中安装一个主控中心(ZigBee网关),及若干个与家电设备相连的分控终端,来远程操控所有家用电器,设想下躺在沙发上控制厨房的电饭煲煮饭是不是无限畅快呢?如果网关可以连到互联网上,甚至远在公司,打开手机就能登录到家里的网关查看家里的情况。 作为开源爱好者,可能很多人已经做过ZigBee方面的开发,一般使用TI公司的CC2530射频芯片较多,TI公司也针对这类芯片制定了完备的软件协议栈zstack。CC2530受处理器速度和内存限制,无法运行TCP/IP协议,用户往往通过串口获得协调器汇聚的数据。想要让协调器直接连上互联网只能借助其他网络芯片,由于W5500以太网芯片在硬件上实现了TCP/IP协议,即使像CC2530这样的16位单片机也可以自如操控W5500,实现联网,无需借助其他辅助处理器做数据转换。 本文我们使用两个CC2530模块,组建一个小型的ZigBee网络,一个作为协调器建立网络,另一个作为终端节点不断的采集温湿度数据并发送给协调器。为实现协调器的联网,我们在协调器上外接一个W5500模块,协调器作为TCP客户端连接以太网内的主机,并将终端节点发来的数据通过W5500上传给主机。应用系统的实物如图2所示: Zigbee2
图2系统实物
1. 安装编译环境IAR Embedded Workbench for MCS-51 7.51A
2. 安装协议栈ZStack-CC2530-2.2.2-1.3.0
3. 安装CC2530模块调试下载器驱动
W5500在硬件上实现TCP/IP协议,用户几乎不需要任何网络基础,并且WIZnet公司针对W5500也有很好的程序包的支持,只需调用socket函数,就可以完成网络的建立和通讯,当然,要获得以上便利,我们要先将CC2530与W5500连接起来,并能够发送数据控制W5500。 W5500与MCU通信使用SPI接口,CC2530是带有8051内核的无线MCU,片上有两个SPI接口,并且与USART复用,这里我们选择SPI1作为W5500的控制接口。图2为W5500模块的管脚对应关系,控制这个模块仅需J1插针上的1-7引脚(程序上使用轮询机制,所以可以省略INT中断管脚)。图3为CC2530模块上SPI1引脚的对应关系,另外使用P13作为W5500模块RST(复位)的输出控制引脚。通过排线将以上引脚对应连好后就可以编写硬件驱动程序啦。 Zigbee3
图3 W5500模实物与原理图管脚对照
图4 CC2530EB板SPI管脚对照
由于W5500的函数驱动库是分层次书写的,我们只需将SPI通信的硬件抽象层的函数重新编写即可。 以下为CC2530的SPI1的初始化配置函数和数据收发函数的程序,以及复位管脚的控制程序:
#include “ioCC2530.h”
//SPI管脚和初始化配置
voidWIZ_SPI_Init(void)
{
PERCFG |=0×02;//打开UART1外设
P1SEL |=0xE0;// 使能P1_7, P1_6, and P1_5 外设功能
P1SEL &=~0×10;// 配置P1_4为普通GPIO (SPI_CS)
P1DIR |=0×10;// 配置P1_4输出引脚
// Set baud rate to max (system clock frequency / 8)
U1BAUD =0×00;// BAUD_M = 0
U1GCR |=0×11;// BAUD_E = 17
U1CSR &=~0xA0;// SPI 主机模式
// Configure phase, polarity, and bit order
U1GCR &=~0xC0;// CPOL = CPHA = 0
U1GCR |=0×20;// ORDER = 1
P1SEL &=~0×08;// 配置P1_3为普通GPIO (RST)
P1DIR |=0×08;// 配置P1_3为输出引脚
}
//W5500 复位引脚的控制
void WIZ_RST(uint8 val)
{
if(val== LOW){
P1_3=0;//引脚拉低
}elseif(val== HIGH){
P1_3=1;//引脚拉高
}
}
//SPI CS管脚的电平控制
void WIZ_CS(uint8 val)
{
if(val== LOW){
P1_4=0;
}elseif(val== HIGH){
P1_4=1;
}
}
//SPI数据发送和接收
uint8 SPI2_SendByte(uint8 byte)
{
uint8 temp;
U1DBUF = byte;
while(!(U1CSR&0×02));//等待数据发送完毕
U1CSR &=0xFD;
temp = U1DBUF;//读取数据缓冲区接收字节
return temp;
}
程序重写完毕后,打开zstack的例程,将W55
继续阅读:http://wizwiki.net/forum/viewtopic.php?f=91&t=1075
WIZnet官方网站:http://www.iwiznet.cn
WIZnet官方微博:http://weibo.com/wiznet2012
文章评论(0条评论)
登录后参与讨论