标签:处理器 collect 方法 orm image deb display 组网 启动
*已刊登至:《无线电》8月刊
物联网技术的实现中,无线技术是必不可少的部分。
近年无线技术的发展,将ZigBee推入人们的视线中。那么ZigBee是如何的一种技术呢?带着疑问。我查询了它的来历:
ZigBee,来源于蜜蜂的八字舞,因为蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息。能够想象蜜蜂依靠这种方式构成了群体中的通信网络。基于ZigBee的智能家居应用,如图1所看到的。用户在家庭中安装一个主控中心(ZigBee网关)。及若干个与家电设备相连的分控终端,来远程操控全部家用电器。设想下躺在沙发上控制厨房的电饭煲煮饭是不是无限畅快呢?假设网关能够连到互联网上。甚至远在公司,打开手机就能登录到家里的网关查看家里的情况。 作为开源爱好者,可能非常多人已经做过ZigBee方面的开发,一般使用TI公司的CC2530射频芯片较多,TI公司也针对这类芯片制定了完备的软件协议栈zstack。CC2530受处理器速度和内存限制,无法执行TCP/IP协议,用户往往通过串口获得协调器汇聚的数据。想要让协调器直接连上互联网仅仅能借助其它网络芯片,因为W5500以太网芯片在硬件上实现了TCP/IP协议,即使像CC2530这种8位单片机也能够自如操控W5500。实现联网,无需借助其它辅助处理器做数据转换。
本文我们使用两个CC2530模块,组建一个小型的ZigBee网络,一个作为协调器建立网络。还有一个作为终端节点不断的採集温湿度数据并发送给协调器。
为实现协调器的联网,我们在协调器上外接一个W5500模块。协调器作为TCPclient连接以太网内的主机,并将终端节点发来的数据通过W5500上传给主机。应用系统的实物如图2所看到的: Zigbee2
图2为W5500模块的管脚相应关系,控制这个模块仅需J1插针上的1-7引脚(程序上使用轮询机制,所以能够省略INT中断管脚)。图3为CC2530模块上SPI1引脚的相应关系。另外使用P13作为W5500模块RST(复位)的输出控制引脚。通过排线将以上引脚相应连好后就能够编写硬件驱动程序啦。 Zigbee3
下面为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;
}
在project中。APP子栏下有sapi、SimpleCollector(协调器)、SimpleSensor(终端节点)三组文件。当中sapi中定义了节点组网和入网的应用函数,用户不须要改写这些程序。可是当中一些事件会调用SimpleCollector和SimpleSensor中的函数。用户须要在这两个文件里编写处理函数。 先看下协调器的应用层的程序处理过程,在sapi.c文件里初始化了SAPI 任务。在这个任务中定义了ZB_ENTRY_EVENT和ZB_USER_EVENTS两个事件,当中初始化函数SAPI_Init()中启动了ZB_ENTRY_EVENT事件,即在任务建立后会首先进入该事件。
任务事件处理函数SAPI_ProcessEvent()中在处理这两个事件时调用zb_HandleOsalEvent()函数,交给用户文件SimpleCollector去处理。
当中ZB_ENTRY_EVENT仅仅运行一次,用来定义设备的类型(协调器或终端节点),ZB_USER_EVENTS会运行多次。在这个事件里我们用来维护W5500的网络连接。
下面是任务事件处理函数有关这两个事件的处理程序:
UINT16
SAPI_ProcessEvent( byte task_id, UINT16 events )
{
……
if( events & ZB_ENTRY_EVENT )
{
uint8startOptions;
// 设备启动应用程序时给出指示
zb_HandleOsalEvent( ZB_ENTRY_EVENT );
zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
if(startOptions& ZCD_STARTOPT_AUTO_START )
{
zb_StartRequest();
}
else
{
// led闪烁并等待外部输入进行配置及重新启动
HalLedBlink(HAL_LED_2,0,50,500);
}
return(events ^ ZB_ENTRY_EVENT );
}
// 这是最后一个要处理的事件
if( events &( ZB_USER_EVENTS ))
{
// 用户事件传递给应用程序
zb_HandleOsalEvent( events );
// 这里不要返回,稍后返回0
}
……
}
程序中都调用了zb_HandleOsalEvent( events ),我们看一下协调器中怎样处理的:
voidzb_HandleOsalEvent( uint16 event )
{
uint8startOptions;
uint8logicalType;
if( event & ZB_ENTRY_EVENT )
{
initUart(uartRxCB);//初始化调试port
WIZ_SPI_Init();//初始化 SPI
Reset_W5500();
printf(“W5500 Init…\r\n”);
set_default();
set_network();
logicalType= ZG_DEVICETYPE_COORDINATOR;//配置节点类型
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
startOptions= ZCD_STARTOPT_AUTO_START;// 配置启动类型
zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
printf(“Waiting the Network…\r\n”);
}
if( event & ZB_USER_EVENTS )
{
do_tcpclient(SOCKET_TCPC); //tcp 客户端保持
osal_start_timerEx(sapi_TaskID, ZB_USER_EVENTS, ENTHER_TIMEOUT );
}
}
void
zb_HandleOsalEvent( uint16 event )
{
uint8startOptions;
uint8logicalType;
if( event & ZB_ENTRY_EVENT)
{
logicalType= ZG_DEVICETYPE_ENDDEVICE;//配置成终端节点
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
startOptions= ZCD_STARTOPT_AUTO_START;// 配置成自启动
zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
}
if( event & MY_START_EVT )
{
//nothing to do
}
if( event & MY_REPORT_TEMP_EVT )
{
ReadValue();//收集DHT11 数据
zb_SendDataRequest(0xFFFE, SENSOR_REPORT_CMD_ID,4,SensorValueBuf,0, AF_ACK_REQUEST,0);//给网关节点发送数据
osal_start_timerEx(sapi_TaskID, MY_REPORT_TEMP_EVT,myTempReportPeriod);// Timed loop collection
}
if( event & MY_FIND_COLLECTOR_EVT )
{
// 查找并绑定到收集器设备
zb_BindDevice( TRUE, SENSOR_REPORT_CMD_ID,(uint8 *)NULL);//找到协调器。启动入网
}
}
程序下载:http://wizwiki.net/forum/viewtopic.php?f=91&t=1075
By Allen,Katrina,Jerry
与我们很多其它交流:wiznetbj@wiznet.co.kr
WIZnet官方站点:http://www.iwiznet.cn
WIZnet官方微博:http://weibo.com/wiznet2012
标签:处理器 collect 方法 orm image deb display 组网 启动
原文地址:http://www.cnblogs.com/gavanwanggw/p/7043432.html