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

📄 zigbee.c

📁 制作Zigbee模块的详细电路原理图和C代码
💻 C
字号:
//=============================================================
// 文件名称:Zigbee.c
// 功能描述:定义Zigbee的用户API接口函数
// 维护记录:2007-12-27	V1.0
//=============================================================
#include "Zigbee.h"

short Broadcast_Flag=0;
unsigned char Broadcast_Word[2];
short NetPlay_NetStatus=0;
NETPLAY_SERVER NetPlay_Server[NETPLAY_MAX_SERVER];
short NetPlay_ServerCnt;
short NetPlay_DstAddr;

//=============================================================
// 语法格式:void Zigbee_TimerInit(void)
// 功能描述:初始化Zigbee用到的Timer
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_TimerInit(void)
{
	*Zigbee_Timer_CLK_SEL &= ~0x00FF;
	*Zigbee_Timer_CLK_SEL |= 199;
	*Zigbee_Timer_CLK_SEL &= ~C_Zigbee_TimerCLK_27M;		// 设置Timer的时钟源为27M的200分频

	*Zigbee_Timer_CLK_CONF = 0x00000000;					// 复位Timer
	*Zigbee_Timer_CLK_CONF = 0x00000003;					// 打开Timer的时钟
	
	*Zigbee_Timer_PRELOAD_DATA = 65536-(27000000/200)/1000; // 设置定时周期为1ms
	*Zigbee_Timer_CCP_CTRL = C_TIMER_NOR_MODE; 				// 设置为定时模式
	*Zigbee_Timer_MODE_CTRL = C_TIMER_INT_FLAG | C_TIMER_INT_EN | C_TIMER_CTRL_EN;// 打开Timer中断并使能Timer
	*P_INT_MASK_CTRL1 &= ~C_INT_TIMER_DIS;					// 中断控制器取消屏蔽Timer中断	
}

//=============================================================
// 语法格式:void Zigbee_Init(void)
// 功能描述:Zigbee模块初始化,包含初始化接口、初始化Timer及设置UZ2400的初始状态
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_Init(void)
{
	InitZB_interface();				// 设置IOA0\1
	Zigbee_TimerInit();
	INIT_UNET();	
}

//=============================================================
// 语法格式:unsigned short Zigbee_CreateNet(unsigned short ID, unsigned char Channel)
// 功能描述:建立局域网一直到建立成功
// 入口参数:ID:本机的节点ID号,一般为0.
//			 Channel:建立的局域网号,也叫通道号,有效值为:11~26
// 出口参数:SUCCESS:成功
//=============================================================
unsigned short Zigbee_CreateNet(unsigned short ID, unsigned char Channel)
{
	while(ESTABLISH_UNET(ID, Channel ) != SUCCESS);
	return SUCCESS;
}

//=============================================================
// 语法格式:unsigned short Zigbee_JoinNet(unsigned short Pan_ID, unsigned char Channel)
// 功能描述:加入某一通道的局域网,如果Channel网还没有被建立,则建立Channel指定的局域网
// 入口参数:Pan_ID:本机的节点ID
//			 Channel:要加入或者建立的局域网号
// 出口参数:网络地址
//=============================================================
unsigned short Zigbee_JoinNet(unsigned short Pan_ID, unsigned char Channel)
{
	if(NetPlay_NetStatus==0)
	{
		while(JOIN_UNET(Pan_ID, Channel) != SUCCESS);
		NetPlay_NetStatus = 1;
	}
	NetPlay_ServerCnt = 0;
	return UnetSys.NwkAddr;
}

//=============================================================
// 语法格式:unsigned short Zigbee_GetWord(unsigned short *Buf)
// 功能描述:接收一个字的数据
// 入口参数:Buf:接收数据存储地址
// 出口参数:-1:没有接收到数据
//			 其他:源数据网络地址
//=============================================================
unsigned short Zigbee_GetWord(unsigned short *Buf)
{
	short Ret=-1, Temp;
	unsigned char Data_Buf[100];
		
	if(CHECK_UNET_DATA() >0)
	{
		Ret = UnetSys.DataHead->SrcAddr;
		RECV_FROM_UNET(Data_Buf);
		*Buf = Data_Buf[1]<<8;
		*Buf |= Data_Buf[0];
		Temp = Broadcast_Flag;
		Broadcast_Flag = 0;
		Broadcast_Flag = Temp;
	}
	else
		*Buf = -1;
	return Ret;
}

//=============================================================
// 语法格式:void Zigbee_Broadcast(unsigned short Word)
// 功能描述:网络广播数据
// 入口参数:Word:数据
// 出口参数:无
//=============================================================
void Zigbee_Broadcast(unsigned short Word)
{
	Broadcast_Word[0] = Word&0xFF;
	Broadcast_Word[1] = Word>>8;
	Broadcast_Flag = 1;
}

