
实验七: 广播通信
7.1 实验目的
1. 了解无线射频广播通信的基本概念;
2. 掌握无线射频广播通信的实现方式;
3. 学习无线射频广播通信的实验过程。
7.2实验原理
ZigBee 协议中,数据包能被单播传输、组播传输或者广播传输。而实现广播传输的通信叫广播通信。 广播通信是指在一个设备上发出的信息让所有设备都能接收到。
当应用程序需要将数据包发送给网络中的每一个设备时可使用广播模式,使用该模式需要指明设备 为发送还是接收,若是发送,则将 NODE_TYPE(节点类型)设置为 1,若为接收,则将其设置为 0。且发送 广播数据时其广播地址为 0xFFFF。
在本实验中,主要是实现 ZigBee 广播通信。在发送节点中设置目的地址为广播地址,让发送节点发送数据,接收节点在接收到数据后,对接收到的数据目的地址进行判断,若目的地址为自己的地址或广 播地址则接收该数据。
广播通信实验在点对点射频通信实验的基础上做了如下修改:
1. 在 main.c 文件中修改发送节点和接收节点的地址宏;
2. 修改 basicRfSendPacket 函数的第一个参数,将其改为广播地址 0xFFFF。修改如下: ret=basicRfSendPacket(0xffff,pTxData,sizeof pTxData)。
本实验使用 3 个 ZigBee 模块来完成广播通信,其中:标注为 Status 的作为 Zigbee 发送模块,标注 为 Data 的为 ZigBee 接收模块。程序运行时,发送模块将数据以广播方式发出。所有接收模块接收该信 息,并将此信息通过串口调试助手反馈至 PC 机。
7.2.1 电路分析与程序配置
本实验所使用的是 LED 接口电路,Uart 接口电路及 CC2530 的 RF 接口,原理图如下:


7.3 实验步骤
1. 使用 IAR 软件打开:【配套光盘04-实验例程02-ZigBee 技术与应用第四章 CC2530 无线通信 实验4.2 广播通信实验代码】中的工程文件“broadcast.eww”。

2. 使用 USB3.0 数据线连接 ZigBee(Status)模块与 ZB-LINK 调试器的 Debug 口,使用 USB 方口 线连接 ZB-LINK 调试器的 USB-Debug 端与 PC 机的 USB 口。
3. 将代码中的 NODE_TYPE 设置为1后,点

编译,再点

将程序下载到 ZigBee(Status)模块, 下载完成后,点

运行,然后再点

退出。

4. 将USB3.0数据线的一端接到其中一个ZigBee(Data)模块,然后将代码中的NODE_TYPE设置为0, 再将 RECV_ADDR 设置为 0x2510。之后,点

编译,再点

将程序下载到 ZigBee(Status)模块,下载完成后,点

运行,然后再点

退出。

5. 将USB3.0数据线的一端接到另外一个ZigBee(Data)模块,然后将代码中的NODE_TYPE设置为0, 再将 RECV_ADDR 设置为 0x2520。之后,点

编译,再点

将程序下载到 ZigBee(Status)模 块,下载完成后,点

运行,然后再点

退出。

6. 再使用一根 USB 方口线连接 ZB-LINK 调试器的 USB-485 端与 PC 机的 USB 口,使用 RJ11 连接线 将 ZB-LINK 调试器的 RS-485 端与 ZigBee(Data)模块。
7. 再使用 USB3.0 数据线的一端连接 ZigBee(Status)模块,另一端仍然连接的是 ZB-LINK 调试 器的 Debug 端。
8. 打开串口调试助手软件,将波特率设置成 19200 并设置好端口号(如:

)后观察数据 接收结果,当有结果输出后,再点击串口调试助手软件中的关闭串口。

