📄 zigbee.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 + -