版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
试想着有一天,你坐在电脑前,你家里的空调、冰箱、洗衣机、电视„等在你屏幕前受你掌控时,这便是物联网的时代。我是一名普通的电子者,ZigBee今天,大家都在讨论物联网,都在讨论ZigBee。ZigBee学好ZigBee,战胜ZigBee。差不齐,大多是TI公司开源的开发板来设计,用过的就知道,外国的电路TI,用之于国民的原则,务求开发最具性价比平台。部分PCBZigBee学习保驾护航。籍内容、所有代码和部分ZigBeePCB的开源。第1章ZigBee简介和开发环境快速建 ZigBee简 WeBee开发套件介 WeBeeCC2530 WeBee功能底 WeBee普通底板(PCB开源 CCDEBUGGER仿真 开发环境快速建 相关软件和驱动安 IAR工程文件的快速建 附录 一、使用TISmartRFFlashProgrammer程 第2章基础实 点亮第一个 按 外部中 定时 定时器T1(查询方式 定时器T3(中断方式 串口通 串口发送 o 串口接收和发送(send& AD控制(自带温度计 睡眠唤 中断唤 定时器唤 看门 第3章组网演 Zigbee协议栈简 无线点 信号传输质量检 协议栈工作原理介 协议栈中的串口实 一小时实现无线数据传 传感器应 (新增内容,筹备中 温度传感器 温湿度度传感器 红外热释电传感 烟雾传感 红外对管传感 光敏传感 网络通讯实验(单播、组播、广播)(文档编写中 Zigbee协议栈网络管 (文档编写中 Zigbee无线传感网系 (文档编写中 附 一、ZigBeeOAD无线程 (硬件调试中 第4章项目实 组网状态实时显示系 无线IC卡考勤 串口通讯助手==Zigbee聊天助 (开源项目进行中 无线互联 (开源项目进行中 室内(开源项目 家电控制无线传输协 (开源项目 ZigBeeZigbee是基于IEEE802.15.4标准的低功耗个域网协议。根据这个协议规定相信大部分人开始时会以为Zigbee是一类无线模块,我一开始也是这么的ZigbeeMCU,还真想知我们CC2530上集成了8051内核,你没看错,我也没打错,里面集成了一Zigbee了。1.1AZigbee、蓝牙、WIFI562ZigBee节点所属类别主要分三种,分别是协调器(Coodinator1.1BZigBee智能家居物联网(物联网经成了趋势,我们拭目以待个人、医院定„„Zigbee的应用领域很广,这里就不一一列举了。随着技术日益成熟以及价格2002001ZigBee当成普通的为了让大家能够更方便地学习Zigbee,网蜂团队打造了一套本土化的高性价比学习套件。我们的学台是IAR+Z-stack2007PRO,是TI公司的WeBeeCC25301.2A板(3.6*2.7cm接应用在万用板或PCB上。模块使用2.4G全向天线,可靠传输距离达250米。自动重连距离高达110米。图1.2BCC2530+CC2591(PA)WeBee1.2C底板尺寸:7*5串口通讯:自带USB转串口功能(PL-2303),方便笔记本用户脚以及5V/3.3V引脚功能按键:1个复位,2LED指示灯:电源指示灯、组网指示灯和普通模块支持:支持WeBeeCC2530板,CC2530+PA(cc2591)板2不误。该设计大大提高了节点的工作时间WeBee普通底板(PCB开源1.2D底板尺寸:5*5脚以及5V/3.3V引脚功能按键:1个复位,1模块支持:支持WeBeeCC2530板,CC2530+PA(cc2591)板CCDEBUGGER
1.2ECC4.7*2.3cm,标准USB支持TIzigbee系列,如:CC111x/CC243x/CC253x/CC251x51KEIL了,类似,这发最大优势就是能够直接使用TI公司提供的协议栈Z-Stack进行开发,我们只网上也有用ZStack-CC2530-2.3.1-1.4.0等其他高版本的,基本相差无几,但是目2.3.0的通用性较高。初学者要注意了,IAR和Z-Stack的高低版本是互不兼容IAR7.60A和ZStack-CC2530-2.3.0-1.4.0配合使用时从安装到开发都很友好。打开安装文件,选择打开安装文件,选择IAR1.3CLicense,到License#处: IAR图1.3D IAR7.60软件界面第二步:TI协议栈ZStack-CC2530-2.3.0-1.4.01.3F Z-stack我们还没需要用得这么快,在接下来的里,我们先把它当做一51单片机来学习,学习其资源和内部寄存器。也就是基础实验,基础好的就当做复下单片机吧。第三步: DEBUGGER驱动安装方网蜂的网蜂的 DEBUGGER插进电脑,提示找到新硬件,选择列表安装1.3I,前提是已经安装IAR7.60ChipconSRF04EB,说明驱动安装完成,如图1.3J所示。1.3J连接CC2530开发板,按下DEBUGGER复位键,指示灯亮(表示检测到开发板上CC2530,则完成连接工作。 Project,OK。保存在自己希望的路径。有这个头文件。然后保存为.c格式到工程文件路径下。怎么样,是不是跟KEIL开发51很相似呢?1.3N保存为.c单击右键---add---刚保存的C文件,成功添加后如图所示。1.3O第四步:IARProject---Options,一级TexasInstrumentsCC2530F256 ,然后打开TexasInstruments文件夹,选择lnk51ew_cc2530F256.xcl(这里是使用CC2530F256。 GeneralOptions参 真),io8051.ddf1.3S所示。至此,基本配置已经 Debugger参数配第六步:Project-Make00CCDEBUGGER和捷键如图1.3T所示:程序在中点击GO(全速运行),程序执行。使WeBeeCCDEBUGGER可以直接在IAR中程序并调试。结束后程序仍然保留在flash内,相当于烧写工具。非1.3W全速运行后,LED1ZigbeeCC2530基于IAR开发环境的操作流程。无论现在大部分的CCDEBUGGER都支持在IAR编译环境中进行程序的和调会在工程下的Debug—Exe找到生成的.hex文件。第二步:打开TISmartRFFlashProgrammer,选择System-on-chip(切记别),添加刚刚生产的.hex文件。点击程序按钮,.hex文件变被到芯 TISmartRFFlash很多人说学习ZigBee重点在协议栈,这个是不争的道理。但是基础实验也51单片机。学习本章将能令CC2530的编程方法,在以后学习完组网及数据传输的程序后我们会实验:记录程序到开发板上的示例点亮第一个能如下表所示:(详细参考CC2530datasheet.pdf)表 CC2530IO口寄存P1SEL(0IO口1:P1DIR(0:输 1:输 P1INP(0:上拉/下 1:三 电平时LED1被点亮。所以配置如下:P1SEL&=~0x01;IOP1DIR|=0x01;//P1_0P1INP&=~0X01;//打开上拉P1SELP1DIR|=P1INPP1DIR|=0x01;//P1_0源程序代码(全#include<ioCC2530.h>#defineLED1 void{P1DIR|= }void{ //点亮LED1}::2.1B点亮必不可少的东西,我们实验就用来实现按键控制LED。实验讲解:我们先来看看WeBee底板的KEYLED下表所示:(详细参考CC2530datasheet.pdf) P1.0LED1,S1P0.4P1SEL&=~0x01;//作为普通IOP1DIR|=0x01;//P1_0P1INP&=~0X01;//打开上拉P0SEL&= P0DIR&= P04P0INP&= P04P1SEL=0x00;P1DIR=0xff;P1INP=IOP1DIR|= //P1_0P0DIR&= 源程序代码(全#include<ioCC2530.h>#defineuintunsignedint#defineucharunsignedchar#defineLED1 #defineKEY1 voidDelayms(uint); voidInitLed(void); void uchar voidDelayms(uint {uint}LED初始化函数voidInitLed(void){P1DIR|= LED1 }voidInitKey(){P0SEL&= P0DIR&= P0INP&= P04}ucharKeyScan(void){{while(!KEY1);//松手检测return }}return }voidmain(void){ { }}::2.2BCPUCC2530的中断应用。P1DIR|= P0IEN|=0X10;//P04PICTL|= IEN1|= P0IFG 源程序代码(全#include<ioCC2530.h>#defineuintunsignedint#defineucharunsignedchar#defineLED1 #defineKEY1 voidDelayms(uint); voidInitLed(void); voidKeyInit(); ucharKeyValue=0;voidDelayms(uint {uinti,j;}LED初始化程序voidInitLed(void){P1DIR|0x01;//P1_0、P1_1LED1 }KEY初始化程序--外部中断方式void{P0IEN|0X10;//P04PICTL|=0X01;IEN1|=0X20; //允许P0口中断;P0IFG=0x00; EA=1; }#pragmavector //格式:#pragmavectorinterruptvoid{ P0IFG P0IF }voidmain(void){ }
2.3BT1CTLT1STIRCONTimer1Bit3:Bit2 01:8分 10:32分频11:Bit1:Bit0 00:01:0X0000-10:0X0000-11 Timer1 1413121110P1DIR|= T1CTL=0x0d; T1STAT=0x21; //通道0,中断有效源程序代码(全#include#defineuintunsignedint#defineucharunsignedchar#defineLED1 voidDelayms(uintxms); voidInitLed(void); void //i=xmsi{uinti,j;}voidInitLed(void){P1DIR| LED1 //LED1}void {T1CTL=0x0d; //128分频,自动重装0X0000-0XFFFFT1STAT=0x21; //通道0,中断有效}voidmain(void){uchar { { {LED1 //LED1}}}}次溢出时T=1/(16M/128)*65536=0.5s,所以总时间Ta=T*count=0.25*2=1S。Timer3Bit7:Bit5 001:2分 010:4分频011:8分100:16101:32分频11064分频111:128频Bit4 T3Bit3 溢出中断掩码0:关溢出中 Bit2 清计数 高电平有 T3000X00-01DOWNT3CC00X00计数一次10:模计数(0X00T3CC0计数11UP/DOWN(0X00T3CC0 0捕获/ T3通道0中断掩 Bit5Bit3T30Bit2:T3通道0模式选择 0:捕获1:比Bit1 T30 没有捕 上升沿捕10下降沿捕 边沿捕T3通道 捕获/比较值寄存 1捕获/ T3通道1中断掩 Bit5Bit3T31Bit2:T3通道1模式选择 0:捕获1:比Bit1 T31 没有捕 上升沿捕10下降沿捕 边沿捕T3通道 捕获/比较值寄存|=;=&=EA=源程序代码(部分„„voidInitT3(){T3CTL|0x08 T3IE T3CTL&=T3CTLEA=}voidmain(void){ }#pragmavector=T3_VECTOR interruptvoid{IRCON {count }}无论学习哪款MUC串口对于我们进行实验调试都是非常方便实用的,我们 oUART0对应的外部设备IO引脚关系为 UART1对应的外部设备IO引脚关系为 在CC2530中,USART0和USART1是串行通口,它们能够分别运行于异步独的IO引脚上。USART4LSBMSB6DMA1配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口2配置相应串口的控制和状态寄存器。此处配置UART0U0CSR(UART0制和状态寄存器0:SPI0:SPI1:SPI1送0:USART1:USART用控制寄存器 MOSICPOL返回CPOL反相时,输入数据采样到据输出到MOSICPOLSCK反相之后又返回CPOL时,输入数据采样到MISO1:MSB BAUD_E连同BAUD_M一起决定了UART的波特率U0BAUD(波特率控制寄存 决定了UART的波特率U0DBUF(收发数据缓冲区5IRCON2串口的波特率设置可以从CC2530datasheetPERCFG= P0SEL P2DIR&= //P0U0CSR|= U0GCR|=U0BAUD|= = 源程序代码(全g描述:在串口调试助手上可以看到不停地#include<string.h> unsignedint ucharunsigned#defineLED1P1_0#defineLED2P1_1voidvoidUard_String(char*Data,intchar O "共14个字符voidDelay_ms(uintn){uinti,j;{}}void{P1DIR LED1 }voidInitUART(void){PERCFG P0SEL P2DIR&= //P0优先作为U0CSR| U0GCR|=U0BAUD| UTX0IF }voidUard_String(char*Data,intlen){intj;{while(UTX0IF==UTX0IF=}}voidmain(void){CLKCONCMD&=CLKCONCMD&=~0x47;
{}}
O串口接收和发送(send&CLKCONCMD&= 32MHZwhile(CLKCONSTA& CLKCONCMD& PERCFG P2DIR& //P0UART0U0CSR| //UARTU0GCR| U0BAUD| UTX0IF U0CSR|= |= 源程序代码(部分)返回abc。波特率:115200bps„„voidInitUart(){CLKCONCMD&= 32MHZwhile(CLKCONSTA& CLKCONCMD& PERCFG P2DIR& U0CSR| //UARTU0GCR| U0BAUD| UTX0IF //UART0TX1(收发时候U0CSR|= IEN0| }voidUart_Send_String(char*Data,intlen){{intj;{U0DBUF=while(UTX0IF==0); UTX0IF=0;}}}voidmain(void){ {{{if({Rxdata[datanumber++]=temp;{RXTXflag }temp=}}if(RXTXflag {LED2=U0CSR&=~0x40; U0CSR|=0x40; RXTXflag datanumber=0; //指针归0LED2=0; }}}数据赋值给变量temp.#pragmavector=URX0_VECTORinterruptvoid{URX0IF temp=} 发送:ILOVEWeBee!#接收到:ILOVEL1#L2#„„voidmain(void){ {if(RXTXflag {if(temp!={Rxdata[datanumber++]=temp;{RXTXflag }temp=}}if(RXTXflag { {case { }case {}}RXTXflag=datanumber }}}且部分偏差较大,通常需要软件校准。不过这也不失为一个尝试。CC253DCCON1,ADCCON3,ADCH,ADCL。各寄存器功能如下表所示:(详细参考CC2530Bit7 ADC0:AD转换进行 1:AD转换完Bit6 手动启动AD 1:启动AD转换(需要Bit5 00:外部触 01 10:T1通道0比较触 Bit3 1600:普通模 打开01:开启LFSR时钟一次 打开 11:序列AD 选择AD01AIN711AIN6-AIN7Bit5 设置AD00:64dec,7位有 01:128dec,9位有10:256dec,10位有 11:512dec,12位有Bit3:Bit0 设置序列AD转换最末通道,如果置位时置位后立即开始AD转换,转换完成后自动清0.0000: 0001: 0011:0100: 0101: 0111:1000:AIN0-AIN1差 1001:AIN2-AIN3差1010:AIN4-AIN5差 1011:AIN6-AIN7差1100: 1110:11111/3单通道AD AD01AIN711AIN6-AIN7Bit5 设置单通道AD00:64dec,7位有 01:128dec,9位有10:256dec,10位有 11:512dec,12位有Bit3:Bit0单通道ADADC正在运行,则在完成AD转换后立刻开始,否则置位后立即开始AD转换,转换完成后自动清0.0000: 0001: 0011:0100: 0101: 0111:1000:AIN0-AIN1差 1001:AIN2-AIN3差1010:AIN4-AIN5差 1011:AIN6-AIN7差1100: 1110:11111/3TR0Bit0:1ADCBit0:1TR0=0X01; ATEST=0X01;//Enablesthetemperaturesensor | | 源程序代码(全AD#include#include #includevoidinitTempSensor(void){ //set'1'toconnectthetemperaturesensortotheSOC_ADC. //Enablesthetemperaturesensor}ADfloatgetTemperature(void){ =(0x3E); //1.25V为参考电压;12位分辨率;ADCCON1| ADCCON1| while(!(ADCCON1& //ADvalue ADCL //ADCL4value|=(((UINT16)ADCH)<< }voidmain(void){charfloatAvgTemp; //{for(i=0;i<64;{ //}TempValue[0]=(unsignedchar)(AvgTemp)/10+48; TempValue[1]=(unsignedchar)(AvgTemp)%10+48; //个位 TempValue[3]=(unsignedchar)(AvgTemp*10)%10+48; TempValue[4]=(unsignedchar)(AvgTemp*100)%10+48; TempValue[5]='\0'; UartTX_Send_String(TempValue,6); }} 睡眠模式,在需要传输数据时候进行唤醒,能进一步节省电量。本章将讲述CC2530在睡眠模式下的2种唤醒方法:外部中断唤醒和定时器唤醒。MAC(T2)的定时。其特性如下:2432.768KHZ24断和DMA触发功能在PM2低功耗模式下运行全部工作,数字处理模块正常工作。PM1(16M32M)关闭,低频晶振(32.768KRCOSC/XOSC)工作,数字模块正常工作。PM2:低频晶振(32.768KRCOSC/XOSC)工作,数字模块关闭,系统通RESET,外部中断或者睡眠计数器溢出唤醒。细参考CC2530datasheet.pdf)Bit0.系统电源模式控制寄存器,置1将强制系统进入 00全功能模式 SLEEPCMD|= PCON=0x01; //进入睡眠模式,通过中断打断PCON=0x00; //系统唤醒,通过中断打断源程序代码(全程序描述:LED25#include<ioCC2530.h>#defineuintunsignedint#defineucharunsignedchar#defineLED2 #defineKEY1void void voidSysPowerMode(ucharsel);voidDelayms(uint {uinti,j;}voidInitLed(void){P1DIR|= LED2 P0INP&= P0IEN|= PICTL|= }*para1012*modePM0PM1PM2voidSysPowerMode(ucharmode){i=mode;{SLEEPCMD|= PCON }{}}
PCON voidmain(void){ucharcount= IEN1|=0X20; P0IFG|=0x00; EA=1;{{ }}}#pragmavector=P0INT_VECTORinterruptvoid{{P0IFG }P0IF=}
也就是提及到的24bit定时器。如下表所示:(详细参考CC2530睡眠计数器数据Bit7睡眠计数器数据ST2睡眠计数器数据UINT32sleepTimer=0;sleepTimer|=ST0;sleepTimer|=(UINT32)ST1<<8;sleepTimer|=(UINT32)ST2<<sleepTimer+=((UINT32)sec*(UINT32)32768) ST2=(UINT8)(sleepTimer>>16);ST1=(UINT8)(sleepTimer>>8);ST0=(UINT8)sleepTimer;源程序代码(部分醒LED2闪烁3下。……*para1012*modePM0PM1PM2voidSysPowerMode(ucharmode){i=mode;{SLEEPCMD|= PCON }{PCON }}SleepTimer(设定后经过指定时间自行唤醒voidInit_SLEEP_TIMER(void){ST2=0X00;ST1=0X0F;ST0=EA STIE=1;//SleepTimerinterruptSTIF0;//SleepTimerinterruptflag}voidSet_ST_Period(uintsec){UINT32sleepTimer=0;sleepTimer|=ST0;sleepTimer|=(UINT32)ST1<<8;sleepTimer|=(UINT32)ST2<<sleepTimer((UINT32)sec* ST2=(UINT8)(sleepTimer>>16);ST1=(UINT8)(sleepTimer>>8);ST0=(UINT8)sleepTimer;}voidmain(void){uchar {{} }}#pragmavector=ST_VECTORinterruptvoidST_ISR(void){STIF=0; }实验2所示:(详细参考CC2530datasheet.pdf)WDCTL 0xA,0x5,WDT的 看门狗模 定时器模 1 0.25 15.625毫 毫WDCTL WDCTL|= WDCTL=0xa0; WDCTL=0x50;源程序代码(全#include<ioCC2530.h>#defineuintunsignedint#defineucharunsignedchar#defineLED1#defineLED2 voidDelayms(uintxms); voidInitLed(void); voidDelayms(uint {uinti,j;}voidInitLed(void){P1DIR|0x03;//P1_0、P1_1LED1 LED2 }void{WDCTL WDCTL|= }void{WDCTL=0xa0;WDCTL=}voidmain(void){ { }} Zigbee本节内容仅仅是对ZigBee协议栈的一些大家必须理解清楚的概念进行简单ZigBee协议栈的构成及工作原理进行详细的讨论。让刚接触ZigBeeZigBee协议ZigBee协议栈呢?它和ZigBeeIEEE802.15.4定义了PHY(物理层)和MAC(介质层)技术规范;ZigBee联ZigBee协议栈就是将各个层定义的协议都集合在一直,以函数的形式实现,并给用户提供API(应用层),用户可以直接调用。 ZigBeeZigBee(注意:不同厂商提StackZ-stack是挪威半导体公司Chipcon(目前已经被TI公司收购)推出其CC2430开发,推出的一款业界领先的商业级协议栈软件,由于这个协议握10个函数就能使用ZigBee通讯的原因。它使用瑞典公司IAR开发的IAREmbeddedWorkbenchforMCS-51为它的集成开发环境。Chipcon有文件如红色框所示,我们可以把它看做一个庞大的工程。或者是一个小型3.2TIZ-stackTIZ-Stack-CC2530-来个小总结:ZigBeeZigBee数据发送出去或者把数据接收过来的。所以最重要的是我们要学会使用ZigBee构中每个层所包含的内容和功能及Z-stack的软件架构。TI公司的BasicRF的代码容易看懂,如果把这个实验掌握了(不要只是程序然后看试现象到后面的协议栈就比较好入手 -CounterwithCBC-MAC(modeof -Hardware ionLayer alAreaNetwork -RadioFrequency (射频) ReceivedSignalStrength 3.2A3.2BWeBee模块通信,一个模块作发射,另外一个模块接收,发射例程的源代码CC2530BasicRF.rar是TI官网上的,用户可以去TI官网并。首先说明,TI官网的程序的开发平台是TI官网的开发板,硬件资2、BasicRFlayer解压后打开文件夹:CC2530BasicRF然后你会发现还有三个文件夹,然后source文件夹,再进去后会发现,还有两个文件夹,然后你很app文件夹(吐血,还有三个文件夹)……在这茫茫的文件夹里CC2530BasicRF一些相关的的文件夹:每个文件 CC2530_Software_Examples的PDF文档,文档的主要内容是介绍BasicRFTI的开发板的话的实验工程!在IAR环境中打开,在workspace看到里面放有三个工程,light_switch.eww、per_test.eww、spectrum_yzer.eww如果读者不习惯几个工程集合在一起看,也可apps文件夹和components存放BasicRF包含着BasicRFWeBeeCC2530BasicRF\ide\srf05_cc2530\iar路径里面的工程application的light_switch.c用户的应用程序就是在里面的了 BasicRF工程路二、BasicRFlayer介绍及其工作过程RF例程的软件设计框图就如一座建筑物, ion它提供了一种接口来TIMER,GPIO,UART,ADC等。这些接口都通过相应的BasicRFApplicationBasicRF层和HAL的接口,也就是说我们通过在Applicationlayer就可以使用到封装好的BasicRF和HAL的函数。BasicRFlayer简介:RF仅仅是包含着IEEE802.15.4标准的一小部分而已。其主要特点有:BasicRFlayer为双向无线通信提供了一个简单的协议,通过这个协议能够进数据加密,它的安全性读者可以通过在工程文件里面定义SECURITY_CCM在Project->Option里面就可以选择,本次实验并不是什么高度,所以SECURITY_CCMX了3.2FBasicRF(请大家按照代码走)typedefstruct uint16 uint8 uint8 #ifdefSECURITY_CCM uint8*securityKey;}函数功能:对BasicRF在basic_rf.c中可以找到destAddr目的短地址pPayloadlength失败则返回FAILED在basic_rf.c中可以找到uint8代码可以在basic_rf.c中可以找到uint8basicRfReceive(uint8*pRxData,uint8len,int16*就可以实现了吗BasicRF实现无线传输只要学会使用这些函数就可BasicRF\docs里面查看CC2530_Software_Examples5.2.4BasicRFoperation这个章节的内容,里面详细介绍了BasicRF的初始化过程、BasicRF的发射过程、(部分已经的代码并未贴出,详细的代码请看打开工程void{uint8appMode //ConfigbasicRfConfig.panId = = //Initaliseboard 初始化设Initalise { //关 //开 //Roleisundefined.Thiscodeshouldnotbe30.22~23行:WeBeeLED2LED1WeBee设计的LEDTI不同,更符合以前大家学习halLedSet()1是使灯熄灭,不过这个没第26~27行:选择其中的一行,并把另外一行掉;这两行重要啦,一个是实现发射按键信息的功能,另一个是接收按键信息并改变LED状态的功能。分别为BasicRF发射和接收。不同模块在 程序会在appSwitch(); 会执行到第29行。staticvoid{//Initialize}//KeepReceiveroffwhennotneededtosave//Main { {//PutMCUtosleep.Itwillwakeuponjoystick//interrupt} 28.8~11行:BasicRF启动中的初始化,就是上面所讲的BasicRF3步12行:BasicRF1此处把灯状态改变令LIGHT_TOGGLE_CMD放到pTxData中。第14行:由于模块只需要发射,所以把接收掉以降低功耗。18if(halButtonPushed()==HAL_BUTTON_1)判断是否S1按下,函数halButtonPushed(halButton.cS1有被按动时,就回返回true,则进入basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH)basicRfSendPacket(0xBEEF,pTxData[1],1第25行:使能中断staticvoid{ //Initialize}//Mainwhile if(pRxData[0]=={} 28.7~10行:LCD12~15行:BasicRFBasicRF3第18行:程序开始进行不断扫描的循环())seR21行:if(pRxData[0]==LIGHT_TOGGLE_CMD)判断接收到的数据是否就是发送函数里面的LIGHT_TOGGLE_CMD如果是,执行第22行第一步:打开….\CC2530BasicRF\ide文件夹下面的工程在light_switch.c里面找到main函数找到下面内容把 注释掉 到发射模块/************Selectoneandshieldto///************Selectoneandshieldtoanother***********by//节点为按键拓展:或许你觉得点亮LED太没意思了,我们来点台灯。3.2G3.2HPER(误包率检测)BasicRF的第二个实验,和无线点灯一样是没zigbee的发射和为接收发射的过程基本上是一样的,但也希望初学者能自己认真学 PC机上显示当前的误包率、RSSI值和接收到数据实验详解:例程的源代码CC2530BasicRF.rar是TI官网上的,打开\CC2530BasicRF\ide\srf05_cc2530\iarper_test.eww工程,由于我们的打开工程,在application文件夹点 我们的主要功能函数都在这INCLUDES中添加:#include只需要放在appReceiver()函数中 * Thisisthemainentryofthe"PERtest" basicRfConfig-filescopevariable.BasicRFconfigurationappState-filescopevariable.HoldsapplicationappStarted-filescopevariable.Usedtocontrolstartandstop voidmain{appState=appStarted=Config basicRfConfig.panId=//Initialiseboard 初始化硬Initalise 初始化}//Indicatethatdeviceis//PrintLogoandsshscreenon//WaitforusertopressS1to//SetappMode=appMode=if(appMode==MODE_TX)//Noreturnfromhere 如果defineMODE_SEND则进入appTransmitter();}//Receiverelseif(appMode==MODE_RX)//Noreturnfrom 如果没有defineMODE_SENDappReceiver}//Roleisundefined.Thiscodeshouldnotbe}大家看注释也应该知道main.c发射函数defineMODE_SEND * Applicationcodeforthetransmittermode.PutsMCUin basicRfConfig-filescopevariable.BasicRFconfigurationtxPacket-filescopevariableoftypeappState-filescopevariable.HoldsapplicationappStarted-filescopevariable.Controlsstartandstop staticvoid{uint32uint32Initialize /*初始化BasicRF{}SetTXoutput /*设置输出功率 Setburst /*设置进行一次测试所发送的数据包数量//BasicRFputsonreceiverbeforetransmissionofpacket,andturnsoffafterpacketissentConfigtimerand 配置定时器和Initalisepacket /*初始化数据包载荷for(n=0;n<sizeof(txPacket.padding);{}while{{if(pktsSent<{//Makesuresequencenumberhasnetworkbyte //Changebyteorderbacktohostorderbeforeincrement*在增加序号前将字节顺序改回为主机顺序*/ appState= //改变LED1}appStarted=Resetstatisticsandsequencenumber/*pktsSent=}}}自加1再发送;接收函数没有defineMODE_SENDappReceiver * Applicationcodeforthereceivermode.PutsMCUinendless basicRfConfig-filescopevariable.BasicRFconfigurationrxPacket-filescopevariableoftype staticvoid{ //{}while{ // //segNumber={}//SubtractoldRSSIvaluefromrxStats.rssiSum-=perRssiBuf[perRssiBufCounter]; //sum中减去旧的RSSI//StorenewRSSIvalueinringbuffer,willaddittosumperRssiBuf[perRssiBufCounter]= rxStats.rssiSum //RSSI值到perRssiBufCounter= //Wrapringbuffer}//Checkifreceivedpacketistheexpectedpacket == //{}//Ifthereisajumpinthesequencenumberingthismeanssomepacketsinbetweenhasbeenlost.<)// //rxStats.lostPkts+=segNumber-rxStats.expectedSeqNum=segNumber+} //{rxStats.expectedSeqNum=segNumber+rxStats.rcvdPkts=rxStats.lostPkts=}{resetStats=rxStats.rcvdPkts=rxStats.lostPkts=}} //32个数据包的RSSI 86.12Basic为了获取传输的性能参数,中包含了如下几个数据(包含在rxStats变量 上32个数据包的RSSI值的和 每次PER测试中,成功接收到的数据包的个数 如果大家想了解具体的话就可以去\CC2530BasicRF\docs1、发射模块,在per_test.c中,找到 //时//不时不要#define //时//不时要#define3接收模块USB连接PC机并给发射模块供电,打开串口调试助手,并设置好们的实验现象了。如图5所示。 习到项目开发,你不得不和他打交道。由于我们的学台是基于TI公司的,所以讲述的当然也是TI的Z-STACK。CC25308051内核,在这个内核中进行ZigBee也不会在今天来了。所以ZigBee的生产商很聪明,比如TI公司,他ZigBee。这样大家使用他们的产品也理所当然了,确实高明。51单片机时候是不是会用到定时器的功能?嗯,我LED1一秒闪烁一次,LED2二秒闪烁一次。这样就有2个任务了。再进一步…nLED,n个任务执行了。协议栈的最终工作原理也3.4A们打开协议栈文件夹TexasInstruments\Projects\zstackTI公司的Samples文件夹:Samples文件夹里面有三个例子GenericApp、SampleApp、SimpleApp在这SampleApp.eww。留意左边的工程Zmain文件夹和App文件夹。3.4Cintmain(void)函数。我们大概浏览一下main函数代码:* Firstfunctioncalledafter don'tintmain(void{//Turnoffosal_int_disable(INTS_ALL InitializationforboardrelatedstuffsuchasLEDs //Makesuresupplyvoltageishighenoughtorun //InitializeboardInitBoard(OB_COLD //初始化I/O,LED、 //InitialzeHAL //InitializeNVosal_nv_init(NULL //初始化 //Initializethe //MAC//Determinetheextendedaddress //确定IEEE //InitializebasicNV // //SincetheAFisn'tatask,callit'sinitializationroutine//Initializetheoperatingsystem 初始化操作系统//Allowosal_int_enable(INTS_ALL ////FinalboardInitBoard(OB_READY ////Disyinformationaboutthisdevice /*DisythedeviceinfoontheLCD*/#ifdefLCD_SUPPORTED /*IfWDTisused,thisisagoodcetoenableit.*/WatchDogEnable(WDTIMX);osal_start_system(NoReturnfromherereturn //Shouldn'tget}了解2个函数:能在taskID这个变量上找到一定的规律。请看下面程序注释。voidosalInitTasks(void{uint8taskID=//tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16) //osal_memset(tasksEvents,0,(sizeof(uint16) //任务优先级由高向低依次排列,高优先级对应taskID kInit(taskID++); kInit(0),用户不需考虑nwk_init(taskID++); Hal_InittaskID //Hal_Init(2)#ifdefined(MT_TASK)APS_InittaskID //APS_Init(3)APSF_Init(taskID++);ZDApp_InittaskID //ZDApp_Init(4)#ifdefined(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_)ZDNwkMgr_Init(taskID++);SampleApp_InittaskID SampleApp_Init_Init(5)}我们可以这样理解,函数对taskID个东西进行初始化,每初始化一个,需考虑的也是不能修改的。TI公司协议栈已完成的东西。这里先提前卖个2、我们再来看第二个函数osal_start_system();运行操作系统。同样用gotodefinition的方法进入该函数。呵呵,结果发现很不理想。甚至很多函数形 Thisfunctionisthemainloopfunctionofthetask willlookthroughalltaskeventsandcallthefunctionforthetaskwiththe Iftherearenoeventsalltasks),thisfunctionputstheprocessorintoThisFunctiondoesn't voidosal_start_system(void){#if!defined(ZBIT)&&!defined(UBIT {uint8idx= //ThisrecesMT_SerialPoll()andosal_check_timer().do{if //Taskishighestprioritythatis{ }}while(++idx if(idx {uint16events; //进入临界区,events=tasksEvents[idx]; tasksEvents[idx]=0; //CleartheEventsforthistask.清除本次任务的HAL_EXIT_CRITICAL_SECTION(intState);//退出临界区tasksEvents[idx]|= //AddbackunprocessedeventstotheHAL_EXIT_CRITICAL_SECTION(intState);//退出临界区} //Completepassthroughalltaskeventswithno{}}}events=tasksEvents[idx];tasksEvents[idx]数组定义,这就是初始化与调用的关系。taskID把任务联系起来了。NY
WEBEE” z-stack2.3.0)中进行。我们打开Z-stack Projects\zstack\Samples\SampleApptest\CC2530DB里面的SampleApp.eww工程。这次试验我们直接基于协议栈的;SampleApp来 SampleApp.eww工workspace下比较重要的两个的地方。主要在SampleApp.cSampleApp.h中就可以了,如图3.5C。 串口初始化大家很熟悉,就是配置串、波特率、流控、校验位等等。以前我们都是配置好寄存器然后使用。现在我们在workspace下找到HAL\Target\CC2530EB\drivershal_uart.c文件,我们可以看到里面已经包括们看看workspace上的MT层,发觉有很多基本函数,前面带MT。包括Z-stackMTMT层配置和调用其下的OSAL_SampleApp.C文件,找到上节提到的osalInitTasks()任务初始进入voidMT_UartInit{/*InitializeAPPIDApp_TaskID=/*UARTConfiguration = = = = = = #ifdefined(ZTOOL_P1)||defined =#elifdefined(ZAPP_P1)||defined = =/*StartUART#ifdefined/*SilenceIARcompilerwarning/*InitializeforZApp#ifdefined(ZAPP_P1)||defined/*DefaultmaxbytesthatZAPPcantake = =}我们gotodefinitionofMT_UART_DEFAULT_BAUDRATE, 第9行 = 16~22ZTOOLZAPP选择不同的数++方加入。如3.5G所示。会提及。如图3.5H所示: oWorld的语句。调试。全速运行,可以看到串口助手收到信息。图3.5J、图3.5K oWorld前面出现乱3.5K显示可以接收代码了,是不是很简单?但是我们发现oWorldFEZ-stackMT在预编译地方把MT相关内容注释。如图3.5L:3.5M,或许就是你想要的oWorld。3.5MDelay就可以轻松应用。希望网蜂以后的可以让你更爽吧。前言:数据的无线传输,或许是每一个学习ZigBee的人最想得到的东西,他承 送给PC上位机显示出来。实验基于SampleApp工程进行。法来实验。先测试效果!只需要在代码加入1条语句。 Projects\zstack\Samples\SampleAppSampleApworkspace下比较重要的两个的地方。主要在SampleApp.c和SampleApp.h中就可以了。 (器)如图4、图5: data的内容,如图6所示。第三种读者想法还没想到~有的可以们~打开SampleApp.C文件,找到SampleApp处理函数:uint16SampleApp_ProcessEventuint8task_id,uint16events……1Receivedwheneverthedevicechangesstateinthe2caseZDO_STATE_CHANGE://当网络状态改变,如从未连上到连上网络3、SampleApp_NwkState=(devStates_t)(MSGpkt->hdr.status);4、if((SampleApp_NwkState==DEV_ZB_COORD//协调器、路由器、5、||(SampleApp_NwkState==DEV_ROUTER) //或者终端都执行6、||(SampleApp_NwkState==DEV_END_DEVICE)) //Startsendingtheperiodicmessageinaregularinterval.9、osal_start_timerEx(SampleApp_TaskID, //Deviceisnolongerinthenetwork 第9行:代码的关键部分。这三个参数决定着周期性发送数据脉。我们逐始化的任务ID号。//ApplicationEvents(OSAL)-Thesearebitweighteddefinitions.#define //SendMessage Every5 隔约5s收到数据的原因。这里可以改你需要发送数据的时间间隔。这个函数了,所以这个相当于初始化,只执行1次。1、//Sendamessageout-Thiseventisgeneratedbyatimer2、// (setupinSampleApp_Init()).5Sendtheperiodic7Setuptosendmessageagaininnormalperiodalittle8、osal_start_timerEx( 10、returnunprocessed11、returnevents^12、 6:SampleApp_SendPeriodicMessage();是主要的代码,是我们编写需要发1、voidSampleApp_SendPeriodicMessage(void),{} //Erroroccurredinrequesttosend. 发送字符数10,内容是data数组。1、voidSampleApp_SendPeriodicMessage(void) uint8 //Erroroccurredinrequesttosend. 数据0~9。uint16SampleApp_ProcessEventuint8task_id,uint16events)事//Receivedwhenamessagesisreceived(OTA)forthisendpoint 其中SampleApp_MessageMSGCBMSGpkt就是将接收到的数据包进行处理1、voidSampleApp_MessageMSGCB( ingMSGPacket_t*pkt)2、{ uint16 5、{ case case flashTime=BUILD_UINT16(pkt->cmd.Data[1],pkt->cmd.Data[2]); HalLedBlink(HAL_LED_4,4,50,(flashTime/4)); }}第6行:发来的数据包的ID号,如果是: typedef{ /*OSALMessageheader /*Message'sgroupID-0ifnotsetuint16 /*Message'sclusterID it'sanInterPANmessage*/uint16macDestAddr; /*MACheaderdestinationshortaddress*/uint8endPoint; /*destinationendpoint*/uint8 /*TRUEifnetworkdestinationwasaaddressuint8LinkQuality; /*Thelinkqualityofthereceiveddataframe*/uint8correlation; /*Therawcorrelationvalueofthereceiveddataframe /*ThereceivedRFpowerinunitsdBmuint8 /*deprecateduint32timestamp; /*receipttimestampfromMAC*/mandFormat_tcmd; /*ApplicationData*/ //GeneralizedMSGCommandFormattypedefstruct{ uint16DataLength; //NumberofbytesinTransData 1、voidSampleApp_MessageMSGCB( ingMSGPacket_t*pkt)3、uint164、switchpkt->clusterId case //回车换行 case flashTime=BUILD_UINT16(pkt->cmd.Data[1],pkt->cmd.Data[2]); HalLedBlink(HAL_LED_4,4,50,(flashTime/4)); }}分别选择CoordinatorEB-Pro和EndDeviceEB-Pro编译后对应到协调器和终端收到了数据,如图3.6G。16ASCII代码吧。留意下面红色部分哦。具体内容1、voidSampleApp_MessageMSGCB( ingMSGPacket_t*pkt)4、uint85、uint166、switchpkt->clusterId case HalUARTWr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (完整版)数学苏教六年级下册期末测试模拟试卷A卷解析
- 商业保理流程优化专员风险管理案例分析
- 探索宫崎骏风格下的动漫营销策划策略与面试技巧
- 广东文旅面试实战攻略旅游资源开发与规划
- 审计师审计信息化建设方案
- 工业设计面试技巧与职业规划系列文章
- 2025福建福州市园开新筑开发建设有限公司招聘1人笔试历年参考题库附带答案详解
- 2025湖南益阳投资控股集团有限公司招聘综合排名暨人员笔试历年参考题库附带答案详解
- 2025浙江宁波市象山县水质检测有限公司招聘技能测试及笔试历年参考题库附带答案详解
- 2025广西南宁市武鸣区粮油购销有限总公司招聘8人笔试历年参考题库附带答案详解
- 2026年注册安全工程师题库300道及参考答案【新】
- 2025河北邯郸市产业投资集团有限公司下属企业专业人才招聘78人笔试考试备考试题及答案解析
- 安全生产三法一条例两办法
- 室内四害消杀培训
- 中医特色疗法脐灸
- 汽车轮毂项目可行性研究报告
- 工业气瓶安全使用培训
- 美容皮肤科专业培训
- 老年人进食照护课件
- 焊工证复审考试题及答案
- 统编版九年级上册语文期末复习:全册重点考点手册
评论
0/150
提交评论