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