?? 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 + -