文档详情

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

公****
实名认证
店铺
DOC
220.01KB
约6页
文档ID:519999976
实验5点对点无线通讯实验_第1页
1/6

实验题目:实验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) l 关键函数1、 射频初始化函数uint8 halRfInit(void)功能描述:zigbee 通信设置,自动应答有效,设置输出功率0dbm,Rx设置,接收中断有效参数描述: 无返回: 配置成功返回 SUCCESS2、发送数据包函数uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)功能描述:发送包函数入口参数:destAddr 目标网络短地址pPayload 发送数据包头指针,length 包的大小出口参数:无返 回 值:成功返回SUCCESS,失败返回FAILED3、接收数据函数uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)功能描述: 从接收缓存中拷贝出最近接收到的包。

参数: 接收数据包头指针接收包的大小返回: 实际接收的数据字节数c) 软件设计void main (void){uint8 i;appState = IDLE; // 初始化应用状态为空闲appStarted = FALSE; // 初始化启动标志位FALSE/* 初始化Basic RF */basicRfConfig.panId = PAN_ID; // 初始化个域网IDbasicRfConfig.ackRequest = FALSE; // 不需要确认halBoardInit();if(halRfInit()==FAILED) //初始化hal_rfHAL_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_SENDappTransmitter(); // 发送器模式#elseappReceiver(); // 接收器模式#endifHAL_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);}/* 设置输出功率 *///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}; // 接收状态int16 rssi;uint8 resetStats=FALSE;int16 MyDate[10]; //串口数据串数字initUART(); // 初始化串口#ifdef INCLUDE_PAuint8 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); // 点亮LED2UINT32_NTOH(rxPacket.seqNumber); // 改变接收序号的字节顺序segNumber = rxPacket.seqNumber;/* 若果统计被复位,设置期望收到的数据包序号为已经收到的数据包序号 */if(resetStats){rxStats.expectedSeqNum = segNumber;resetStats=FALSE;}rxStats.rssiSum -= perRssiBuf[perRssiBufCounter]; // 从sum中减去旧的RSSI值perRssiBuf[perRssiBufCounter] = rssi; // 存储新的RSSI 值到环形缓冲区,之后它将被加入sumrxStats.rssiSum += perRssiBuf[perRssiBufCounter]; // 增加新的RSSI值到sumMyDate[4] = rssi; ////MyDate[3] = rxStats.rssiSum;////if(++perRssiBufCounter == RSSI_AVG_WINDOW_SIZE){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); //熄灭LED1halLedClear(2); //熄灭LED2halMcuWaitMs(300);}}}流程图三、 实验步骤及结果:在IAR开发环境中编译、运行、调试程序。

注意,本工程需要编译两次,一次编译发送器的,一次编译为接收器的,通过MODE_SEND宏选择,并分别下载入2个ZigBee模块中四、 实验心得:无1。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档