⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ping_pong.c

📁 基于ZIGBEE无线网络的水表抄表程序 代码完整
💻 C
📖 第 1 页 / 共 2 页
字号:
//===================================================================================================================
//名称:基于ZIGBEE无线网络的水表抄表程序
//人员:
//时间  2008.07.17
//环境:IAR7.20A, CC2430F128, TI ZIGBEE精简协议包
//版本:V1.0
//说明:系统由协调器(COORD),路由节点(FFD)构成。所有模块上的时钟由电池供电。
//
//      COORD供电由市电变压后共给,可考虑设计备用电池,当检测市电掉电后使用备用电池供电,并且
//      比FFD提前1-3分钟(可设定)唤醒。
//      COORD不主动发送任何呼叫信息到FFD,以免过多占用信道,只是等待FFD输出信息后回复自身时间。
//      当所有表都完成数据传递,发送广播(精简协议不支持广播)关闭所有FFD包括自身.
//
//      FFD到达设定时间后被时钟外中断唤醒,唤醒后立即寻找附近网络,如果不能加入网络,等待规定时间
//      后重新寻找,建立网络后将读取表数据并传送到COORD,然后等待接收COORD回复的时间,如果在规定时
//      间内没有接收到时间回复,可以考虑重新发送数据到COORD。接收到时间后,与自身时间比较,如果误
//      差在允许范围内,将不进行任何修改,如果超过最大可修改误差,将被认为数据有误,不修改时间,
//      只发送错误数据到COORD,
//
//      FFD需要设定的数据项:当前时间,周唤醒时间,月唤醒时间,工作状态时间,PANID,表号,允许时间
//      误差,允许最大校时时间(防止严重的回复延时),允许最大回复时间,入网重复时间。
//
//      COORD需要设定的数据项:当前时间,周唤醒时间,月唤醒时间,提前唤醒时间,工作状态时间,PANID
//      ,本网络表数量.
//===================================================================================================================
#include "msstate_lrwpan.h"

#ifdef LRWPAN_COORDINATOR
#define PING_DELAY   0           //协调器不等待立刻发送回复
#endif
#ifdef LRWPAN_ROUTER
#define PING_DELAY   0           //路由器不等待立刻转发数据
#endif
#ifdef LRWPAN_RFD
#define PING_DELAY   3           //节点等待3秒后循环发送数据
#endif

typedef enum _PP_STATE_ENUM {
	PP_STATE_START_RX,
	PP_STATE_WAIT_FOR_RX,
	PP_STATE_SEND,
	PP_STATE_WAIT_FOR_TX
}PP_STATE_ENUM;                  //接收发送状态结构体

PP_STATE_ENUM    ppState;        //接收发送状态结构体变量
LADDR_UNION      dstADDR;        //目标短地址,这里应为coord
UINT32           my_timer;       //记录时间变化到各设备要求等待方式时间
//-------------------------------------------------------------------------------------------------------------------
UINT8  now_time[7];             //当前时间
UINT8  week_time[3];            //设定每周报警时间,全0不报警。
UINT8  mon_time;                //设定月报警,非0允许报警。每月上午00时00分00秒。
UINT8  work_time;               //工作状态时间,单位秒。最大255秒、
UINT8  REC_FLAG;                //接收完成标志,0完成,1忙
//PANIN现为宏定义形式,应改成变量形式。

#ifndef LRWPAN_COORDINATOR
UINT8  rfd_addr_num = 20;       //设定当前网络应有rfd数目或最大数目。
UINT8  rfd_addr_data_count= 0;  //coord中存储RFD地址和数据缓冲区的条目数计数值。
UINT8  rfd_first_work_time= 0;  //coord提前唤醒时间,单位秒,最大255秒。

UINT8  rfd_addr_data[20][14];   //coord中存储的RFD地址和数据缓冲区,数目必须与rfd_addr_num相同。
#else
UINT8  rfd_err_time= 0;         //允许时间误差
UINT8  rfd_max_err_time= 0;     //最大允许调整时间
UINT8  rfd_max_back_time= 0;    //最大回复时间
UINT8  rfd_join_time= 0;        //加入网络重复时间
#endif
UINT8  rfd_addr[6]={0x11,0x22,0x33,0x44,0x55,0x66};             //RFD所在表的表地址。
UINT8  rfd_data[8]={0x1a,0x8a,0x9a,0xaa,0xba,0xca,0xda,0xea};   //RFD所在表的表数据。
UINT8  router_data[8];                                          //路由器转发数据缓冲区。
//===================================================================================================================
void   PingPong(void);

