JIANGSUTEACHERSUNIVERSITYOFTECHNOLOGY
通信新技术综合训练报告
学院名称:_________________________________
专业:______________________________
班级:________________________________
姓名:___________________________________
学号:_______________________________________
指导老师:______________________________________
2023年3月
目录
实验一Jennic—WSN开发环境。错误!未定义书签。
实验二GP10及LCD使用实验...............................4
实验三简朴点对点无线通信实验8。
实验四两个EndDevice之间的无线通信实验..............14
实验五DI0中断实验...........................................18
实验六定期器实验。23
实验七1;人近实验。27
实验八ADC及数据采集实验。错误!未定义书签。2
实验九休眠和掉电保护实验。错误!未定义书签。8
心得体会44。
附录45。
实验一Jennic-WSN开发环境
一、实验内容
1.熟悉基于JN5139芯片所开发的一系列开发板及外围部件;
2.了解zigbee系统;
3.掌握软件的安装与调试;
4.熟悉常用API接口函数。
二、实验原理
1.JN5139最小系统及外围部件
基于JN5139芯片所设计的最小系统。SPISSZ与SPISSM连接,S
PISWP接高电平,JN5139上电自动复位或按键复位,SPIMISO为编程控制端,
与复位按键配合使用,经DI06、DI07实现程序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开发板,其部件如下:
UI:JN5139系列Zigbee模块;
U2:板载光照度传感器;
U3:板载温湿度一体传感器;
J3:外供电(5VDC)接口;
Swith:供电开关;
J7:编程与运营状态选择,左跳并给传感器板加电,则进入可编程状态,或
者在加电的情况下,按住RESET按钮,左跳J7,然后放开RESET按钮,再右跳
J7,也可进入可编程状态,退出可编程状态,只需要按一下RESET按钮即可;
J8:Flash写保护跳选,编程与运营都跳选到RUN(右跳);
DB9:RS232编程接口;
UARTO:串口0;
JP6:模块所有管脚的引出排线;
LCD:液晶接口;
Power:电源指示灯;
REST:复位按键;
LED3,LED2,LED1,LEDO:可编程LED,分别相应DI019.DI018.DI017.DI016;
SW3,SW2,SW1,SWO:可编程按键,分别相应DIO20、DI011、DI010>D
I09;
GND:地。
3.软件的安装与调试
(1)建立开发环境
在光盘中找到software文献夹下的JN-SW-4031-SDK-Toolchain-v
l.l.exe文献(或者在Jennie公司网站上获得该文献)并运营。在安装过程中,最
简朴的方法是按默认设立安装。
(2)编写程序代码并进行下载与调试
编写代码完毕后,可按Ctr1+F9快捷键或选择主菜单Build下的Bui1d子菜
单或点击图标建立可执行二进制代码文献。
若工程编译(Bui1d)成功,则可在C:\Jennic\cygwin\jennic\SDK\App
1ication
\test\JN5139—Build\Release目录下生成test,bin文献。否则,犯错信息
会显示在信息窗口中,根据犯错信息调试程序。
JennicJN51xxFlash可编程器是用来将编译好的二进制代码文献(*.b
in)下载至【JJN51xx模块中的F1ash芯片的代码下载工具,它通过串行总线与JN5
1xx模块相连。
JennicJN51xxFlash可编程器的用户界面如图1一18所示,它可以将
*.bin文献下载到目的板或模块中,下载环节如下:
a.用串口线连接PC机和目的板或模块。
b.运营Flash可编程器,选择PC机与目的板相连的串行通讯端口。
c.将目的板上的J7跳线至编程(左侧)状态,给目的板上电,按一下RESET按
钮后释放,再恢复J7跳线至右侧。
d.在图1T8所示的Flash可编程界面上点击Browse按钮(图中①处)查找
并选择要下载的目的文献。
e.选择好目的文献后,点击Progrm按钮(图中②处)开始下载。在下载
的过程中会显示一个下载的进度条,如图1—19所示。当下载完毕后,将显示下
载成功或错误,如图120所示下载成功对话框。假如碰到错误,请尝试重新下载。
f.成功下载后,关掉Flash可编程器再给目的板或模块上电、或按Reset按
钮,则刚下载的代码自动运营。
4.常用API接口函数介绍
(1)应用程序初始化函数如下:
AppColdStart()
应用程序的入口,相称于标准C中的main函数,结点上电后将从这里开始
执行应用程序。该函数需要完毕以下功能:1.通过设立函数中的参数值来设立
信道号(JZS_sConfig.u32Channel)和PANID(JZS_sConfig.ul6
Panld);2.调用函数JZS_u32InitSystem(TRUE)来初始化ZigBee协
议栈;3.调用函数vlnit()对用户的应用进程进行初始化,涉及初始化按钮动
作和程序变量,设定绑定等操作;4.调用bBosRun(TRUE)来启动操作系统
BOSo用户可根据具体的应用设计该函数。
AppWarmStart()
结点从内存供电的休眠模式唤醒的时候将进入这个函数。启动后所有的内存
数据都没有丢失。假如设备不需要休眠唤醒功能,这个函数可认为空。用户可根
据具体的应用设计该函数。一般情况下,该函数会调用AppColdStart()重
新启动设备。
(2)应用程序调用协议栈的函数如下:
JZS_u32InitSystem()
初始化JennieZigBee协议栈。
JZS_vStartStack()
设备将作为Coordinator、Router或者EndDevice启动。假如是
Coordinator将启动网络,假如是Router或者EndDevice将加入网络。
JZS_vStartNetwork()
手动控制Coordinate网络启动,相对于自动网络启动,使用该功能,需要
设立JZS_sConfig.bAutoJoin=FALSE.该函数执行后,返回的协议栈事件为
JZS_EVENT_NWK_STARTEDJZS_EVENT_FAILED_TO_START_NETWOR
Ko
vAppSaveContexts()
保存网络参数以及用户的数据,假如你的应用是固定点的话,建议你进行网
络参数的保存。
ul6AppGetContextSize()
用来获取保存的网络参数以及用户数据的尺寸。
vAppGetContexts()
读取保存的网络参数的内容。
(3)协议栈调用应用函数的函数如下:
JZA_boAppStart()
让用户可以在协议栈启动前定义endpoint的descriptor,通常开发人
员应当在这个函数中调用JZS_vStartStack启动协议栈。
JZA_vStartEvent()
协议栈将通过这个函数反馈网络层的一些网络事件,比如网络启动成功、结
点加入成功或者数据发送完毕等。
JZA_vPeripheralEvent()
该函数重要用来解决外部的硬件中断,比如按钮、定期器、UART等。
JZA_vAppEventHand1er()
BOS周期性地调用该函数解决硬件中断。用户可以运用它进行网络状态的判
断和按钮的检查等,也可以在这个函数中,写入自己的应用程序。在设计该函数
JZA_vAppDefineTasks()
该函数用于向BOS注册自己的用户任务,一般很少使用该函数。
JZA_bAfMsgObject()
收到其他结点发送来的MSG帧的解决函数。
实验二GPIO及LCD使用实验
1.运用基本GPI0函数设计一个程序,分别通过各按键切换相应LED亮/
灭状态。
2.设计一个程序,实现LED自动闪烁,周期为1秒。
3.设计一个程序,按下按键SW0,LCD显示数据加1;按下按键SW1,LCD显示
数据减1。
1.GPIO使用
Jennic的模块具有21路通用的GPIO,可以通过软件的方式进行设立,
这些GPI0口和其他的外围接口是共用的。其共用关系如表2—1所示:
表2-1:10口和其他的外围接口共用关系
DIO引脚共用关系
DIOOSPI从选择1(输出)
DIO1SPI从选择2(输出)
DI02SPI从选择3(输出)
DI03SPI从选择4(输出)
DI04-DIO7UARTO
DI08-DI010TimerO
DIOil-DI013Timerl
DI014-DIO15Serialinterface
DI016IPdatain
DI017-DI020UARTl
常用函数:
(1)对于GPIO的操作一方面需要调用vAHI_DioSetDirection来进行GPI0输
入输出方向的设立。该函数的原型如下:
PUBLICvoidvAHI_DioSetDirection(uint32u32Inputs,uint
32u320utputs);
这里u321nputs和u32Outputs是设立GPIO输入和输出地mask码。
(2)对于GPIO的输出操作比较简朴,通过调用如下原型函数:
PUBLICvoidvAHI_DioSet0utput(uint32u320n,uint32u3
2Off);
这里u320n和u32Off分别是设立GPIO输出高、低电平的掩码。
⑶对于GPIO的输入操作,通常调用如下原型函数:
PUBLICuint32u32AHI_DioReadlnput(void);
返回值相应每个输入DIO的高低电平。
2.LED使用
LED驱动库文献提供了LED的控制方法,在LedControl.h中宏定
义了相应功能函数。
对于LED的操作,一方面要调用初始化函数vLedlnitFfd()初始化FFD
开发板上的四个LED,然后调用函数vLedControl(LED,ON)控制相应LED点
亮或熄灭。相应函数原型如下:
PUBLICvoidvLedlnitFfd(void);
PUBLICvoidvLedContro1(uint8u8Led,boo1—tbOn);
3.按键使用
按键驱动库文献提供了按键的控制方法,在Button.h中宏定义了相应功能函
数。
对于按键的操作,一方面要调用初始化函数vButtonlnitFfd()初始化FFD
开发板上的四个按键,然后调用函数u8ButtonReadFfd()读取相应按键的状态。
相应函数原型如下:
PUBLICvoidvButtonInitFfd(void);
PUBLICuint8u8ButtonReadFfdCvoid);
4.LCD使用
LCD驱动库文献库提供了液晶的驱动方法,在Lcd_JMl2864_Driver.h中
提供了相应功能的原型函数。
5.BOS定期器的使用
为了消除按钮抖动对控制器的影响,本实验设立的一个读取按钮的标志变量
NextReadStart,若其值为TRUE且有按下按钮SW的操作,则设立其为FALS
E,并运用BOS的定期器函数bBosCreateTimer。定期,50Oms后再次设立Ne
xtReadStart为真。通过关这种方法可有效地消除按钮抖动的影响。
bBosCreateTimer()函数是一个解决软件定期器的BOSAPI函数,调用该函
数可由BOS创建一个软件定期器,该定期器要运用内部硬件滴答定期器(tick
决程序。
6.协议栈事件
函数JZA_vStackEvent()是一个协议栈调用应用程序的函数(回调函数)。
它的重要功能是解决来自于协议栈底层的各种事件,比如,APS层数据传输确认。
用户通过该函数可以解决来自于AF和ZDP层的事件。该函数的原型为:
PUBLICvoidJZA_vStackEvent(teJZS_EventIdentifi
ereEventld,
tuJZS_StackEvent*puStac
kEvent);
其中参数eEventId表达事件的类型,参数puStackEvent表达有关发生事
件的补充信息。
7.周期性调用函数
网络启动后,每隔一定期间,BOS就会调用JZA_vAppEventHand1er()
函数一次,该函数专门来解决硬件中断,用户可以在该函数中添加用于网络状态
判断、按钮检查等检测中断事件的程序代码,也可以添加用于发送数据的程序代
码等。本实验运用该函数检查是否按下SW按钮。
三、软件设计
程序一方面执行AppC。1dStart。函数,自动寻找最安静的信道,然后调用
vlnit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定期时钟,其后
判断网络是否启动成功,若启动成功,则硬件上的标志位LEDO灭,网络启动成功
后就开始读取按键值,并执行相应的按键控制LED亮灭的子程序,主程序流程图
如下图所示:
2.设计一个程序,实现LED自动闪烁,周期为1秒。
程序一方面执行AppColdStart()函数,自动寻找最安静的信道,
然后调用vlnit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定期时
钟,其后判断网络是否启动成功,若启动成功,则硬件上的标志位LEDO灭,网络
ppTickLED()函数,通过定义一个变量LED,LED循环变化,运用vLedC
ontrol(LED,TRUE),实现LED的流水灯显示。主程序流程图如下图所示:
(开始)
系统、LED、按键初始化
N
、网络是否启动成功二------
调用vAppTickLED。函数,
实现LED自动闪烁
3.设计一个程序,按下按键SWO,LCD显示数据加1;按下按键SW1,LCD
显示数据减1。
程序一方面执行AppCo1dStart()函数,自动寻找最安静的信道,然后调用
vlnit()函数,初始化系统、LED、按键和协议栈,并且启动BOS定期时钟,其
后判断网络是否启动成功,若启动成功,则硬件上的标志位LEDO灭,网络启动
成功后调用JZA_vAppEventHand1er()函数读取按键值,若有键按下,调
用按键子程序vProcessSplashKeyPress(),执行case语句:按键0,对液晶
显示的数进行加1;按键1,对液晶显示的数进行减lo主程序流程图如下图所示:
四、实验结果与分析
1.实验一中分别按下按键SW0~SW3,相应的LED0~LED3可以改变当前的
状态,按动一下亮、按动一下灭,实现了按键控制LED灯的亮灭;
2.实验二中实现LED的自动闪烁,实际实验中实现的是4个LED灯依次闪
3.实验三中实现了LCD的显示,并通过按键控制相应的显示为加1还是减
1,按下SW0,数值加1,按下SW1,数值减1,LCD上显示的初始值为000,加满后为
255o
五、存在问题和解决方法
1.在完毕实验二时,题目规定周期为1s,设计成流水灯的形式,其周期为1
为1S,所以通过改变延时来解决此问题,因此,在阅读题目的时候需要仔细阅读题
目规定,弄清题意。
2.在完毕实验三时,LCD刚开始的时候不能显示,但是通过检测LED的
亮灭可以知道,程序已经执行,可以看出,LCD的显示程序存在一些问题,通过仔
细研究,发现LCD显示部分有所漏缺,修改后LCD正常显示。
实验三简朴点对点无线通信实验
1.分另ij为Coordinator和EndDevice设计——个程序,分另U用按键控制
切换对方相应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LE
D3,EndDevice的SWO控制Coordinator的LEDO。
2.分别为Coordinator和EndDevice设计个程序,其功能为:按下Coor
dinator的SW0,某变量X(初始值0)显示在LCD上,同时将X发送给EndDevi
ce,EndDevice收到该数据后进行数据解决(加1),等待1秒后再将其发送给
Coordinator,Coordinator收到后将该值赋予X并显示在LCD上,同时再次
发送给EndDevice,如此反复运营。
1.获得16位短地址的方法
Coordinator的16位短地址固定为0x0000,而EndDevice的16位短
地址是由Coordinator动态分派的。EndDevice可直接使用短地址0x0000
与Coordinator通信,而Coordinate)r与EndDevice通信时,Coordinator
必须使用EndDevice的短地址。在应用程序中,Coordinator获得EndDevi
ce短地址的方法比较简朴,每当有新的结点加入到网络时,Coordinator协议栈
就会调用解决协议栈低层的回调函数JZA_vStackEvent(teJZS_Even
tIdentifiereEventId,tuJZS_StackEvent*puStackEvent),参数p
uStackEvent是一个指向栈事件tuJZS_StackEvent类型的指针,通过该参数即
可获得新加入结点的16位短地址。下面的JZA_vStackEvent()函数的代码中给
出了获取16位短地址DstAddress的具体方法。
if(eEventId==JZSEVENTNEWNODEHASJOI
NED)
DstAddress=puStackEvent->sNewNodeEvent.u16ShortAd
dr;
}
2.数据格式
ZigBee2023支持KVP键值对和MSG消息帧两种类型数据格式。KVP是
ZigBee2023协议中规定的一种特殊的数据传输机制,通过一种规定来标准化数
据传输格式和内容,重要用于传输较简朴的变量值格式;MSG是ZigBee协议中规
定的另一种数据传输机制,这种机制在数据传输格式和内容上并不做更多的规
定,重要用于专用的数据流或文献数据等数据量较大的情况。由于在ZigBe
e2023及以后的版本中不再支持KVP格式的数据包,因此,在本实验中,仅使用
MSG消息帧进行数据的传输。
在JennicZigBee应用程序中,通常使用协议栈提供的afdeDataRequest()
函数发送数据帧。当一个结点收到来自其他结点的MSG帧时,协议栈就会调用回
调函数JZA_bAfMsgObject()对接受的MSG帧进行解决。在数据收发过
程中,发送和接受设备双方都需要知道事件的数据格式,才干对的解决信息。
3.创建和发送数据请求函数afdeDataRequest()
该函数属于AFDE(AFSub-layerDataEntity)类函数,用来向网
络层发出数据发送的请求。
该函数的原型为:
Stack_Status_eafdeDataRequest(APS_Addrmode_eeAddr
Mode,
uint16u16AddrDst,
uint8u8DstEP,
uint8u8SrcEP,
uint16u16ProfileId,
uint8u8ClusterId,
AF_Frametype_eeFrameType,
uint8u8TransCount,
AF_Transaction_s*pauTransact
ions,
APS_TxOptions_eu8txOptions,
NWK_DiscoverRoute_eeDiscov
erRoute,
uint8u8RadiusCounter);
各形参描述如下:
eAddrMode:该参数定义了发送的目的地址模式,它是APS_Addrmode_e
枚举类型的数据。
u16AddrDst:该参数是数据要发送的目的地址,地址范围为0x0000到
OxFFFEo
u8DstEP:目的地址的端标语,范围是0x01到|0xF0。
u8SrcEP:源地址的端标语,范围是0x01到0xF0。
u16Profileid:所采用的profi1eID。
u8ClusterId:所采用的clusterID0
eFrameType:使用的数据帧类型0x01=KVP,Ox02=MSG。
u8TransCount:本次请求发送的数据事务的数量。取值范围在0到0x0f。
pauTransactions:该参数是一个指向AF_Transaction_s结构体类型的指针,
在该结构体类型的变量中,存放着需要发送的数据。
bTxOpti。ns:指定发送方式,可以选择下列的值,这些值可以进行逻辑或。
u8DiscoverRoute:设定所采用的路由发现模式。
u8RadiusCounter:数据发送的深度,即所发送数据包的最大转发次数,假
如设立为0,协议栈将采用2倍的MaxDepth发送深度。
4,收到MsgObject调用的函数JZA_bAfMsgObject()
该函数属于协议栈调用应用程序的函数,用来解决来自其他结点发送来的
MSG帧。
PUBLICboo1_tJZA_bAfMsgObject(APS_Addrmode_eeAddrMo
de,
uintl6ul6AddrSrc,
uint8u8LQI,
uint8u8ClusterID,
uint8*pu8ClusterIDRsp,
AF_Transaction_s*puTrans
actionlnd,
AF_Transaction_s*p
uTransactionRsp)
eAddrMode:该参数定义了发送的目的地址模式,它是APS_Addrmode_e枚
举类型的数据.
ul6AddrSrc:该参数是数据发送方的源短地址,地址范围为0x0000到
u8SrcEP:源端标语,范围是Ox01到OxFO。
u8LQI:接受帧的链路质量。
u8DstEP:目的端标语,范围是0x01到OxF0。
*puTransactionlnd,:该参数是一个指向AF_Transaction_s结构体类型
的指针,在该结构体类型的变量中,存放着接受的数据。
*puTransactionRsp:该参数是一个指向AF_Transaction_s结构体类
型的指针,在该结构体类型的变量中,存放着response信息。
5.简朴设备描述函数afmeAddSimpleDesc()
该函数属于AFME(AFSub-1ayerManagementEntity)类函
数,在增长设备描述符函数vAddDesc(void)中调用,其功能是为一个endpoin
t增长一个简朴描述符(simpledescriptor)o假如一个endpoint上没有对的
定义的简朴描述符,那么它将不能对的地接受来自其他结点的数据,通常简朴描述
符应当在设备建立网络成功或者加入网络成功后添加。
1.分别为Coordinator和EndDevice设id个程序,分别用按键控制切
换对方相应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED
3,EndDevice的SWO控制Coordinator的LEDO。
Coordinator:程序一方面执行AppCoIdStart()函数,设立信道号和PAN
ID,然后调用vlnit()函数,初始化系统、按键、LED灯和协议栈,若启动成
功,则硬件上的标志位LEDO灭,另一方面再判断是否有新的结点加入,若有新结
点加入,硬件上得标志位LED1灭;判断是否有按键被按下,若按下了则调用vS
endData()函数向enddevice发送一个数据,在程序运营过程中若接受到MSG信
息,贝U调用vLedControl(0,bToggle)控制灯的亮灭。
Coordinator主程序流程图:
Enddevice:程序一方面执行AppCok!Start()函数,设立信道号和PANID,
然后调用vlnit()函数,初始化系统、按键、LED灯和协议栈,并且启动B0
S定期时钟;其后判断是否加入网络成功,若加入成功,则硬件上的标志位LED0
灭;判断是否有按键被按下,若按下了则调用vSendData()函数向enddevice发
送一个数据,在程序运营过程中若接受到MSG信息,则调用vLedContro
1(0,bToggle)控制灯的亮灭。主程序流程图如下图所示:
Enddevice主程序流程图:
2.分别为Coordinator和EndDevice设计一个程序,其功能为:按下C
oordinator的SW0,某变量X(初始值0)显示在LCD上,同时将X发送给EndDev
ice,EndDevice收到该数据后进行数据解决(加1),等待1秒后再将其发送给
Coordinator,Coordinator收到后将该值赋予X并显示在LCD上,同时再次发
送给EndDevice,如此反复运营。
Coordinator:程序一方面执行AppColdStart()函数,设立信道号和PA
NID,然后调用vlnit()函数,初始化系统、按键、LED灯和协议栈,并且启动BOS
定期时钟;其后判断网络是否启动成功,若启动成功,硬件上得标志位LED1
灭;判断是否有按键被按下,若按下了,调用函数vSendData()向EndDevice
发送x;在程序运营过程中若接受到EndDevice发送的数据,调用LED显示,
再调用函数vSendData()向EndDevice发送x。主程序流程图如下图所示:
Enddevice:程序一方面执行AppCo1dStart()函数,设立信道号和PANI
D,然后调用vlnit()函数,初始化系统、按键、LED灯和协议栈,并且启动BO
S定期时钟;其后判断是否加入网络成功,若加入成功,则硬件上的标志位LED
0灭;判断若接受到Coordinator发送的数据胳接受的数据加1,最后调用BOS
时钟周期性调用vAppTick函数,函数中调用vSendData()向Coordinator发
送x,这样就能实现定期发送。主程序流程图如下图所示:
1.在实验一中分别按动Coordinator的SW0~SW3,在Enddevice上
的LEDOLED3可以实现相应的亮灭,同样地,分别按动Enddevice上的
SW0-SW3,也能使得Coordinator上相应的LED0~LED3亮灭。可以
达成按键控制双方的效果,符合题目规定,说明程序设计对的。
2.在实验二中按动Coordinator的SW0,可以看见LCD液晶显示频上数据
从0开始自加一,说明Coordinator和Enddevice之间互相发送数据了,符
合题目规定,说明程序设计对的。
1.在下载完程序上电测试时,发现Coordinator和Enddevice的LED0、
LED1均不灭,那就说明网络建立没有成功,不能实现互相间的通信,考虑到这
有也许是信道干扰的问题,和其别人的信道相冲突了。于是,我将信道改成了21,
同时将网络号也改掉了,重新进行下载,上电后,测试灯均灭掉了,说明网络建立
成功,可以实现通信。
2.在实验一中,当按下SW0是LED0亮时,必须按两次SW1才干使LE
D1亮,先开始认为是按键的问题,可是后来发现自己程序中指定义了一个变量
bToggle,所以只有当LEDO灭了后,那么按一下SW1则LED1就亮了,
这是程序中需要改善的地方。
实验四两个EndDevice之间的无线通信实验
1.分别为Coordinator和EndDevice设id''一■个程序,其功能为:
Coordinator负责建立网络和分派短地址。按下EndDeviceA的按钮SWO发
送广播请求绑定信息,LED0闪烁,收到该信息的EndDeviceB的LED()闪
烁,按下其按钮SWO则返回绑定应答信息,同时LEDO处在点亮状态,EndDevice
A收到应答后LED0也处在点亮状态,表达双方绑定成功。之后按动每个EndD
evice的按钮SW2、SW3可分别切换对方相应LED亮/灭状态。假如按下
任何EndDevice的SW1则解除绑定,各EndDevice的LEDO灭,且LED1
闪烁3秒。
2,分别为Coordinator和EndDevice设il-一1个程序,其功能为:Coordina
tor负责建立网络和分派短地址及绑定的媒介。按动EndDevice按钮SWO,
向Coordinator发送绑定请求信息,LEDO闪烁10秒,Coordinator收到该
信息后记录其短地址并定期10秒,按动此外一个EndDevice的按钮SWO向C
Coordinator收到该应答信号,则记录其短地址,分别将记录的两个短地址发送给
两个相应EndDevice,两个EndDevice收到短地址后分别点亮LED0(不
再闪烁),若在规定期间内没有建立绑定关系,超时后灭LEDOo假如按下任何
EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。绑
定状态下按动每个EndDevice的按钮SW2、SW3可分别切换对方相应LED
亮/灭状态。
1.通过对方的MAC地址获得它的16位短地址
在基于JennicZigBee协议栈中,每个设备必须知道对方的16位短地址,才
干进行直接通信,而16位短地址是在EndDevice或Router加入网络时由Coor
dinator动态分派的。假如一个设备(请求者)知道另一个设备的MAC地址时,
则请求者可通过调用zdpNwkAddrReq()函数广播查寻与该MAC地址相
匹配的结点,当匹配的结点收到该数据包则返回自己的短地址给请求者,请求者即
可用该短地址与其进行通信。
2.通过广播请求对方绑定获得它的16位短地址
在使用2££^口212口6口起51()函数发送数据包时,将16位的目的地址设立
为0Xffff,即可以广播的形式将数据包发送出去。一个设备(请求者)想获取另一个
设备的16位短地址的方法是:发送一个广播请求绑定指令数据包,符合条件的结
点(如判断指令包内容,按下按钮等)发送应答包(含自己的短地址)给请求者,
请求者即可用该短地址与其进行通信。
3.通过发送请求/应答绑定信息给Coordinator获得对方的16位短地址
按动EndDevice或Router按钮,调用afdeDataRequest()函数向
Coordinator发送绑定请求信息,Coordinatoi收到该信息后记录其短地址并
定期,按动此外一个结点的按钮使用afdeDataRequest()函数向Coordinato
录其短地址,分别将记录的两个段地址发送给两个相应结点,两个结点收到短地
址后便可以互相直接通信。
4.高功率模式
M02与M04高功率模块使用时,需要进行高功率配置,一般在初始化阶段设
立。高功率模块配置函数原型为:
VoidvAHI_HighPowerModuleEnable(bool_tbRFTXEn,
Bool_tbRFRXEn);
5.网络地址请求函数zdpNwkAddrReq()
在Coordinator与EndDevice实现的点对点实验介绍了Coordina
tor获取16位短地址的方法,而对于EndDevice和Router,当一个结点知道
另一个结点的MAC地址后,则可以通过网络地址请求函数zdpNwkAddrR
eq()以广播的方式发送数据包,查找与该MAC地址相匹配的结点在网络中的
短地址。协议栈可通过调用JZA_vZdpResponse(涵数解决响应消息。
6.网络地址请求响应函数JZA_vZdpResponse()
JZA_vZdpResponse()是一个协议栈调用应用程序的函数,当一个结点通
过zdpNwkAddrReq()发送查找另一个结点的短地址后,匹配的结点发送的
应答消息可通过请求者的协议栈调用JZA_vZdpResponse()解决。
1.分别为Coordinator和EndDevice设id-一个程序,其功能为:Coor
dinator负责建立网络和分派短地址。按下EndDeviceA的按钮SWO发送
广播请求绑定信息,LED0闪烁,收到该信息的EndDeviceB的LEDO闪烁,
按下其按钮SWO则返回绑定应答信息,同时LEDO处在点亮状态,EndDevice
A收到应答后LEDO也处在点亮状态,表达双方绑定成功。之后按动每个EndDevi
ce的按钮SW2、SW3可分别切换对方相应LED亮/灭状态。假如按下任何
EndDevice的SW1则解除绑定,各EndDevice的LEDO灭,且LED1闪烁3秒。
Coordinator:Coordinator负责建立网络和分派短地址,程序一方面执
行AppCoklStart()函数,设立信道号和PANID,然后调用vInit0函数,初
始化系统、按键、LED灯和协议栈,并且启动BOS定期时钟;其后判断网络是
否启动成功,若启动成功,则硬件上的标志位LEDO灭。主程序流程图如下图所
示:
Coordinator主程序流程图:
EnddeviceA:程序一方面执行AppColdStart()函数,设立信道号和P
ANID,然后调用vlnit()函数,初始化系统、按键、LED灯和协议栈,并且启动
BOS定期时钟淇后判断网络是否加入成功,若加入成功,则硬件上的标志位LEDO
灭。判断是否按下SW0键,若有按下,则调用vSendData()函数发送广播请求
绑定信息;判断是否收到应答信息,若收至(则调用vLedControl(LTRUE)控制
LEDO处在点亮状态,表达双方绑定成功,并且获取对方短地址,此时可以与E
nddeviceB进行通信;然后就开始读取按键值,若有按键按下,则调用按键解决
函数进行按键解决;同时若收到目的地址的MSG信息,则执行相应控制指令。主
程序流程图如下图所示:
EnddeviceA主程序流程图:
EnddeviceB:程序一方面执行AppColdStart()函数,设立信道号和P
BOS定期时钟;其后判断网络是否加入网络成功,若加入成功,则硬件上的标志
位LEDO灭。判断若接受到广播请求绑定信息,则获取对方短地址,且Enddev
iceB的LEDO闪烁,若按下其SW0,则返回绑定应答信息,同时调用vLedContr
01(1,TRUE)控制LEDO处在点亮状态,并且调用vSendData(0)函数发送应答信
息,此时与EnddeviceA建立通信;若有按键按下,则读取按键的值,若读取成功
则调用按键解决函数进行按键解决;同时若收到目的地址的MSG信息,则执行相
应控制指令。主程序流程图如下图所示:
EnddeviceB主程序流程图:
1.给电路板上电后,Coordinator负责建立网络和分派短地址,且三方
的网络建立成功。然后按下EndDeviceA的SW0向EndDeviceB发送广播请
求绑定信息,此时EndDeviceA的LEDO不断地闪烁,收到该信息的E
ndDeviceB的LED0也闪烁,在程序中我定义了他们两方是一直闪烁的。当按
下EndDeviceB的SWQ按钮则返回绑定应答信息,此时EndDeviceB通过其
中的JZA_bAfMsgObject函数将EndDeviceA的地址记录下来,作为目
的地址,同时LEDO处在点亮状态。与此同时EndDeviceA收到应答后也同样
将EndDeviceB的地址作为目的地址,同时LEDO也处在点亮状态,表达双方绑定
成功。之后按动每个EndDevice的按钮SW2、SW3可分别切换对方相应LE
D亮/灭状态。假如按下任何EndDevice的SWL此时的目的地址都为0,解除绑
定,且LED1闪烁3秒,实验现象符合规定。
1.在本次实验中,当EndDeviceA发送信息后LEDO我设立了长闪,但
会出现永远闪烁的情况,即跳不出闪烁的循环子程序,针对这一问题,我写了两个
闪烁程序,同时设立了一个标志位,使得n=l的时候才执行闪烁程序,问题得以解
决。
实验五DIO中断实验
1.分别为Coordinator和EndDevice设il个程序,运用DIO中断的方式分
别用按键控制切换对方相应LED亮/灭状态。如Coordinator的SW3控制EndDe
vice的LED3,EndDevice的SWO控制Coordinator的LED0等等。
2.分别为Coordinator和EndDevice设■■一个程序,运用DIO中断的方式
分别用DI04、DIO5、DIO6、DI07切换对方相应LED亮/灭状态。如Coor
dinator的DIO4控制EndDevice的LED0,EndDevice的D105控制Coo
rdinator的LEDl等等。
1.vAHI_DioSetDirection()函数
该函数用来设立DI。引脚的方向(输入或输出),其函数原型和使用方法参见
讲义2。当某个DIO作为外部终端源时,则意味着该DIO引脚设立为输入。假如一
个DIO引脚已安排给另一个外设且该外设已启用,则该函数对该DIO引脚不产
生影响。
2.vAHI_DioInterruptEdge()函数
当某个DIO作为输入引脚时,则用该函数设立中断产生时是采用上升沿还是
下降沿触发。该函数的原型如下:
voidvAHI_DIOInterruptEdge(uint32u32Rising,uint32u32Fa
1ling);
各参数的具体含义描述如下:
u32Rising:32位位掩码,其位0至位20相应于每一个DIO引脚。当某一位
为1时,则意味着该位相应的引脚在输入信号的上升沿触发中断。u32Rising
的位21至位31无定义,可设立为1或0。u32FaHing:32位位掩码,其位0至位20
相应于每一个DIO引脚。当某一位为1,则意味着该位相应的引脚在输入信号的下
降沿触发中断。u32Rising的位21至位31无定义,可设立为1或0。该函数仅将
u32Rising中为1的位相应的引脚设立为上升沿触发中断,u32FaIIing中
为1的位相应的引脚设立为下降沿触发中断,没有涉及到的引脚保持它本来的状
态。假如某一个引脚在u32Rising和u32Falling中都进行了设立,则默认为
上升沿触发。该函数仅对设立为输入的DIO引脚有效。假如一个DIO引脚已安排
给另一个外设且该外设已启用,则该函数对该DIO引脚不产生影响。例如:
vAHI_DioSetDirection(0xOOO000FF,0x00000000);
vAHI_DioInterruptEdge(0x0000000F,0x00000077);
函数vAHI_DioSetDirection设立DIO0、DIO1...........DIO7等8个引脚
方向为输入,函数vAHI_DIOInterruptEdge设立DI00、DIOKDI02和D
I03等4个引脚为上升沿触发中断,DI04、DIO5和DI06等3个引脚为下降沿
触发中断,DIO7引脚保持原状态。
3.vAHI_DioInterruptEnable()函数
当某个DIO作为输入引脚时,则该函数用来设立接受或屏蔽该引脚发来的中
断,及使能/屏蔽中断。该函数的原型如下:
voidvAHI_DIOInterruptEnab1e(uint32u32Enable,uint32u32D
isable);
u32Enab1e:32位位掩码,它的位0至位20相应于每一个DIO引脚。当某一
位为1时,则使能该位相应的引脚发来的中断。u32Enable的位21至位31无定义。
u32Disable:32位位掩码,它的位0至位2()相应于每一个DIO引脚。当某一
位为1时,则屏蔽该位相应的引脚发来的中断。u32Disable的位21至位31无定
义。
该函数仅使能u32Enable中为1的位相应的引脚中断,屏蔽u32Disable中
为1的位相应的引脚中断,没有涉及到的引脚保持它本来的状态。假如某一个引