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

📄 coord_test.c

📁 zigbee精简协议栈代码
💻 C
字号:
#include "zigbee.h"		// Zigbee定义
#include "zAPL.h"	//Zigbee应用层	

//开关与LED
#define S2              3
#define S3              4
#define D1              0
#define D2              1
#define D3              2


//回调函数
//MAC层发完FRAME时触发
void AppMACFrameTransmitted(void);
//MAC层接到FRAME时触发
void AppMACFrameReceived(void);
//FRAME应答超时时触发
void AppMACFrameTimeOutOccurred(void);
//选择信道时触发
BOOL AppOkayToUseChannel(BYTE channel);
//当有RFD请求加入时触发
BOOL AppOkayToAcceptThisNode(LONG_ADDR *longAddr);
//当RFD加入后触发
void AppNewNodeJoined(LONG_ADDR *nodeAddr, BOOL bIsRejoined);
//当RFD离开网络触发
void AppNodeLeft(LONG_ADDR *nodeAddr);

//硬件初始函数
static void InitializeBoard(void);




int main(void)
{
    //地址配置开关
	BOOL bInConfigMode = FALSE;
	
	BYTE receive_length;

	EP_HANDLE ep;

    enum
    {
        SM_APP_INIT = 0,
        SM_APP_INIT_RUN,
        SM_APP_NORMAL_START,
        SM_APP_NORMAL_RUN
    } smApp;
	
	//初始化硬件
	InitializeBoard();
	//禁止看门狗
	wdt_disable();
	//按键S2是否按下
	if ( (PINA & BM(S3)) == 0 )
	{
		//进入地址配置
		bInConfigMode = TRUE;
	}

    if (!APLIsAddressAssigned())
    {
		//进入地址配置
        ConsolePutString("Address is not assigned, entering Configuration mode...\r\n");
        bInConfigMode = TRUE;
    }

	//通过串口设置地址   
	if (bInConfigMode)
	{
		LONG_ADDR longAddr;
		SHORT_ADDR short_addr;
		char idString[6];
		WORD_VAL idValue;  

		ConsolePutString("enter the board id(0-65535):\n"); 
		//点亮LED
		PORTA &= ~BM(D1);
		PORTA &= ~BM(D2);
		//等待释放按键S2
		while ((PINA&BM(S3)) == 0)
		{
		}
       
		longAddr.v[7] = MAC_LONG_ADDR_BYTE7;
		longAddr.v[6] = MAC_LONG_ADDR_BYTE6;
		longAddr.v[5] = MAC_LONG_ADDR_BYTE5;
		longAddr.v[4] = 0x00;
		longAddr.v[3] = 0x00;
		longAddr.v[2] = 0x00;
        //从串口调试助手输入6个字符,例如 “00000\”表示地址0, “00001\”表示地址1
        if (ConsoleGetString(idString, sizeof(idString)))
        {
            
            idValue.Val = (WORD)atoi(idString);
		    longAddr.v[1] = idValue.byte.MSB;
            longAddr.v[0] = idValue.byte.LSB;
			short_addr.byte.LSB = idValue.byte.LSB;
			short_addr.byte.MSB = idValue.byte.MSB;
			//设置长地址
            APLPutLongAddress(&longAddr);
			//设置短地址
			APLPutShortAddress(&short_addr);
			//更新CC2420地址
            APLUpdateAddressInfo();
			
        }
		//熄灭LED
		PORTA |= BM(D1);
		PORTA |= BM(D2);
		bInConfigMode = FALSE;
	}   
    
	//初始化协议栈
    APLInit();
	//使能协议栈 
    APLEnable();
	//建立网络  
    APLNetworkInit();
   
    smApp = SM_APP_INIT;

    while (1)
    {
        //APLTask()是协议栈任务,用来接收frame,必须保证调用这个任务,否则不能接收数据
        APLTask();

        switch (smApp)
        {
			case SM_APP_INIT:
				ConsolePutString("Starting a new network...\r\n");
				smApp = SM_APP_INIT_RUN;
				break;

			case SM_APP_INIT_RUN:
				//网络是否建立完毕,只有调用GetLastZError()返回ZCODE_NO_ERROR时,才表明成功建立
				if ( APLIsNetworkInitComplete() )
				{
					if ( GetLastZError() == ZCODE_NO_ERROR )
					{
						ConsolePutString("New network successfully started.\r\n");
						//建立网络
						APLNetworkForm();
						smApp = SM_APP_NORMAL_START;
					}
					else
					{
						//网络建立失败,重新建立
						ConsolePutString("There was an error starting network.\r\n");
						smApp = SM_APP_INIT;
					}
				}
				break;

			case SM_APP_NORMAL_START:
				//允许RFD加入网络
				APLPermitAssociation();
				smApp = SM_APP_NORMAL_RUN;
				break;

			case SM_APP_NORMAL_RUN:
				//打开2号端点,ep为指向2号端点的句柄
				ep = APLOpenEP(2);
				//设置2号端点为当前端点
				APLSetEP(ep);
				//应用主循环
				while(1){
					APLTask();
					APLSetEP(ep);
					//是否接收到数据
					if ( APLIsGetReady() )
					{
						ConsolePutString("receive data..\n");
						//第一个字节无效
						APLGet();
						//数据包长度
						receive_length = APLGet();
						//通过串口将接收数据打印出来
						while (receive_length--)
						{
							ConsolePut(APLGet());
						}
					//处理完一个数据包后必须丢弃,否则不能接受新的数据包
						APLDiscardRx();
					}
				}

				break;
        }
    }
	return 1;
}






//回调函数空实现,用户可以加入代码
void AppMACFrameTransmitted(void)
{
}


void AppMACFrameReceived(void)
{
}

void AppMACFrameTimeOutOccurred(void)
{
}

BOOL AppOkayToUseChannel(BYTE channel)
{
 return TRUE;
}

BOOL AppOkayToAcceptThisNode(LONG_ADDR *longAddr)
{
	return TRUE;
}

void AppNewNodeJoined(LONG_ADDR *nodeAddr, BOOL bIsRejoined)
{
}

void AppNodeLeft(LONG_ADDR *nodeAddr)
{

}

static void InitializeBoard(void)
{
  	DDRA |= BM(D1) | BM(D2) | BM(D3);
	PORTA |= BM(D1) | BM(D2) | BM(D3);	
    //串口初始化
	ConsoleInit();
	//SPI初始化
	SPI_Init();
	//定时器1初始化
	TickInit();
	//外部中断初始化
	EICRB |= BM(ISC71);
	EICRB &= ~BM(ISC70);//INT7为下降沿中断
	EIMSK |= BM(INT7);
	//开启全局中断
	sei();
}

//中断处理函数
//定时器1,更新系统节拍
SIGNAL(TIMER1_OVF_vect)
{
	TickUpdate();
}

//外部中断,frame发送完成中断
SIGNAL(INT7_vect)
{
	APL_ISR();
}

⌨️ 快捷键说明

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