原创 基于CC2530的ZigBee转以太网网关的设计与实现

2014-8-5 09:57 2995 16 16 分类: 消费电子

物联网技术的实现中,无线技术是不可缺少的部分。近年无线技术的发展,将ZigBee推入人们的视线中,那么ZigBee是怎样的一种技术呢?带着疑问,我查询了它的来历:
ZigBee,来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,可以想象蜜蜂依靠这样的方式构成了群体中的通信网络! 
是不是有点意思,那么随之 ZigBee的出现就成了一种我们熟知的无线组网通讯技术并广为应用。本篇就带你认识ZigBee,并实现一种常见应用:ZigBee转以太网网关。
 

  • 将ZigBee技术连接互联网

Image

图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

Image
图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

Image
图3 W5500模实物与原理图管脚对照

Image

图4 CC2530EB板SPI管脚对照


由于W5500的函数驱动库是分层次书写的,我们只需将SPI通信的硬件抽象层的函数重新编写即可。 以下为CC2530的SPI1的初始化配置函数和数据收发函数的程序,以及复位管脚的控制程序:
 

CODE: SELECT ALL
#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

  • 00的驱动程序包添加到工程中。如图5所示,需要注意的是,CC2530的LCD驱动的部分引脚与SPI1的几个引脚是复用的,需要将和LCD有关的编译项去掉,避免发生冲突,导致SPI不可用。具体方法为在工程选项的编译子项里,去掉“LCD_SUPPORTED”,并添加“HAL_LCD=FALSE”。

    继续阅读:http://wizwiki.net/forum/viewtopic.php?f=91&t=1075

    WIZnet官方网站:http://www.iwiznet.cn

    WIZnet官方微博:http://weibo.com/wiznet2012

  • 文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    16
    关闭 站长推荐上一条 /2 下一条