实验5--点对点无线通讯实验

更新时间:2023-10-02 20:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验题目:实验5--点对点无线通讯实验 实验时间:2015.12.2

一、 实验目的:

使用IAR开发环境设计R程序,利用2个CC2530 ZigBee模块实现点对点无线通讯。

二、 实验原理及程序分析:

a) 硬件接口原理

ZigBee(CC2530)模块 LED 硬件接口

ZigBee(CC2530)模块硬件上设计有 2 个 LED 灯,用来编程调试使用。分别连接 CC2530 的 P1_0、P1_1两个 IO 引脚。从原理图上可以看出,2 个 LED 灯共阳极,当 P1_0、P1_1 引脚为低电平时候,LED 灯点亮。

b) ? 关键函数

1、 射频初始化函数 uint8 halRfInit(void)

功能描述:zigbee 通信设置,自动应答有效,设置输出功率0dbm,Rx设置,接收中断

有效。

参数描述: 无

返回: 配置成功返回 SUCCESS

2、发送数据包函数

uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)

功能描述:发送包函数。

入口参数:destAddr 目标网络短地址 pPayload 发送数据包头指针, length 包的大小 出口参数:无

返 回 值:成功返回SUCCESS,失败返回FAILED

3、接收数据函数

uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi) 功能描述: 从接收缓存中拷贝出最近接收到的包。 参数: 接收数据包头指针

1

接收包的大小

返回: 实际接收的数据字节数

c) 软件设计