//===================================================================================================================
//函数名称:主函数
//入口参数:无
//出口参数:无
//备注说明:完成COORD和FFD功能,注意宏声明范围!
//===================================================================================================================
void main (void){

	my_timer = 0;                                //发送延时时间计量
        REC_FLAG = 1;                                //接收数据忙状态

	halInit();                                   //物理层初始化
	evbInit();                                   //硬件初始化
	aplInit();                                   //应用层初始化

	conPrintConfig();                            //发送常规信息到串口,调试用途,可去掉。
	EVB_LED1_OFF();                              //指示灯LED1关
	EVB_LED2_OFF();                              //指示灯LED2关
        //-------------------------------------------------------
        //IO_FUNC_PORT_PIN (0, 1, IO_FUNC_PERIPH);   //P01 peripheral function
        //IO_DIR_PORT_PIN  (0, 1, IO_IN         );   //P01 INPUT
        //IO_IMODE_PORT_PIN(0, 1, IO_IMODE_PUD  );   //P01 PULL_UP_DOWN
        //IO_PUD_PORT      (0,    IO_PULLUP     );   //P01 PULL_UP

        //IEN1  |= 0X20;                             //p0  interrupt enable
        //PICTL |= 0x08;                             //Enable interrupt from P0_1 low
        //PICTL |= 0x01;                             //Falling edge gives interrupt
        //P0IFG  = 0X00;                             //P0  FLAG CLR

        ENABLE_GLOBAL_INTERRUPT();                   //enable interrupts
//-------------------------------------------------------------------------------------------------------------------
#ifdef LRWPAN_COORDINATOR
	aplFormNetwork();                                         //建立网络
	while(apsBusy()) {apsFSM();}                              //等待建立网络结束
	conPrintROMString("Network formed, waiting for RX\n");    //建立网络成功后串口输出信息
	EVB_LED1_ON();                                            //建立网络后指示灯亮
	ppState = PP_STATE_START_RX;                              //建立网络后RF设置为输入数据状态
#else
	do {
		aplJoinNetwork();                                 //加入网络
		while(apsBusy()) {apsFSM();}                      //等待加入网络
		if (aplGetStatus() == LRWPAN_STATUS_SUCCESS) {    //加入网络成功后串口输出父节点相关信息
			EVB_LED1_ON();                            //加入网络后指示灯亮
			conPrintROMString("Network Join succeeded!\n");
			conPrintROMString("My ShortAddress is: ");
			conPrintUINT16(aplGetMyShortAddress());
			conPCRLF();
			conPrintROMString("Parent LADDR: ")
			conPrintLADDR(aplGetParentLongAddress());
			conPrintROMString(", Parent SADDR: ");
			conPrintUINT16(aplGetParentShortAddress());
			conPCRLF();
			break;
		}else {                                           //加入网络失败,串口输出相关信息,等待2秒后重新加入
			conPrintROMString("Network Join FAILED! Waiting, then trying again\n");
			my_timer= halGetMACTimer();                                          //获取当前时钟数
			while ((halMACTimerNowDelta(my_timer))< MSECS_TO_MACTICKS(2*1000));  //等待2秒后从新加入网络
		}
	} while(1);

#endif
//-------------------------------------------------------------------------------------------------------------------
#ifdef  LRWPAN_COORDINATOR
	aplSetMacMaxFrameRetries(0);
	while (1) {
	  apsFSM();                        //应用层处理函数
	}
#endif
//-------------------------------------------------------------------------------------------------------------------
#ifdef LRWPAN_ROUTER
	//router does nothing, just routes
	DEBUG_PRINTNEIGHBORS(DBG_INFO);
	conPrintROMString("Router, doing its thing!\n");
	while(1) {
          apsFSM();                                              //应用层处理函数

          if(REC_FLAG == 0){
	     ppState = PP_STATE_SEND;                            //设置为发送状态
             dstADDR.saddr = aplGetParentShortAddress();         //目标地址为父节点地址
             PingPong();                                         //发送数据到目标地址
             if  (EVB_LED1_STATE())   EVB_LED1_OFF();            //指示灯灭
             else                     EVB_LED1_ON();             //指示灯亮
          }
        }
#endif
//-------------------------------------------------------------------------------------------------------------------
#ifdef  LRWPAN_RFD
	aplSetMacMaxFrameRetries(0);                                 //设置构造最大重试数
	while (1) {
                  conPrintROMString("OK_Sleep!");
                  conPCRLF();
                  ENABLE_GLOBAL_INTERRUPT();                         //enable interrupts
                  halSleep( 2000 );
                  conPrintROMString("OK_SleepOUT!");
                  conPCRLF();
                //-------------------------------------------------
	        do {
		    aplJoinNetwork();
		    while(apsBusy()) {apsFSM();}                     //wait for finish
		    if (aplGetStatus() == LRWPAN_STATUS_SUCCESS) {
			EVB_LED1_ON();
			conPrintROMString("Network Join succeeded!\n");
			conPrintROMString("My ShortAddress is: ");
			conPrintUINT16(aplGetMyShortAddress());
			conPCRLF();
			conPrintROMString("Parent LADDR: ")
			conPrintLADDR(aplGetParentLongAddress());
			conPrintROMString(", Parent SADDR: ");
			conPrintUINT16(aplGetParentShortAddress());
			conPCRLF();
                        //-----------------------------------------
	                dstADDR.saddr = aplGetParentShortAddress();                          //RFD sends to the coordinator
	                ppState = PP_STATE_SEND;
                        //-----------------------------------------
			break;
		    }else {
			conPrintROMString("Network Join FAILED! Waiting, then trying again\n");
			my_timer= halGetMACTimer();                                          //获取当前时钟数
			while ((halMACTimerNowDelta(my_timer))< MSECS_TO_MACTICKS(2*1000));  //等待2秒后从新加入网络
		    }
	        } while(1);
                //-------------------------------------------------
                apsFSM();
                PingPong();                                         //发送数据到COORD
                if  (EVB_LED1_STATE())   EVB_LED1_OFF();            //指示灯灭
                else                     EVB_LED1_ON();             //指示灯亮
        }
#endif
}
//================================================================================================
//函数名称:
//入口参数:无
//出口参数:无
//备注说明:
//########## Callbacks ##########

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -