1.搭建开发环境
首先下载IAR软件,需要破译,就不细说了。
推荐使用德州仪器官方的包,最原始。
解压完之后是三个文件夹:
直接双击ide文件夹,再双击cc2530_sw_examples.eww。
遇到问题不要怕,一直选择是。
因为版本问题需要修改以下地方:
编译一下无报错,无警告,开发环境搭建完成。
2.A板按键控制B板LED灯状态
实验器材:两块zigbee开发板(我用的是国赛黑板),两个充电器,一根CCDebug下载器。
打开light_switch - srf05_cc2530中的application文件夹,打开light_switch.c文件夹注释掉以下不用的代码:/* LOCAL VARIABLES*/以下全部注释掉。
A板代码:
#include <hal_lcd.h>
#include <hal_led.h>
#include <hal_joystick.h>
#include <hal_assert.h>
#include <hal_board.h>
#include <hal_int.h>
#include "hal_mcu.h"
#include "hal_button.h"
#include "hal_rf.h"
#include "util_lcd.h"
#include "basic_rf.h"
/***********************************************************************************
* CONSTANTS
*/
// Application parameters
#define RF_CHANNEL 20 // 2.4 GHz RF channel
// BasicRF address definitions
#define PAN_ID 0x1234
#define SWITCH_ADDR 0x000A
#define LIGHT_ADDR 0x000B
#define APP_PAYLOAD_LENGTH 1
#define LIGHT_TOGGLE_CMD 0
// Application states
#define IDLE 0
#define SEND_CMD 1
// Application role
#define NONE 0
#define SWITCH 1
#define LIGHT 2
#define APP_MODES 2
static basicRfCfg_t basicRfConfig;
//无线初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.myAddr = SWITCH_ADDR;
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
#define SW1 P1_2
#define D4 P1_1
unsigned char send_cmd = 0xA1;
unsigned char receive_cmd = 0;
void Init_Port()
{
//LED
P1SEL &= ~0x02;
P1DIR |= 0x02;
//SW1
P1SEL &= ~0x04;
P1DIR &= ~0x04;
P1INP &= ~0x04;
P2INP &= ~0x40;
}
void delay(unsigned int i)
{
unsigned int j,k;
for(j=0;j<i;j++)
{
for(k=0;k<500;k++);
}
}
void scan_keys()
{
if(SW1 == 0)
{
delay(2);
if(SW1 == 0)
{
basicRfSendPacket(LIGHT_ADDR,&send_cmd,1);
while(SW1 == 0);
}
}
}
/************************MAIN************************/
void main()
{
halBoardInit();
ConfigRf_Init();
Init_Port();
while(1)
{
scan_keys();
if(basicRfPacketIsReady() == TRUE)
{
basicRfReceive(&receive_cmd, 1, NULL);
if(receive_cmd == 0xA1)
{
D4 = ~D4;
}
}
}
}
B板代码:
#include <hal_lcd.h>
#include <hal_led.h>
#include <hal_joystick.h>
#include <hal_assert.h>
#include <hal_board.h>
#include <hal_int.h>
#include "hal_mcu.h"
#include "hal_button.h"
#include "hal_rf.h"
#include "util_lcd.h"
#include "basic_rf.h"
/***********************************************************************************
* CONSTANTS
*/
// Application parameters
#define RF_CHANNEL 20 // 2.4 GHz RF channel
// BasicRF address definitions
#define PAN_ID 0x1234
#define SWITCH_ADDR 0x000B
#define LIGHT_ADDR 0x000A
#define APP_PAYLOAD_LENGTH 1
#define LIGHT_TOGGLE_CMD 0
// Application states
#define IDLE 0
#define SEND_CMD 1
// Application role
#define NONE 0
#define SWITCH 1
#define LIGHT 2
#define APP_MODES 2
static basicRfCfg_t basicRfConfig;
//无线初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.myAddr = SWITCH_ADDR;
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
#define SW1 P1_2
#define D4 P1_1
unsigned char send_cmd = 0xA1;
unsigned char receive_cmd = 0;
void Init_Port()
{
//LED
P1SEL &= ~0x02;
P1DIR |= 0x02;
//SW1
P1SEL &= ~0x04;
P1DIR &= ~0x04;
P1INP &= ~0x04;
P2INP &= ~0x40;
}
void delay(unsigned int i)
{
unsigned int j,k;
for(j=0;j<i;j++)
{
for(k=0;k<500;k++);
}
}
void scan_keys()
{
if(SW1 == 0)
{
delay(2);
if(SW1 == 0)
{
basicRfSendPacket(LIGHT_ADDR,&send_cmd,1);
while(SW1 == 0);
}
}
}
/************************MAIN************************/
void main()
{
halBoardInit();
ConfigRf_Init();
Init_Port();
while(1)
{
scan_keys();
if(basicRfPacketIsReady() == TRUE)
{
basicRfReceive(&receive_cmd, 1, NULL);
if(receive_cmd == 0xA1)
{
D4 = ~D4;
}
}
}
}
2.代码分析:
相当于只改了信道号、PAN_ID、本机地址、目标地址,定义了发送和接收的变量,代码自由发挥,主函数里初始化无线射频函数,循环里先判断后写写接收。
1.设置: 1.RF_CHANNEL(信道号) 2.PAN_ID 3.SWITCH_ADDR(本机地址) 4.LIGHT_ADDR(目标地址)
2.无线初始化:
初始化PAN_ID RF_CHANNEL SWITCH_ADDR basicRfConfig.ackRequest表示发送方希望接收方在成功接收到数据后发送一个确认信号。这有助于确保数据的可靠传输
while(basicRfInit(&basicRfConfig) == FAILED); 循环会不断调用basicRfInit
函数,直到它返回的不是FAILED
(即初始化成功)
basicRfReceiveOn() ;启动或打开射频(RF)模块的接收功能
3.按键扫描函数
basicRfSendPacket(LIGHT_ADDR,&send_cmd,1);如果按键SW1按下,则发送数据
while(SW1 == 0);松手检测,保证按下一次只发送一个数据
4.main函数
如果接收数据正确,D4灯翻转。
if(basicRfPacketIsReady() == TRUE)
{
basicRfReceive(&receive_cmd, 1, NULL);
if(receive_cmd == 0xA1)
{
D4 = ~D4;
}
}
效果:
以上是一个简单的通信示例。