void main (void) {

uint8 i;

appState = IDLE; // 初始化应用状态为空闲 appStarted = FALSE; // 初始化启动标志位FALSE /* 初始化Basic RF */

basicRfConfig.panId = PAN_ID; // 初始化个域网ID basicRfConfig.ackRequest = FALSE; // 不需要确认 halBoardInit();

if(halRfInit()==FAILED) //初始化hal_rf HAL_ASSERT(FALSE);

/* 快速闪烁8次led1,led2 */ for(i = 0; i < 16; i++) {

halLedToggle(1); // 切换led1的亮灭状态 halLedToggle(2); // 切换led2的亮灭状态 halMcuWaitMs(50); // 延时大约50ms }

halLedSet(1); // led1指示灯亮,指示设备已上电运行halLedClear(2);

basicRfConfig.channel = 0x0B; // 设置信道 #ifdef MODE_SEND

appTransmitter(); // 发送器模式 #else

appReceiver(); // 接收器模式 #endif

HAL_ASSERT(FALSE); }

void appTransmitter() {

uint32 burstSize=0; uint32 pktsSent=0; uint8 appTxPower; uint8 n;

/* 初始化Basic RF */

basicRfConfig.myAddr = TX_ADDR;

if(basicRfInit(&basicRfConfig)==FAILED) {

HAL_ASSERT(FALSE); }

/* 设置输出功率 */

2

//appTxPower = appSelectOutputPower(); halRfSetTxPower(2);//HAL_RF_TXPOWER_4_DBM // halRfSetTxPower(appTxPower);

/* 设置进行一次测试所发送的数据包数量 */ //burstSize = appSelectBurstSize(); burstSize = 100000;

/* Basic RF在发送数据包前关闭接收器,在发送完一个数据包后打开接收器 */

basicRfReceiveOff(); /* 配置定时器和IO */ //n= appSelectRate(); appConfigTimer(0xC8); //halJoystickInit(); /* 初始化数据包载荷 */ txPacket.seqNumber = 0;

for(n = 0; n < sizeof(txPacket.padding); n++) {

txPacket.padding[n] = n; }

/* 主循环 */ while (TRUE) {

if (pktsSent < burstSize) {

UINT32_HTON(txPacket.seqNumber); // 改变发送序号的字节顺序 basicRfSendPacket(RX_ADDR, (uint8*)&txPacket, PACKET_SIZE); /* 在增加序号前将字节顺序改回为主机顺序 */ UINT32_NTOH(txPacket.seqNumber); txPacket.seqNumber++; pktsSent++;

appState = IDLE;

halLedToggle(1); //切换LED1的亮灭状态 halLedToggle(2); //切换LED2的亮灭状态 halMcuWaitMs(1000); }

/* 复位统计和序号 */ pktsSent = 0; } }

static void appReceiver() {

uint32 segNumber=0; // 数据包序列号

int16 perRssiBuf[RSSI_AVG_WINDOW_SIZE] = {0}; // 存储RSSI的环形缓冲 uint8 perRssiBufCounter = 0; // 计数器用于RSSI缓冲区统计 perRxStats_t rxStats = {0,0,0,0}; // 接收状态

3

int16 rssi;

uint8 resetStats=FALSE;

int16 MyDate[10]; //串口数据串数字 initUART(); // 初始化串口 #ifdef INCLUDE_PA uint8 gain;

// 选择增益 (仅SK - CC2590/91模块有效) gain =appSelectGain(); halRfSetGain(gain); #endif

/* 初始化Basic RF */

basicRfConfig.myAddr = RX_ADDR;

if(basicRfInit(&basicRfConfig)==FAILED) {

HAL_ASSERT(FALSE); }

basicRfReceiveOn(); /* 主循环 */ while (TRUE) {

while(!basicRfPacketIsReady()); // 等待新的数据包

if(basicRfReceive((uint8*)&rxPacket, MAX_PAYLOAD_LENGTH, &rssi)>0) {

halLedSet(1); // 点亮LED1 //halLedSet(2); // 点亮LED2

UINT32_NTOH(rxPacket.seqNumber); // 改变接收序号的字节顺序 segNumber = rxPacket.seqNumber;

/* 若果统计被复位,设置期望收到的数据包序号为已经收到的数据包序号 */

if(resetStats) {

rxStats.expectedSeqNum = segNumber; resetStats=FALSE; }

rxStats.rssiSum -= perRssiBuf[perRssiBufCounter]; // 从sum中减去旧的RSSI值

perRssiBuf[perRssiBufCounter] = rssi; // 存储新的RSSI 值到环形缓冲区,之后它将被加入

sum

rxStats.rssiSum += perRssiBuf[perRssiBufCounter]; // 增加新的RSSI值到sum

MyDate[4] = rssi; ////

MyDate[3] = rxStats.rssiSum;////

if(++perRssiBufCounter == RSSI_AVG_WINDOW_SIZE) {

4

perRssiBufCounter = 0;

}/* 检查接收到的数据包是否是所期望收到的数据包 */

if(rxStats.expectedSeqNum == segNumber) // 是所期望收到的数据包 {

MyDate[0] = rxStats.expectedSeqNum;//// rxStats.expectedSeqNum++; }

else if(rxStats.expectedSeqNum < segNumber) // 不是所期望收到的数据包(收到的数据包的序

号大于期望收到的数据包的序号) { // 认为丢包

rxStats.lostPkts += segNumber - rxStats.expectedSeqNum; MyDate[2] = rxStats.lostPkts;///

rxStats.expectedSeqNum = segNumber + 1; MyDate[0] = rxStats.expectedSeqNum;/// }

else // 不是所期望收到的数据包(收到的数据包的序号小于期望收到的数据包的序号)

{ // 认为是一个新的测试开始,复位统计变量 rxStats.expectedSeqNum = segNumber + 1; MyDate[0] = rxStats.expectedSeqNum;/// rxStats.rcvdPkts = 0; rxStats.lostPkts = 0; }

MyDate[1] = rxStats.rcvdPkts;/// rxStats.rcvdPkts++;

UartTX_Send_String(MyDate,5); halMcuWaitMs(300);

halLedClear(1); //熄灭LED1 halLedClear(2); //熄灭LED2 halMcuWaitMs(300); } } }

5

流程图

三、 实验步骤及结果:

在IAR开发环境中编译、运行、调试程序。注意,本工程需要编译两次,一次编译发送器的,一次编译为接收器的,通过MODE_SEND宏选择,并分别下载入2个ZigBee模块中。

四、 实验心得:

6

本文来源:https://www.bwwdw.com/article/2xxd.html

Top