9. 将步骤(6)中的 ZigBee(Data)模块换成另外一个 ZigBee(Data)模块,然后再往下进行。
7.4实验源码
//19200Bps
/*
3个模块全用上(Status模块为广播数据,Data模块为接收数据)
将名为Status的模块作为发送,将NODE_TYPE=1,然后编译烧写
将名为Data的模块作为接收, 将NODE_TYPE=0,然后将其中一个模块的
RECV_ADDR设为0x2510,然后编译烧写,再将另外一个模块的
RECV_ADDR设为0x2520,然后编译烧写。
将Status模块与其中一个Data模块拼在一起,线都接Status上,然后观察串口
将Status模块与另外一个Data模块拼在一起,线都接Status上,然后观察串口
只能分开接两接收模块来观察数据。
*/
#include <iocc2530.h>
#include "hal_mcu.h"
#include "hal_assert.h"
#include "hal_board.h"
#include "hal_rf.h"
#include <stdio.h>
#include "basic_rf.h"
#define NODE_TYPE 1 // 0:接收节点,1:发送节点
#define RF_CHANNEL 25 // 2.4 GHz RF channel
#define PAN_ID 0x2007 // 接收 接收
#define SEND_ADDR 0x2530 // 节点2 节点1
#define RECV_ADDR 0x2520 // 节点短地址(0x2510<->9488,0x2520<->9504)
static basicRfCfg_t basicRfConfig;
//-RF数据发送-------------------------------------------------------------------
void rfSendData(void)
{
uint8 pTxData[] = {'H', 'e', 'l', 'l', 'o', ' ', 'c', 'c', '2', '5', '3', '0', 'r', 'n'};
uint8 ret;
basicRfReceiveOff(); //关RF接收
while(TRUE)
{
/*发送广播数据*/
printf("Send: %s", pTxData);
ret = basicRfSendPacket(0xffff, pTxData, sizeof pTxData);
if(ret == SUCCESS) //如果发送成功,LED亮100ms,灭900ms
{
hal_led_on(1);
halMcuWaitMs(100);
hal_led_off(1);
halMcuWaitMs(900);
}
else //如果发送失败,LED亮1s后熄灭
{
hal_led_on(1);
halMcuWaitMs(1000);
hal_led_off(1);
}
}
}
//-RF数据接收-------------------------------------------------------------------
void rfRecvData(void)
{
uint8 pRxData[128]; //定义接收数据缓冲区
int rlen; //定义接收数据量变量
basicRfReceiveOn(); //开RF接收器
while(TRUE)
{
while(!basicRfPacketIsReady()); //等待RF接收
rlen = basicRfReceive(pRxData, sizeof pRxData, NULL); //开始RF接收
/*输出接收信息*/
if(rlen > 0)
{
pRxData[rlen] = 0;
printf("My Address %u , recv:", RECV_ADDR);
printf((char *)pRxData);
}
}
}
//=主函数=======================================================================
void main(void)
{
halMcuInit(); //MCU初始化
hal_led_init(); //LED初始化
hal_uart_init(); //Uart初始化
if(FAILED == halRfInit()) //RF初始化
{
HAL_ASSERT(FALSE); //错处处理
}
//RF配置过程
basicRfConfig.panId = PAN_ID; //网络号
basicRfConfig.channel = RF_CHANNEL; //信道值
basicRfConfig.ackRequest = TRUE; //应答位
#ifdef SECURITY_CCM //安全密钥
basicRfConfig.securityKey = key;
#endif
//Initialize BasicRF //节点地址
#if NODE_TYPE
basicRfConfig.myAddr = SEND_ADDR; //发送地址
#else
basicRfConfig.myAddr = RECV_ADDR; //接收地址
#endif
if(basicRfInit(&basicRfConfig)==FAILED) //写入RF配置
{
HAL_ASSERT(FALSE);
}
#if NODE_TYPE //根据节点类型收/发数据
rfSendData();
#else
rfRecvData();
#endif
}
7.5 实验结果与分析
打开串口调试助手以后,可以看到,由 ZigBee(Status)模块发出的广播数据可被不同接收地址的 ZigBee(Data)模块接收。每次发出信息时,ZigBee(Status)模块所对应的 LED 指示灯按一定时间间 隔闪烁。
