📄 ping_pong.c
字号:
//===================================================================================================================
//名称:基于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 + -