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

📄 rfd_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);
//RFD加入网络时触发
BOOL AppOkayToAssociate(void);
//选择信道时触发
BOOL AppOkayToUseChannel(BYTE channel);

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

int main(void)
{
	//端点句柄
	EP_HANDLE test_ed;
	//传送ID
	TRANS_ID trans_id = 0;
	//协调器地址
	SHORT_ADDR coord;
	//地址配置开关
	BOOL bInConfigMode = FALSE;
    enum
    {
        SM_APP_INIT = 0,
        SM_APP_CONFIG_START,
        SM_APP_NORMAL_START,
        SM_APP_NORMAL_START_WAIT,
        SM_APP_NORMAL_RUN,
        SM_APP_SLEEP
    } smApp;
	//初始化硬件
	InitializeBoard();
	//禁止看门狗
	wdt_disable();
	//按键S2是否按下
	if ( (PINA & BM(S3)) == 0 )
	{
		//进入地址配置
		bInConfigMode = TRUE;
	}
    
    if ( !APLIsAddressAssigned() )
    {	
		//进入地址配置
		ConsolePutString("MAC 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();
	
    smApp = SM_APP_INIT;

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

        switch(smApp)
        {
			case SM_APP_INIT:
				ConsolePutString("Attempting to join a coordinator...\r\n");
				//加入网络		
				APLJoin();
		
				while (1)
				{
					APLTask();
					//加入是否完毕,只有调用GetLastZError()返回ZCODE_NO_ERROR时,才表明成功加入
					if ( APLIsJoinComplete() )
					{
						if ( GetLastZError() == ZCODE_NO_ERROR )
						{
							ConsolePutString("Successfully associated.\r\n");
							 smApp = SM_APP_NORMAL_RUN;
						}
						else
						{
							//加入失败,重新加入
							ConsolePutString("Failed to associate.\r\n");	
						}
						break;
					}
				}
				break;

			case SM_APP_NORMAL_RUN:
				//设置协调器地址,网络的协调器地址都是0
				coord.Val = 0;
				//打开2号端点,test_ed为指向2号端点的句柄
				test_ed = APLOpenEP(2);
				//设置alex_ed为当前端点
				APLSetEP(test_ed);
				//发送数据
				while (1)
				{
					APLTask();
					//发送数据给协调器					
					if (APLIsPutReady())
					{
						APLSetEP(test_ed);
						//配置不用更改
						currentMessageInfo.flags.Val = APS_MESSAGE_DIRECT |         \
										   APS_MESSAGE_SHORT_ADDRESS |  \
										   APS_MESSAGE_NO_ACK;          \
						currentMessageInfo.frameType              = MSG_FRAME;      
						currentMessageInfo.profileID              = MY_PROFILE_ID;            
						currentMessageInfo.clusterID              = PICDEMZ_DEMO_CLUSTER_ID;            
						//源节点端点号
						currentMessageInfo.srcEP                  = 2;    
						//目的节点地址,设为协调器
						currentMessageInfo.destAddress.shortAddr  = coord;   
						//目的节点端点号,必须与目的节点端点号,否则接受不到数据
						currentMessageInfo.destEP                 = 2;  
						//数据包长度
						currentMessageInfo.dataLength             = 14;             
						//数据包内容
						currentMessageInfo.dataPointer            = "alex come in\n";

						currentMessageInfo.transactionID          = GENERATE_TRANS_ID;
						//发送数据
						trans_id = APLSendMessage( &currentMessageInfo );

						if (trans_id == TRANS_ID_INVALID)
						{
							//发送失败
							ConsolePutString("can not send app data\n");
						}	
						
						//可以加入延时	
					}
				
				}
				break;
			}
	}
	return 1;
}

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

void AppMACFrameReceived(void)
{
}

void AppMACFrameTimeOutOccurred(void)
{
}

BOOL AppOkayToAssociate(void)
{
    return TRUE;
}

BOOL AppOkayToUseChannel(BYTE channel)
{
     return TRUE;
}

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