//=============================================================
// 语法格式:void Zigbee_SendWord(unsigned short Addr, unsigned short Word)
// 功能描述:发送一个字的数据
// 入口参数:Addr:发送目标网络地址
//			 Word:发送数据
// 出口参数:源数据地址
//=============================================================
void Zigbee_SendWord(unsigned short Addr, unsigned short Word)
{
	unsigned char Data_Buf[2];
	
	Data_Buf[0] = Word&0xFF;
	Data_Buf[1] = Word>>8;
	SEND_TO_UNET(Addr, Data_Buf, 2);
}

//=============================================================
// 语法格式:void Zigbee_StopBroadcast(void)
// 功能描述:停止广播
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_StopBroadcast(void)
{
	Broadcast_Flag = 0;
}

//=============================================================
// 语法格式:void Zigbee_OnHalfSecond(void)
// 功能描述:网络服务器生命周期消耗(中断服务中调用,用户无需关心)
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_OnHalfSecond(void)
{
	short i;
	if(Broadcast_Flag)
	{
		SEND_TO_UNET(0xFFFF, Broadcast_Word, 2);
	}
	for(i=0; i<NetPlay_ServerCnt; i++)
		if(NetPlay_Server[i].LifeTime>0)
			NetPlay_Server[i].LifeTime--;
}

//=============================================================
// 语法格式:void Zigbee_ServiceLoop(void)
// 功能描述:Zigbee服务程序,MAC处理并检测节点是否存在,通常在主函数的主循环中调用
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_ServiceLoop(void)
{
	if(NetPlay_NetStatus == 1)
	{
		CHECK_UNET_DATA();
		ChackChild();
	}
}

//=============================================================
// 语法格式:void Zigbee_DisConnect(void)
// 功能描述:断开Zigbee网络连接
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_DisConnect(void)
{
	INIT_UNET();
	NetPlay_NetStatus = 0;
}

//=============================================================
// 中断服务函数
//=============================================================
unsigned short	usWaitTime = 0;
unsigned short usProtocolRecv = 0;
unsigned short usAddrREQTimer = 5000;
void unet_msg_dispatch();
extern ADDR_LIST	stAddrList;

//=============================================================
// 语法格式:void Zigbee_TimerIRQ_Service(void)
// 功能描述:Zigbee的Timer中断服务函数,该函数在IRQ56中调用
//			 网络生命时间处理
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_TimerIRQ_Service(void)
{
	static short MS_Count=0;
	if(*Zigbee_Timer_MODE_CTRL & C_TIMER_INT_FLAG)
	{
		unsigned char i;
	
		if(usWaitTime != 0)
		{
			usWaitTime -- ;
		}
		if(usProtocolRecv != 0)
		{
			usProtocolRecv -- ;
		}
		for(i=0;i<stAddrList.ucAddrCont;i++)
		{
			if( stAddrList.LifeTime[i] != 0 )stAddrList.LifeTime[i]--;
		}
		if( usAddrREQTimer != 0 )
		{
			usAddrREQTimer --;
		}
		MS_Count += 1;
		if(MS_Count==500)
			Zigbee_OnHalfSecond();
		if(MS_Count==1000)
		{
			Zigbee_OnHalfSecond();
			MS_Count = 0;
		}
		*Zigbee_Timer_MODE_CTRL |= C_TIMER_INT_FLAG;
	}		
}

//=============================================================
// 语法格式:void Zigbee_EXTIRQ_Service(void)
// 功能描述:Zigbee的外部中断服务函数,该函数在IRQ28中调用
//			 处理由UZ2400触发的中断
// 入口参数:无
// 出口参数:无
//=============================================================
void Zigbee_EXTIRQ_Service(void)
{
	INTERRUPT_STS IntStatus;
	spi_sr_IRQ(ISRSTS, ((UINT8 *) &IntStatus));
	if(IntStatus.TxN){ 						// 发送一帧数据成功
		UnetSys.IntFlag.TxN = 1;
	}
	if(IntStatus.TxG1){

	}
	if(IntStatus.TxG2){

	}
	if(IntStatus.Rx){ 						// 接收一帧数据
		unet_msg_dispatch();
	}
	if(IntStatus.Sec){ 						//
		UnetSys.IntFlag.Sec = 1;
	}
	if(IntStatus.Timer){

	}
	if(IntStatus.Wakeup){

	}
	if(IntStatus.Sleep){
		
	}
	*P_IOA_GPIO_INT |= 0x01010000;			//清标志位	
}

⌨️ 快捷键说明

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