通信新技术实验报告_第1页
通信新技术实验报告_第2页
通信新技术实验报告_第3页
通信新技术实验报告_第4页
通信新技术实验报告_第5页
已阅读5页,还剩184页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通信新技术综合训练报告通信新技术综合训练报告学院名称:专业:班级:姓名:学号:指导老师:2012年3月目录实验一Jennic-WSN开发环境 1实验二GPIO及LCD使用实验 4实验三简单点对点无线通信实验 8实验四两个EndDevice之间的无线通信实验 14实验五DIO中断实验 18实验六定时器实验 23实验七UART实验 27实验八ADC及数据采集实验 32实验九休眠和掉电保护实验 38心得体会 44附录 45 实验一Jennic-WSN开发环境一、实验内容1.熟悉基于JN5139芯片所开发的一系列开发板及外围部件;2.了解zigbee系统;3.掌握软件的安装与调试;4.熟悉常用API接口函数。二、实验原理1.JN5139最小系统及外围部件基于JN5139芯片所设计的最小系统。SPISSZ与SPISSM连接,SPISWP接高电平,JN5139上电自动复位或按键复位,SPIMISO为编程控制端,与复位按键配合使用,经DIO6、DIO7实现程序BIN文件的下载。JN5139模块提供如下外围部件功能:5个主SPI选择口;2个UART串口;2个带捕获/比较功能的可编程定时器/计数器;2个可编程睡眠定时器和1个滴答定时器;两线串口(兼容SMbus和I2C);从SPI接口(与数据I/O共享);21个数据I/O口(与UART串口、定时器及SPI选择复用);4通道12位100kbps模数转换输入;2个11位数模转换输入;2个可编程模拟比较输入;内部温度传感及电压监控。2.开发板基于JN5139芯片所设计的WSN开发板,其部件如下:U1:JN5139系列Zigbee模块;U2:板载光照度传感器;U3:板载温湿度一体传感器;J3:外供电(5VDC)接口;Swith:供电开关;J7:编程与运行状态选择,左跳并给传感器板加电,则进入可编程状态,或者在加电的情况下,按住RESET按钮,左跳J7,然后放开RESET按钮,再右跳J7,也可进入可编程状态,退出可编程状态,只需要按一下RESET按钮即可;J8:Flash写保护跳选,编程与运行都跳选到RUN(右跳);DB9:RS232编程接口;UART0:串口0;JP6:模块所有管脚的引出排线;LCD:液晶接口;Power:电源指示灯;REST:复位按键;LED3,LED2,LED1,LED0:可编程LED,分别对应DIO19、DIO18、DIO17、DIO16;SW3,SW2,SW1,SW0:可编程按键,分别对应DIO20、DIO11、DIO10、DIO9;GND:地。3.软件的安装与调试(1)建立开发环境在光盘中找到software文件夹下的JN-SW-4031-SDK-Toolchain-v1.1.exe文件(或者在Jennic公司网站上获得该文件)并运行。在安装过程中,最简单的方法是按默认设置安装。(2)编写程序代码并进行下载与调试编写代码完成后,可按Ctrl+F9快捷键或选择主菜单Build下的Build子菜单或点击图标建立可执行二进制代码文件。若工程编译(Build)成功,则可在C:\Jennic\cygwin\jennic\SDK\Application\test\JN5139_Build\Release目录下生成test.bin文件。否则,出错信息会显示在信息窗口中,根据出错信息调试程序。JennicJN51xxFlash可编程器是用来将编译好的二进制代码文件(*.bin)下载到JN51xx模块中的Flash芯片的代码下载工具,它通过串行总线与JN51xx模块相连。JennicJN51xxFlash可编程器的用户界面如图1-18所示,它可以将*.bin文件下载到目标板或模块中,下载步骤如下:a.用串口线连接PC机和目标板或模块。b.运行Flash可编程器,选择PC机与目标板相连的串行通讯端口。c.将目标板上的J7跳线至编程(左侧)状态,给目标板上电,按一下RESET按钮后释放,再恢复J7跳线至右侧。d.在图1-18所示的Flash可编程界面上点击Browse按钮(图中①处)查找并选择要下载的目标文件。e.选择好目标文件后,点击Progrm按钮(图中②处)开始下载。在下载的过程中会显示一个下载的进度条,如图1-19所示。当下载完成后,将显示下载成功或错误,如图1-20所示下载成功对话框。如果遇到错误,请尝试重新下载。f.成功下载后,关掉Flash可编程器再给目标板或模块上电、或按Reset按钮,则刚下载的代码自动运行。4.常用API接口函数介绍(1)应用程序初始化函数如下:AppColdStart()应用程序的入口,相当于标准C中的main函数,结点上电后将从这里开始执行应用程序。该函数需要完成以下功能:1.通过设置函数中的参数值来设置信道号(JZS_sConfig.u32Channel)和PANID(JZS_sConfig.u16PanId);2.调用函数JZS_u32InitSystem(TRUE)来初始化ZigBee协议栈;3.调用函数vInit()对用户的应用进程进行初始化,包括初始化按钮动作和程序变量,设定绑定等操作;4.调用bBosRun(TRUE)来启动操作系统BOS。用户可根据具体的应用设计该函数。AppWarmStart()结点从内存供电的休眠模式唤醒的时候将进入这个函数。启动后所有的内存数据都没有丢失。如果设备不需要休眠唤醒功能,这个函数可以为空。用户可根据具体的应用设计该函数。一般情况下,该函数会调用AppColdStart()重新启动设备。(2)应用程序调用协议栈的函数如下:JZS_u32InitSystem()初始化JennicZigBee协议栈。JZS_vStartStack()设备将作为Coordinator、Router或者EndDevice启动。如果是Coordinator将启动网络,如果是Router或者EndDevice将加入网络。JZS_vStartNetwork()手动控制Coordinate网络启动,相对于自动网络启动,使用该功能,需要设置JZS_sConfig.bAutoJoin=FALSE.该函数执行后,返回的协议栈事件为JZS_EVENT_NWK_STARTEDJZS_EVENT_FAILED_TO_START_NETWORK。vAppSaveContexts()保存网络参数以及用户的数据,如果你的应用是固定点的话,建议你进行网络参数的保存。u16AppGetContextSize()用来获取保存的网络参数以及用户数据的尺寸。vAppGetContexts()读取保存的网络参数的内容。(3)协议栈调用应用函数的函数如下:JZA_boAppStart()让用户可以在协议栈启动前定义endpoint的descriptor,通常开发人员应该在这个函数中调用JZS_vStartStack启动协议栈。JZA_vStartEvent()协议栈将通过这个函数反馈网络层的一些网络事件,比如网络启动成功、结点加入成功或者数据发送完成等。JZA_vPeripheralEvent()该函数主要用来处理外部的硬件中断,比如按钮、定时器、UART等。JZA_vAppEventHandler()BOS周期性地调用该函数处理硬件中断。用户可以利用它进行网络状态的判断和按钮的检查等,也可以在这个函数中,写入自己的应用程序。在设计该函数时,要尽可能地使其运行时间短,以便BOS调度其他活动事件。JZA_vAppDefineTasks()该函数用于向BOS注册自己的用户任务,一般很少使用该函数。JZA_bAfMsgObject()收到其他结点发送来的MSG帧的处理函数。实验二GPIO及LCD使用实验一、实验内容1.运用基本GPIO函数设计一个程序,分别通过各按键切换对应LED亮/灭状态。2.设计一个程序,实现LED自动闪烁,周期为1秒。3.设计一个程序,按下按键SW0,LCD显示数据加1;按下按键SW1,LCD显示数据减1。二、实验原理1.GPIO使用Jennic的模块具有21路通用的GPIO,可以通过软件的方式进行设置,这些GPIO口和其他的外围接口是共用的。其共用关系如表2-1所示:表2-1:IO口和其他的外围接口共用关系DIO引脚共用关系DIO0SPI从选择1(输出)DIO1SPI从选择2(输出)DIO2SPI从选择3(输出)DIO3SPI从选择4(输出)DIO4-DIO7UART0DIO8-DIO10Timer0DIO11-DIO13Timer1DIO14-DIO15SerialinterfaceDIO16IPdatainDIO17-DIO20UART1常用函数:(1)对于GPIO的操作首先需要调用vAHI_DioSetDirection来进行GPIO输入输出方向的设置。该函数的原型如下:PUBLICvoidvAHI_DioSetDirection(uint32u32Inputs,uint32u32Outputs);这里u32Inputs和u32Outputs是设置GPIO输入和输出地mask码。(2)对于GPIO的输出操作比较简单,通过调用如下原型函数:PUBLICvoidvAHI_DioSetOutput(uint32u32On,uint32u32Off);这里u32On和u32Off分别是设置GPIO输出高、低电平的掩码。(3)对于GPIO的输入操作,通常调用如下原型函数:PUBLICuint32u32AHI_DioReadInput(void);返回值对应每个输入DIO的高低电平。2.LED使用LED驱动库文件提供了LED的控制方法,在LedControl.h中宏定义了相应功能函数。对于LED的操作,首先要调用初始化函数vLedInitFfd()初始化FFD开发板上的四个LED,然后调用函数vLedControl(LED,ON)控制相应LED点亮或熄灭。相应函数原型如下:PUBLICvoidvLedInitFfd(void);PUBLICvoidvLedControl(uint8u8Led,bool_tbOn);3.按键使用按键驱动库文件提供了按键的控制方法,在Button.h中宏定义了相应功能函数。对于按键的操作,首先要调用初始化函数vButtonInitFfd()初始化FFD开发板上的四个按键,然后调用函数u8ButtonReadFfd()读取相应按键的状态。相应函数原型如下:PUBLICvoidvButtonInitFfd(void);PUBLICuint8u8ButtonReadFfd(void); 4.LCD使用LCD驱动库文件库提供了液晶的驱动方法,在Lcd_JM12864_Driver.h中提供了相应功能的原型函数。5.BOS定时器的使用为了消除按钮抖动对控制器的影响,本实验设置的一个读取按钮的标志变量NextReadStart,若其值为TRUE且有按下按钮SW的操作,则设置其为FALSE,并利用BOS的定时器函数bBosCreateTimer()定时,500ms后再次设置NextReadStart为真。通过关这种方法可有效地消除按钮抖动的影响。bBosCreateTimer()函数是一个处理软件定时器的BOSAPI函数,调用该函数可由BOS创建一个软件定时器,该定时器要利用内部硬件滴答定时器(ticktimer)来实现。当定时时间到,立即调用由bBosCreateTimer()指定的定时处理程序。6.协议栈事件函数JZA_vStackEvent()是一个协议栈调用应用程序的函数(回调函数)。它的主要功能是处理来自于协议栈底层的各种事件,比如,APS层数据传输确认。用户通过该函数可以处理来自于AF和ZDP层的事件。该函数的原型为:PUBLICvoidJZA_vStackEvent(teJZS_EventIdentifiereEventId,tuJZS_StackEvent*puStackEvent);其中参数eEventId表示事件的类型,参数puStackEvent表示有关发生事件的补充信息。7.周期性调用函数网络启动后,每隔一定时间,BOS就会调用JZA_vAppEventHandler()函数一次,该函数专门来处理硬件中断,用户可以在该函数中添加用于网络状态判断、按钮检查等检测中断事件的程序代码,也可以添加用于发送数据的程序代码等。本实验利用该函数检查是否按下SW按钮。三、软件设计1.运用基本GPIO函数设计一个程序,分别通过各按键切换对应LED亮/灭状态。程序首先执行AppColdStart()函数,自动寻找最安静的信道,然后调用vInit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定时时钟,其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,网络启动成功后就开始读取按键值,并执行相应的按键控制LED亮灭的子程序,主程序流程图如下图所示:2.设计一个程序,实现LED自动闪烁,周期为1秒。程序首先执行AppColdStart()函数,自动寻找最安静的信道,然后调用vInit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定时时钟,其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,网络启动成功后就调用vAppTickLED()函数,定时为1s,定时时间一到,循环执行vAppTickLED()函数,通过定义一个变量LED,LED循环变化,利用vLedControl(LED,TRUE),实现LED的流水灯显示。主程序流程图如下图所示:3.设计一个程序,按下按键SW0,LCD显示数据加1;按下按键SW1,LCD显示数据减1。程序首先执行AppColdStart()函数,自动寻找最安静的信道,然后调用vInit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定时时钟,其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,网络启动成功后调用JZA_vAppEventHandler()函数读取按键值,若有键按下,调用按键子程序vProcessSplashKeyPress(),执行case语句:按键0,对液晶显示的数进行加1;按键1,对液晶显示的数进行减1。主程序流程图如下图所示:四、实验结果与分析1.实验一中分别按下按键SW0~SW3,相应的LED0~LED3能够改变当前的状态,按动一下亮、按动一下灭,实现了按键控制LED灯的亮灭;2.实验二中实现LED的自动闪烁,实际实验中实现的是4个LED灯依次闪烁,及以流水灯的形式显示,每两个灯之间的切换时间为1s;3.实验三中实现了LCD的显示,并通过按键控制相应的显示为加1还是减1,按下SW0,数值加1,按下SW1,数值减1,LCD上显示的初始值为000,加满后为255。五、存在问题和解决方法1.在完成实验二时,题目要求周期为1s,设计成流水灯的形式,其周期为1s代表的含义应该是四个LED灯依次点亮的时间为1s,而不是每个灯点亮的间隔为1s,所以通过改变延时来解决此问题,因此,在阅读题目的时候需要仔细阅读题目要求,弄清题意。2.在完成实验三时,LCD刚开始的时候不能显示,但是通过检测LED的亮灭可以知道,程序已经执行,可以看出,LCD的显示程序存在一些问题,通过仔细研究,发现LCD显示部分有所漏缺,修改后LCD正常显示。实验三简单点对点无线通信实验一、实验内容1.分别为Coordinator和EndDevice设计一个程序,分别用按键控制切换对方对应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。2.分别为Coordinator和EndDevice设计一个程序,其功能为:按下Coordinator的SW0,某变量X(初始值0)显示在LCD上,同时将X发送给EndDevice,EndDevice收到该数据后进行数据处理(加1),等待1秒后再将其发送给Coordinator,Coordinator收到后将该值赋予X并显示在LCD上,同时再次发送给EndDevice,如此重复运行。二、实验原理1.获得16位短地址的方法Coordinator的16位短地址固定为0x0000,而EndDevice的16位短地址是由Coordinator动态分配的。EndDevice可直接使用短地址0x0000与Coordinator通信,而Coordinator与EndDevice通信时,Coordinator必须使用EndDevice的短地址。在应用程序中,Coordinator获得EndDevice短地址的方法比较简单,每当有新的结点加入到网络时,Coordinator协议栈就会调用处理协议栈低层的回调函数JZA_vStackEvent(teJZS_EventIdentifiereEventId,tuJZS_StackEvent*puStackEvent),参数puStackEvent是一个指向栈事件tuJZS_StackEvent类型的指针,通过该参数即可获得新加入结点的16位短地址。下面的JZA_vStackEvent()函数的代码中给出了获取16位短地址DstAddress的具体方法。if(eEventId==JZS_EVENT_NEW_NODE_HAS_JOINED){DstAddress=puStackEvent->sNewNodeEvent.u16ShortAddr;}2.数据格式ZigBee2004支持KVP键值对和MSG消息帧两种类型数据格式。KVP是ZigBee2004协议中规定的一种特殊的数据传输机制,通过一种规定来标准化数据传输格式和内容,主要用于传输较简单的变量值格式;MSG是ZigBee协议中规定的另一种数据传输机制,这种机制在数据传输格式和内容上并不做更多的规定,主要用于专用的数据流或文件数据等数据量较大的情况。由于在ZigBee2006及以后的版本中不再支持KVP格式的数据包,因此,在本实验中,仅使用MSG消息帧进行数据的传输。在JennicZigBee应用程序中,通常使用协议栈提供的afdeDataRequest()函数发送数据帧。当一个结点收到来自其他结点的MSG帧时,协议栈就会调用回调函数JZA_bAfMsgObject()对接收的MSG帧进行处理。在数据收发过程中,发送和接收设备双方都需要知道事件的数据格式,才能正确处理信息。3.创建和发送数据请求函数afdeDataRequest()该函数属于AFDE(AFSub-layerDataEntity)类函数,用来向网络层发出数据发送的请求。该函数的原型为:Stack_Status_eafdeDataRequest(APS_Addrmode_eeAddrMode,uint16u16AddrDst,uint8u8DstEP,uint8u8SrcEP,uint16u16ProfileId,uint8u8ClusterId,AF_Frametype_eeFrameType,uint8u8TransCount,AF_Transaction_s*pauTransactions,APS_TxOptions_eu8txOptions,NWK_DiscoverRoute_eeDiscoverRoute,uint8u8RadiusCounter);各形参描述如下:eAddrMode:该参数定义了发送的目标地址模式,它是APS_Addrmode_e枚举类型的数据。u16AddrDst:该参数是数据要发送的目标地址,地址范围为0x0000到0xFFFE。u8DstEP:目标地址的端口号,范围是0x01到0xF0。u8SrcEP:源地址的端口号,范围是0x01到0xF0。u16Profileid:所采用的pro。u8ClusterId:所采用的clusterID。eFrameType:使用的数据帧类型0x01=KVP,0x02=MSG。u8TransCount:本次请求发送的数据事务的数量。取值范围在0到0x0f。pauTransactions:该参数是一个指向AF_Transaction_s结构体类型的指针,在该结构体类型的变量中,存放着需要发送的数据。bTxOptions:指定发送方式,可以选择下列的值,这些值可以进行逻辑或。u8DiscoverRoute:设定所采用的路由发现模式。u8RadiusCounter:数据发送的深度,即所发送数据包的最大转发次数,如果设置为0,协议栈将采用2倍的MaxDepth发送深度。4.收到MsgObject调用的函数JZA_bAfMsgObject()该函数属于协议栈调用应用程序的函数,用来处理来自其他结点发送来的MSG帧。该函数的原型为:PUBLICbool_tJZA_bAfMsgObject(APS_Addrmode_eeAddrMode,uint16u16AddrSrc,uint8u8SrcEP,uint8u8LQI,uint8u8DstEP,uint8u8ClusterID,uint8*pu8ClusterIDRsp,AF_Transaction_s*puTransactionInd,AF_Transaction_s*puTransactionRsp)各形参描述如下:eAddrMode:该参数定义了发送的目标地址模式,它是APS_Addrmode_e枚举类型的数据.u16AddrSrc:该参数是数据发送方的源短地址,地址范围为0x0000到0xFFFE。u8SrcEP:源端口号,范围是0x01到0xF0。u8LQI:接收帧的链路质量。u8DstEP:目标端口号,范围是0x01到0xF0。*puTransactionInd,:该参数是一个指向AF_Transaction_s结构体类型的指针,在该结构体类型的变量中,存放着接收的数据。*puTransactionRsp:该参数是一个指向AF_Transaction_s结构体类型的指针,在该结构体类型的变量中,存放着response信息。5.简单设备描述函数afmeAddSimpleDesc()该函数属于AFME(AFSub-layerManagementEntity)类函数,在增加设备描述符函数vAddDesc(void)中调用,其功能是为一个endpoint增加一个简单描述符(simpledescriptor)。如果一个endpoint上没有正确定义的简单描述符,那么它将不能正确地接收来自其他结点的数据,通常简单描述符应该在设备建立网络成功或者加入网络成功后添加。三、软件设计1.分别为Coordinator和EndDevice设计一个程序,分别用按键控制切换对方对应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。Coordinator:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,若启动成功,则硬件上的标志位LED0灭,其次再判断是否有新的结点加入,若有新结点加入,硬件上得标志位LED1灭;判断是否有按键被按下,若按下了则调用vSendData()函数向enddevice发送一个数据,在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制灯的亮灭。Coordinator主程序流程图:Enddevice:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;其后判断是否加入网络成功,若加入成功,则硬件上的标志位LED0灭;判断是否有按键被按下,若按下了则调用vSendData()函数向enddevice发送一个数据,在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制灯的亮灭。主程序流程图如下图所示:Enddevice主程序流程图:2.分别为Coordinator和EndDevice设计一个程序,其功能为:按下Coordinator的SW0,某变量X(初始值0)显示在LCD上,同时将X发送给EndDevice,EndDevice收到该数据后进行数据处理(加1),等待1秒后再将其发送给Coordinator,Coordinator收到后将该值赋予X并显示在LCD上,同时再次发送给EndDevice,如此重复运行。Coordinator:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;其后判断网络是否启动成功,若启动成功,硬件上得标志位LED1灭;判断是否有按键被按下,若按下了,调用函数vSendData()向EndDevice发送x;在程序运行过程中若接收到EndDevice发送的数据,调用LED显示,再调用函数vSendData()向EndDevice发送x。主程序流程图如下图所示:Coordinator主程序流程图:Enddevice:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;其后判断是否加入网络成功,若加入成功,则硬件上的标志位LED0灭;判断若接收到Coordinator发送的数据,将接收的数据加1,最后调用BOS时钟周期性调用vAppTick函数,函数中调用vSendData()向Coordinator发送x,这样就能实现定时发送。主程序流程图如下图所示:Enddevice主程序流程图:四、实验结果与分析1.在实验一中分别按动Coordinator的SW0~SW3,在Enddevice上的LED0~LED3能够实现相应的亮灭,同样地,分别按动Enddevice上的SW0~SW3,也能使得Coordinator上相应的LED0~LED3亮灭。可以达到按键控制双方的效果,符合题目要求,说明程序设计正确。2.在实验二中按动Coordinator的SW0,可以看见LCD液晶显示频上数据从0开始自加一,说明Coordinator和Enddevice之间相互发送数据了,符合题目要求,说明程序设计正确。五、存在问题和解决方法1.在下载完程序上电测试时,发现Coordinator和Enddevice的LED0、LED1均不灭,那就说明网络建立没有成功,不能实现相互间的通信,考虑到这有可能是信道干扰的问题,和其他人的信道相冲突了。于是,我将信道改成了21,同时将网络号也改掉了,重新进行下载,上电后,测试灯均灭掉了,说明网络建立成功,可以实现通信。2.在实验一中,当按下SW0是LED0亮时,必须按两次SW1才能使LED1亮,先开始以为是按键的问题,可是后来发现自己程序中指定义了一个变量bToggle,所以只有当LED0灭了后,那么按一下SW1则LED1就亮了,这是程序中需要改进的地方。实验四两个EndDevice之间的无线通信实验一、实验内容1.分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址。按下EndDeviceA的按钮SW0发送广播请求绑定信息,LED0闪烁,收到该信息的EndDeviceB的LED0闪烁,按下其按钮SW0则返回绑定应答信息,同时LED0处于点亮状态,EndDeviceA收到应答后LED0也处于点亮状态,表示双方绑定成功。之后按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。2.分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址及绑定的媒介。按动EndDevice按钮SW0,向Coordinator发送绑定请求信息,LED0闪烁10秒,Coordinator收到该信息后记录其短地址并定时10秒,按动另外一个EndDevice的按钮SW0向Coordinator发送绑定应答信息,LED0闪烁5秒,在有效定时时间10秒内若Coordinator收到该应答信号,则记录其短地址,分别将记录的两个短地址发送给两个对应EndDevice,两个EndDevice收到短地址后分别点亮LED0(不再闪烁),若在规定时间内没有建立绑定关系,超时后灭LED0。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。绑定状态下按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。二、实验原理1.通过对方的MAC地址获得它的16位短地址在基于JennicZigBee协议栈中,每个设备必须知道对方的16位短地址,才能进行直接通信,而16位短地址是在EndDevice或Router加入网络时由Coordinator动态分配的。如果一个设备(请求者)知道另一个设备的MAC地址时,则请求者可通过调用zdpNwkAddrReq()函数广播查寻与该MAC地址相匹配的结点,当匹配的结点收到该数据包则返回自己的短地址给请求者,请求者即可用该短地址与其进行通信。2.通过广播请求对方绑定获得它的16位短地址在使用afdeDataRequest()函数发送数据包时,将16位的目标地址设置为0xffff,即可以广播的形式将数据包发送出去。一个设备(请求者)想获取另一个设备的16位短地址的方法是:发送一个广播请求绑定指令数据包,符合条件的结点(如判断指令包内容,按下按钮等)发送应答包(含自己的短地址)给请求者,请求者即可用该短地址与其进行通信。3.通过发送请求/应答绑定信息给Coordinator获得对方的16位短地址按动EndDevice或Router按钮,调用afdeDataRequest()函数向Coordinator发送绑定请求信息,Coordinator收到该信息后记录其短地址并定时,按动另外一个结点的按钮使用afdeDataRequest()函数向Coordinator发送绑定应答信息,在有效定时时间内若Coordinator收到该应答信号,则记录其短地址,分别将记录的两个段地址发送给两个对应结点,两个结点收到短地址后便可以相互直接通信。4.高功率模式M02与M04高功率模块使用时,需要进行高功率配置,一般在初始化阶段设置。高功率模块配置函数原型为:VoidvAHI_HighPowerModuleEnable(bool_tbRFTXEn,Bool_tbRFRXEn);5.网络地址请求函数zdpNwkAddrReq()在Coordinator与EndDevice实现的点对点实验介绍了Coordinator获取16位短地址的方法,而对于EndDevice和Router,当一个结点知道另一个结点的MAC地址后,则可以通过网络地址请求函数zdpNwkAddrReq()以广播的方式发送数据包,查找与该MAC地址相匹配的结点在网络中的短地址。协议栈可通过调用JZA_vZdpResponse()函数处理响应消息。6.网络地址请求响应函数JZA_vZdpResponse()JZA_vZdpResponse()是一个协议栈调用应用程序的函数,当一个结点通过zdpNwkAddrReq()发送查找另一个结点的短地址后,匹配的结点发送的应答消息可通过请求者的协议栈调用JZA_vZdpResponse()处理。三、软件设计1.分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址。按下EndDeviceA的按钮SW0发送广播请求绑定信息,LED0闪烁,收到该信息的EndDeviceB的LED0闪烁,按下其按钮SW0则返回绑定应答信息,同时LED0处于点亮状态,EndDeviceA收到应答后LED0也处于点亮状态,表示双方绑定成功。之后按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。Coordinator:Coordinator负责建立网络和分配短地址,程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭。主程序流程图如下图所示:Coordinator主程序流程图:EnddeviceA:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;其后判断网络是否加入成功,若加入成功,则硬件上的标志位LED0灭。判断是否按下SW0键,若有按下,则调用vSendData()函数发送广播请求绑定信息;判断是否收到应答信息,若收到,则调用vLedControl(1,TRUE)控制LED0处于点亮状态,表示双方绑定成功,并且获取对方短地址,此时能够与EnddeviceB进行通信;然后就开始读取按键值,若有按键按下,则调用按键处理函数进行按键处理;同时若收到目标地址的MSG信息,则执行对应控制指令。主程序流程图如下图所示:EnddeviceA主程序流程图:EnddeviceB:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;其后判断网络是否加入网络成功,若加入成功,则硬件上的标志位LED0灭。判断若接收到广播请求绑定信息,则获取对方短地址,且EnddeviceB的LED0闪烁,若按下其SW0,则返回绑定应答信息,同时调用vLedControl(1,TRUE)控制LED0处于点亮状态,并且调用vSendData(0)函数发送应答信息,此时与EnddeviceA建立通信;若有按键按下,则读取按键的值,若读取成功则调用按键处理函数进行按键处理;同时若收到目标地址的MSG信息,则执行对应控制指令。主程序流程图如下图所示:EnddeviceB主程序流程图:四、实验结果与分析1.给电路板上电后,Coordinator负责建立网络和分配短地址,且三方的网络建立成功。然后按下EndDeviceA的SW0向EndDeviceB发送广播请求绑定信息,此时EndDeviceA的LED0不断地闪烁,收到该信息的EndDeviceB的LED0也闪烁,在程序中我定义了他们两方是一直闪烁的。当按下EndDeviceB的SW0按钮则返回绑定应答信息,此时EndDeviceB通过其中的JZA_bAfMsgObject函数将EndDeviceA的地址记录下来,作为目标地址,同时LED0处于点亮状态。与此同时EndDeviceA收到应答后也同样将EndDeviceB的地址作为目标地址,同时LED0也处于点亮状态,表示双方绑定成功。之后按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。如果按下任何EndDevice的SW1此时的目标地址都为0,解除绑定,且LED1闪烁3秒,实验现象符合要求。五、存在问题和解决方法1.在本次实验中,当EndDeviceA发送信息后LED0我设置了长闪,但会出现永远闪烁的情况,即跳不出闪烁的循环子程序,针对这一问题,我写了两个闪烁程序,同时设置了一个标志位,使得n=1的时候才执行闪烁程序,问题得以解决。实验五DIO中断实验一、实验内容1.分别为Coordinator和EndDevice设计一个程序,运用DIO中断的方式分别用按键控制切换对方对应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0等等。2.分别为Coordinator和EndDevice设计一个程序,运用DIO中断的方式分别用DIO4、DIO5、DIO6、DIO7切换对方相应LED亮/灭状态。如Coordinator的DIO4控制EndDevice的LED0,EndDevice的DIO5控制Coordinator的LED1等等。二、实验原理1.vAHI_DioSetDirection()函数该函数用来设置DIO引脚的方向(输入或输出),其函数原型和使用方法参见讲义2。当某个DIO作为外部终端源时,则意味着该DIO引脚设置为输入。如果一个DIO引脚已安排给另一个外设且该外设已启用,则该函数对该DIO引脚不产生影响。2.vAHI_DioInterruptEdge()函数当某个DIO作为输入引脚时,则用该函数设置中断产生时是采用上升沿还是下降沿触发。该函数的原型如下:voidvAHI_DIOInterruptEdge(uint32u32Rising,uint32u32Falling);各参数的具体含义描述如下:u32Rising:32位位掩码,其位0至位20对应于每一个DIO引脚。当某一位为1时,则意味着该位对应的引脚在输入信号的上升沿触发中断。u32Rising的位21至位31无定义,可设置为1或0。u32Falling:32位位掩码,其位0至位20对应于每一个DIO引脚。当某一位为1,则意味着该位对应的引脚在输入信号的下降沿触发中断。u32Rising的位21至位31无定义,可设置为1或0。该函数仅将u32Rising中为1的位对应的引脚设置为上升沿触发中断,u32Falling中为1的位对应的引脚设置为下降沿触发中断,没有涉及到的引脚保持它原来的状态。如果某一个引脚在u32Rising和u32Falling中都进行了设置,则默认为上升沿触发。该函数仅对设置为输入的DIO引脚有效。如果一个DIO引脚已安排给另一个外设且该外设已启用,则该函数对该DIO引脚不产生影响。例如:vAHI_DioSetDirection(0x000000FF,0x00000000);vAHI_DioInterruptEdge(0x0000000F,0x00000077);函数vAHI_DioSetDirection设置DIO0、DIO1、……DIO7等8个引脚方向为输入,函数vAHI_DIOInterruptEdge设置DIO0、DIO1、DIO2和DIO3等4个引脚为上升沿触发中断,DIO4、DIO5和DIO6等3个引脚为下降沿触发中断,DIO7引脚保持原状态。3.vAHI_DioInterruptEnable()函数当某个DIO作为输入引脚时,则该函数用来设置接收或屏蔽该引脚发来的中断,及使能/屏蔽中断。该函数的原型如下:voidvAHI_DIOInterruptEnable(uint32u32Enable,uint32u32Disable);各参数的具体含义描述如下:u32Enable:32位位掩码,它的位0至位20对应于每一个DIO引脚。当某一位为1时,则使能该位对应的引脚发来的中断。u32Enable的位21至位31无定义。u32Disable:32位位掩码,它的位0至位20对应于每一个DIO引脚。当某一位为1时,则屏蔽该位对应的引脚发来的中断。u32Disable的位21至位31无定义。该函数仅使能u32Enable中为1的位对应的引脚中断,屏蔽u32Disable中为1的位对应的引脚中断,没有涉及到的引脚保持它原来的状态。如果某一个引脚在u32Enable和u32Disable中都进行了设置,则默认为屏蔽中断。该函数仅对设置为输入的DIO引脚有效。如果一个DIO引脚已安排给另一个外设且该外设已启用,则对该DIO引脚不产生影响。DIO引脚中断可用来唤醒处于睡眠模式的设备。例如:vAHI_DioSetDirection(0x000000FF,0x00000000);vAHI_DioInterruptEdge(0x0000000F,0x00000077);vAHI_DioInterruptEnable(0x00000007,0x0000007C);使能DIO0和DIO1两个引脚的中断,上升沿触发中断,屏蔽DIO2、DIO3、DIO4、DIO5和DIO6等5个引脚。DIO7引脚为输入,其它引脚保持原状态。4.JZA_vPeripheralEvent()函数该函数在中断上下文时调用,即微处理器在执行中断处理程序的过程中调用,用于处理硬件中断。该函数的原型为:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap);各参数的具体含义描述如下:u32Device:产生中断的外围设备ID号,在802.15.4规范中被定义为枚举值。u32ItemBitmap:与u32Device相对应的外围设备中断源的位映射图,在802.15.4规范中被定义为枚举值。5.vAHI_DioSetPullup()函数当某个DIO作为输入输出引脚时,则用该函数设置相应引脚是否上拉。该函数的原型如下:voidvAHI_DioSetPullup(uint32u32On,uint32u32Off);各参数的具体含义描述如下:u32On:32位位掩码,其位0至位20对应于每一个DIO引脚。当某一位为1时,则意味着该位对应的引脚被上拉。u32On的位21至位31无定义,可设置为1或0。u32Off:32位位掩码,其位0至位20对应于每一个DIO引脚。当某一位为1时,则意味着该位对应的引脚关闭上拉。u32Off的位21至位31无定义,可设置为1或0。三、软件设计1.分别为Coordinator和EndDevice设计一个程序,运用DIO中断的方式分别用按键控制切换对方对应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0等等。Coordinator:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯、中断口和协议栈,并且启动BOS定时时钟;其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,其次再判断是否有新的结点加入,若有新结点加入,硬件上得标志位LED1灭;判断是否有按键被按下,若按下了则表示有中断,所以调用vSendData()函数向enddevice发送一个数据,在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制灯的亮灭。主程序流程图如下图所示:Coordinator主程序流程图:Enddevice:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯、中断端口和协议栈,并且启动BOS定时时钟;其后判断是否加入网络成功,若加入成功,则硬件上的标志位LED0灭;判断是否有按键被按下,若按下了则表示有中断,所以调用vSendData()函数向enddevice发送一个数据,在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制灯的亮灭。主程序流程图如下图所示:Enddevice主程序流程图:2.分别为Coordinator和EndDevice设计一个程序,运用DIO中断的方式分别用DIO4、DIO5、DIO6、DIO7切换对方相应LED亮/灭状态。如Coordinator的DIO4控制EndDevice的LED0,EndDevice的DIO5控制Coordinator的LED1等等。Coordinator:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、LED灯、中断口和协议栈,并且启动BOS定时时钟;其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,其次再判断是否有新的结点加入,若有新结点加入,硬件上得标志位LED1灭;判断是否有中断,若有中断,调用vSendData()函数向enddevice发送一个数据,在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制灯的亮灭。主程序流程图如下图所示:Coordinator主程序流程图:Enddevice:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、LED灯、中断端口和协议栈,并且启动BOS定时时钟;其后判断是否加入网络成功,若加入成功,则硬件上的标志位LED0灭;判断是否有中断,若有中断,则调用vSendData()函数向enddevice发送一个数据,在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制灯的亮灭。主程序流程图如下图所示:Enddevice主程序流程图:四、实验结果与分析1.在实验一中,分别按动Coordinator和Enddevice的SW0、SW1、SW2、SW3可以控制对方的相应的LED灯出现亮灭交替的状态,因为SW0、SW1、SW2、SW3对应的是DIO9、DIO10、DIO11、DIO20口,按下按键的时候即给这些端口以中断,从而控制了LED的亮灭,实验现象与要求的相同,说明程序正确且正常运行。2.在实验二中,通过用杜邦线连接相应的中断端口,中断端口在程序中有所设置,插拔杜邦线,即给以端口中断,从而控制了LED灯的亮灭。五、存在问题和解决方法1.在实验中,会存在不只中断一次的情况,经过多番尝试,发现原程序中的vAHI_DioInterruptEnable()函数本身就存在问题,以我自己的理解,执行这个程序的时候并没有起到消抖的作用,所以我在程序中设置了一个标志位,起到了消抖的作用,使其只中断一次,同时在硬件和软件上都起到了屏蔽中断的作用。实验六定时器实验一、实验内容1.设计一个程序,运用Timer1中断实现流水灯,周期1秒。2.设计一个程序,初始化DIO16(LED0)为输入,运用Timer0PWM输出控制LED0的亮灭状态,一个周期内亮2秒,灭1秒。二、实验原理1.vAHI_TimerEnable()函数该函数用来使能指定的定时器,并为该定时器设置参数。该函数的原型如下:voidvAHI_TimerEnable(uint8u8Timer,uint8u8Prescale,bool_tbIntRiseEnable,bool_tbIntPeriodEnable,bool_tbOutputEnable);各参数的具体含义描述如下:u8Timer:定时器的标识,在JN5121/JN513x微控制器中有两个应用级定时器/计数器,用E_AHI_TIMER_0和E_AHI_TIMER_1分别标识Time0和Timer1。u8Prescale:时钟的预分频值,它的最大值为16。分频后的频率为原频率的1/2u8Prescale。bIntRiseEnable:该参数值为TRUE时,定时器的输出变为高电平时使能中断。bIntPeriodEnable:该参数值为TRUE时,当定时器的一个周期到且输出变为低电平时,使能中断。bOutputEnable:该参数值为TRUE时,使定时器的输出出现在与PWM相关的输出引脚上。Timer0使用DIO8-10引脚,Timer1使用DIO11-13引脚。2.vAHI_TimerClockSelect()函数选择内部或外部时钟,当使用内部时钟时要设置输出门。该函数的原型如下:voidvAHI_TimerClockSelect(uint8u8Timer,bool_tbExternalClock,bool_tbGateControl);各参数的具体含义描述如下:u8Timer:定时器的标识,与函数vAHI_TimerEnable()中的用法相同,用E_AHI_TIMER_0和E_AHI_TIMER_1分别标识Time0和Timer1。bExternalClock:该参数值为TRUE,表示使用外部时钟;为FALSE,表示使用16MHz的内部时钟。bGateControl:该参数值为TRUE时,表示当定时器的门输入是高电平时,打开输出引脚;为FALSE时,表示当定时器的门输入为低电平时,打开输出引脚。3.vAHI_TimerStartRepeat()函数设置重复定时器。该函数的原型如下:voidvAHI_TimerStartRepeat(uint8u8Timer,uint16u16Hi,uint16u16Lo);各参数的具体含义描述如下:u8Timer:定时器的标识,用E_AHI_TIMER_0和E_AHI_TIMER_1分别标识Time0和Timer1。u16Hi:该参数值表示在开始一个定时器之后,在定时器的输出变为高电平之前经历的时钟周期数。u16Lo:该参数值表示在开始一个定时器之后,在定时器的输出变为低电平之前经历的时钟周期数。即定时器有效时间内的时钟周期数。启动定时器后,当经历u16Hi个时钟周期后,定时器的输出由低电平变为高电平,再经历u16Lo-u16Hi个时钟周期后,定时器的输出由高电平变为低电平,重新启动定时器。这个过程重复执行,直到执行vAHI_TimerStop()函数停止定时器为止。如果定时器的中断使能,可设置当定时器的输出由低电平变为高电平时触发中断,也可设置当定时器的输出电平由高变低时触发中断。4.停止定时对于设置了重复定时器,当需要停止定时时,则需要执行vAHI_TimerStop()函数停止定时器,其函数原型如下:voidvAHI_TimerStop(uint8u8Timer);参数u8Timer为定时器的标识,用E_AHI_TIMER_0和E_AHI_TIMER_1分别标识Time0和Timer1。5.定时时间计算以内部时钟为例计算定时时间为:LouMHzescaleu162161Pr8××,例如当设置Timer0为:vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,FALSE);vAHI_TimerClockSelect(E_AHI_TIMER_0,FALSE,TRUE);vAHI_TimerStartRepeat(E_AHI_TIMER_0,8000,15625);则定时器时间为:1/16MHz×2u8Prescale×u16Lo=1/16×210×15625=1s6.定时器的设置在程序中用E_AHI_TIMER_0和E_AHI_TIMER_1分别标识Time0和Timer1。在使用定时器之前需要对定时器进行设置,主要使用三个函数:第一个函数vAHI_TimerEnable(),用来使能指定的定时器,并为该定时器设置参数;第二个函数是vAHI_TimerClockSelect(),用来选择内部或外部时钟,当使用内部时钟时还要设置输出门;第三个函数是vAHI_TimerStartRepeat(),设置重复定时时间。例如对定时器初始化的程序段如下:vAHI_TimerEnable(E_AHI_TIMER_1,10,FALSE,TRUE,FALSE);vAHI_TimerClockSelect(E_AHI_TIMER_1,FALSE,TRUE);vAHI_TimerStartRepeat(E_AHI_TIMER_1,8000,16000);7.定时中断响应处理JZA_vPeripheralEvent()函数在JennicZigBee协议栈处理硬件中断时调用,定时器中断也属于外部中断,因此在该函数中加入定时器中断处理程序,例如当有Timer1中断时,如果EndDevice已加入网络,则发送一个数据包给Coordinator,其程序代码如下:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap){if(u32Device==E_AHI_DEVICE_TIMER1)if(bNwkJoined)vSendData(2);}其中u32Device指产生中断的设备ID号,E_AHI_DEVICE_TIMER1是指定时器Tiner1的ID号,这段程序的意思是:若中断来自于Timer1并且EndDevice已加入网络的情况下给Coordinator发送数据包。三、软件设计1.设计一个程序,运用Timer1中断实现流水灯,周期1秒。程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯、定时器和协议栈,并且启动BOS定时时钟;然后调用JZS_vStartStack()函数,启动网络,如果网络启动,在硬件电路上的标志为LED0灭;其次检测是否有按键按下,如果SW3按下,则判断标志为Flag1,若Flag=1则开定时器1,并执行中断处理函数,使得LED流水灯顺时针显示,周期为1s,若Flag=0,则关定时器1;如果按下SW2按下,则判断标志为Flag2,若Flag=2则开定时器1,并执行中断处理函数,使得LED流水灯逆时针显示,周期为1s,若Flag=0,则关定时器1。主程序流程图如下图所示:2.设计一个程序,初始化DIO16(LED0)为输入,运用Timer0PWM输出控制LED0的亮灭状态,一个周期内亮2秒,灭1秒。程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,同时调用vAHI_DioSetDirection()函数设置DIO16(LED0)为输入脚,DIO10(Timer0PWM)为输出脚,并且启动BOS定时时钟;然后调用JZS_vStartStack()函数,启动网络,如果网络启动,在硬件电路上的标志为LED0灭;其次检测是否有按键按下,如果SW0按下,则判断标志为Flag1,若Flag=1则开定时器1,并执行中断处理函数,根据PWM输出控制LED的亮灭状态,亮灭的时间通过函数vAHI_TimerStartRepeat(E_AHI_TIMER_0,31250,62500)设置,本次实验中,我设置了定时4s,亮2s,灭2s。主程序流程图如下图所示:四、实验结果与分析1.在实验一中,按动SW3,LED流水灯顺时针显示,周期为1s,再按一下SW3,定时器关,LED停止流水灯显示;按动SW2,LED流水灯逆时针显示,周期为1s,再按一下SW3,定时器关,LED停止流水灯显示。符合题目要求,说明程序正确。2.在实验二中,用一根杜邦线将DIO16脚与DIO10脚相连接,按下SW0后,定时器0开,根据高低电平的变化,实现了LED0亮2s,灭2s的现象,符合题目要求,程序正确。五、存在问题和解决方法1.在实验先开始,没有确定LED等式低电平亮还是高电平亮,所以在实验二中,导致设置的LED亮灭的状态与自己预定的相反,解决的方法即在实验前测试了一下,确定了LED灯是当低电平的时候点亮。2.在实验二中,要通过插杜邦线,将DIO16和DIO10脚相连接,但是,开电源之后,LED并没有任何变化,在检查程序没有错误的情况下,发现是杜邦线插错了脚,这告诉我们做任何事情都要细心,注意细节。3.在实验二中,我开始设置定时器是vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,FALSE),结果无法正常显示,于是后来我将定时器设置为vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,TRUE),因为必须设置为输出才能有PWM输出。实验七UART实验一、实验内容1.分别为Coordinator和EndDevice设计一个程序:按动EndDevice的不同按钮能够向Coordinator发送不同信息,再由Coordinator经串口转发给PC机,串口调试工具输出窗口能够看到相关信息。2.分别为Coordinator和EndDevice设计一个程序:通过PC机串口调试工具经串口发送文本信息给Coordinator,再由其转发给EndDevice,然后在与EndDevice相连的LCD上显示文本信息内容。二、实验原理1.vAHI_UartEnable()函数UART使能指定。函数的原型如下:voidvAHI_UartEnable(uint8u8Uart);参数u8Uart用来标识UART,其值可以是E_AHI_UART_0或E_AHI_UART_1,前者表示UART0,后者表示UART1。2.vUART_printInit()函数该函数用来初始化串口0,函数的原型如下:PUBLICvoidvUART_printInit(void);调用该函数需要在工程文件中加入头文件Printf.h,例如:#include<Printf.h>3.vPrintf()函数使用vPrintf()函数往串口0发送数据,函数的原型如下:PUBLICvoidvPrintf(constchar*fmt,...);参数*fmt是用来往串口0发送的字符串。调用该函数需要在工程文件中加入头文件Printf.h。4.UART接收字符中断响应处理JZA_vPeripheralEvent()函数在JennicZigBee协议栈处理硬件中断时调用。如下程序为处理来自于串口0的中断和定时器中断:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap){if(u16DstAddres==0)return;//如果EndDevice没有加入网络,则返回switch(u32Device){caseE_AHI_DEVICE_UART0://是UART0中断?if((u32ItemBitmap&0x000000FF)==E_AHI_UART_INT_RXDATA)//判断是否为来自串口的接收字符中断{/*处理UART0接收中断*/cCharIn=((u32ItemBitmap&0x0000FF00)>>8);cCommandBuffer[u8CommandTail]=cCharIn;//将接收的字符放入缓冲区中u8CommandTail=u8CommandTail+1;if(u8CommandTail==80){vSendData(u16DstAddres,u8CommandTail,cCommandBuffer);u8CommandTail=0;}}caseE_AHI_DEVICE_TIMER1:/*如果中断来自timer1(每100ms产生1次中断)*/if(bNwkStarted&&u8CommandTail>0){vSendData(u16DstAddres,u8CommandTail,cCommandBuffer);u8CommandTail=0;}break;}}其中u32Device指产生中断的设备ID号,如果是来自串口0的中断,则判断是否接收中断,若是接收中断,则将接收的字符放入接收缓冲区中,若缓冲区中存放字符数达到80个,则将缓冲区中的字符发送给EndDevice。如果是来自定时器Tiner1的中断,则查看缓冲区中是否有字符,若有则将缓冲区中的字符发送给EndDevice。5.vAHI_UartReset()函数UART重新设置发送和接收FIFO队列。该函数的原型如下:voidvAHI_UartReset(uint8u8Uart,bool_tbTxReset,bool_tbRxReset);6.vAHI_UartSetClockDivisor()函数该函数用来设置UART波特率,函数的原型如下:voidvAHI_UartSetClockDivisor(uint8u8Uart,uint8u8BaudRate);7.vAHI_UartSetControl()函数设置指定的UART的各种控制位。该函数的原型如下:voidvAHI_UartSetControl(uint8u8Uart,bool_tbEvenParity,bool_tbEnableParity,uint8u8WordLength,bool_tbOneStopBit,bool_tbRtsValue);8.vAHI_UartSetInterrupt()函数使能/屏蔽指定UART产生的中断,并且设置接收FIFO级别。9.u8AHI_UartReadLineStatus()函数获得指定UART的线状态信息,该函数的原型如下:uint8u8AHI_UartReadLineStatus(uint8u8Uart);10.vAHI_UartWriteData()函数UART往发送FIFO队列中放一个字节。函数的原型如下:voidvAHI_UartWriteData(uint8u8Uart,uint8u8Data);其中u8Uart用来标识UART,u8Data是指往发送FIFO队列中放的字节。三、软件设计1.分别为Coordinator和EndDevice设计一个程序:按动EndDevice的不同按钮能够向Coordinator发送不同信息,再由Coordinator经串口转发给PC机,串口调试工具输出窗口能够看到相关信息。Coordinator:程序首先执行AppColdStart()函数,设置信道号和PANID,然后调用vInit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS定时时钟;然后调用JZS_vStartStack()函数,启动网络,如果网络启动,在硬件电路上的标志为LED0灭,如果有新结点加入,则LED1熄灭;其次看Coordinator是否有接受到EndDevice发送来的消息,若接收到enddevice发送的消息,则通过调用vPrintf()函数将接收的字符串送到串口显示出来。主程序流程图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论