📄 rfd_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);
//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( ¤tMessageInfo );
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 + -