通信新技术实验报告文档格式.docx
《通信新技术实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《通信新技术实验报告文档格式.docx(94页珍藏版)》请在冰豆网上搜索。
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引脚
共用关系
DIO0
SPI从选择1(输出)
DIO1
SPI从选择2(输出)
DIO2
SPI从选择3(输出)
DIO3
SPI从选择4(输出)
DIO4-DIO7
UART0
DIO8-DIO10
Timer0
DIO11-DIO13
Timer1
DIO14-DIO15
Serialinterface
DIO16
IPdatain
DIO17-DIO20
UART1
常用函数:
(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按钮。
三、软件设计
程序首先执行AppColdStart()函数,自动寻找最安静的信道,然后调用vInit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定时时钟,其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,网络启动成功后就开始读取按键值,并执行相应的按键控制LED亮灭的子程序,主程序流程图如下图所示:
程序首先执行AppColdStart()函数,自动寻找最安静的信道,然后调用vInit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定时时钟,其后判断网络是否启动成功,若启动成功,则硬件上的标志位LED0灭,网络启动成功后就调用vAppTickLED()函数,定时为1s,定时时间一到,循环执行vAppTickLED()函数,通过定义一个变量LED,LED循环变化,利用vLedControl(LED,TRUE),实现LED的流水灯显示。
主程序流程图如下图所示:
程序首先执行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:
所采用的profileID。
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)
该参数定义了发送的目标地址模式,它是APS_Addrmode_e枚举类型的数据.
u16AddrSrc:
该参数是数据发送方的源短地址,地址围为0x0000到0xFFFE。
源端口号,围是0x01到0xF0。
u8LQI:
接收帧的链路质量。
目标端口号,围是0x01到0xF0。
*puTransactionInd,:
该参数是一个指向AF_Transaction_s结构体类型的指针,在该结构体类型的变量中,存放着接收的数据。
*puTransactionRsp:
该参数是一个指向AF_Transaction_s结构体类型的指针,在该结构体类型的变量中,存放着response信息。
5.简单设备描述函数afmeAddSimpleDesc()
该函数属于AFME(AFSub-layerManagementEntity)类函数,在增加设备描述符函数vAddDesc(void)中调用,其功能是为一个endpoint增加一个简单描述符(simpledescriptor)。
如果一个endpoint上没有正确定义的简单描述符,那么它将不能正确地接收来自其他结点的数据,通常简单描述符应该在设备建立网络成功或者加入网络成功后添加。
1.分别为Coo