资源描述
重 庆 交 通 大 学
本科实验报告
课程名称: 交换原理与通信网技术
专 业: 通信工程
年 级: 2010级
学 号:
姓 名:
学 院: 信息科学与工程学院
指导教师: 许 登 元
职 称: 副 教 授
成 绩:
2013年6月
信息学院实验报告
实验项目名称
一、 实验目的
1、 学习使用GAINSJ开发套件硬件资源的DIO口基本配置和中断相关知识,学习使用回调函数和队列函数。
2、 学习使用GAINSJ开发套件串口的基本设置和应用
3、 学习使用GAINSJ开发套件如何基于IEEE802.15.4协议栈和Jennic集成外设API组网并通信。学习星型网络的建立和低功耗模式的设置应用,掌握使用按键对灯进行无线控制。
二、 实验原理
本综合实验涉及到三个主要部分:以下简述各部分的实验原理
两种中断:
队列函数中断处理机制:
Application Queue API只能与IEEE 802.15.4 stack一起使用,它提供了应用、协议栈及硬件驱动等基于队列的接口。该API用来处理所有来自IEEE 802.15.4 MAC子层和片上外设的中断。
回调函数中断处理机制:
回调函数由用户自己定义传递给外设API。当中断发生时,这些函数被底层软件直接调用。由于回调函数运行在中断前后,它们必须迅速返回才能不延迟程序执行时间,与之相比,队列函数有时候更加适合,因为它的中断处理不是发生在中断前后。
两种中断处理方式的不同点:
队列函数:函数u32AppQApiInit() 必须被调用,用来初始化事件队列应用接口(在源代码Interrupts1.c里所示)。
回调函数:函数u32AppApiInit() 必须被调用,不使用的参数可以设成NULL(如源代码Interrupts2.c所示)。这个调用确保中断矢量表的初始化正确,了解更多的参数设置参看802.15.4 Stack API Reference Manual (JN-RM-2002)。回调函数需要被寄存,当中断发生时调用此函数,寄存一个回调函数可以通过指向作为寄存器函数参数的中断处理函数的指针来完成,寄存中断处理函数可以在Interrupts2.c里说明:
vAHI_SysCtrlRegisterCallback(vDIOInterruptCallback);
这里指向vDIOInterruptCallback()的指针作为参数,函数vDIOInterruptCallback()负责中断处理,必须与PR_HWINT_APPCALLBACK 类型一致。也就是不能有返回值,必须有两个uint32 参数,因此vDIOInterruptCallback() 定义如下:
PRIVATE void vDIOInterruptCallback (uint32 u32Device, uint32 u32ItemBitmap);
使用masks确定中断源:一旦中断发生,中断源通过使用masks JN5121-Timers对照协议栈提供的信息来决定,如产生中断的设备ID号(u32Device)和一个消息位(u32ItemBitmap),范围值参见Integrated Peripherals API Reference Manual (JN-RM-2001)。例子Interrupts1.c 里的vProcessIncomingHwEvent()函数和Interrupts2.c里的vDIOInterruptCallback()函数都有说明。
if ( (u32Device == E_AHI_DEVICE_SYSCTRL) &&
(u32ItemBitmap & E_AHI_DIO9_INT))
上面代码判断中断是否来自DIO9,系统控制器处理由比较器,唤醒定时器和DIO产生的中断。因此,通过对比消息位与DIO9 mask来确定中断源。一旦源决定,这个中断可以被正确的处理。
初始化代码相同处:
1.引脚方向设置,DIO9与SW1连接作为输入,DIO14与LED1连接作为输出:
vAHI_DioSetDirection(E_AHI_DIO9_INT, 0);
vAHI_DioSetDirection(0, E_AHI_DIO14_INT);
2.输入和输出初始化设置,输入引脚全都上拉使能,输出引脚DIO14设为高,使得LED灯灭。
vAHI_DioSetPullup(!E_AHI_DIO14_INT, E_AHI_DIO14_INT);
vAHI_DioSetOutput(E_AHI_DIO14_INT, 0);
3.中断条件设置,即中断采用上升沿还是下降沿触发, 这里中断采用下降沿触发:
vAHI_DioInterruptEdge(0,E_AHI_DIO9_INT);
4.中断使能:
vAHI_DioInterruptEnable(E_AHI_DIO9_INT, 0);
使用GIANSJ开发套件的三个传感器板实现基于IEEE802.15.4的无线灯控应用实验原理:
实验基于1个Coordinator节点和2个End device节点组成星型网络。作为Coordinator节点的LEDs D1-D2模拟灯,作为End device 节点的SW2作为灯开关。每块End device节点的SW2按下去后,触发控制灯节点的亮和灭,如图3-20所示。
本系统没有定期请求数据发送,因此不使用定期信标。这样End device大部分时间就能处于低功耗睡眠模式。Coordinator模拟灯,需永久供电,不断倾听来自End device的数据。当End device节点开关按下后,控制其从睡眠模式唤醒并在其重新回到睡眠前发射数据包给Coordinator。Coordinator接收到数据包后,触发灯的亮灭。
在无信标使能星型网络里,Coordinator选择完PAN ID和短地址后发起网络。一旦网络发起,协调器等待设备加入,每个设备加入网络后被分配一个短地址,用来后面的通信。如果至少有一个设备加入网络,协调器可以起到灯的作用,当它等待接收到从设备发出的数据包后触发灯的亮灭。
设备在所有信道上发射信标请求,进行信道扫描以发现协调器。如果协调器运行正常,当它所在的信道接收到请求后,产生信标。协调器接收到信标后,设备与协调器结合并加入发现的网络。
三、 使用仪器、材料
硬件: PC机 一台
GAINSJ节点 5个
软件: code::blocks
Jennic Flash Programmer
四、 实验步骤
(1) 启动code blocks,在C:\Jennic\cygwin\jennic\developer路径下的“Test DioInterrupts”文件夹建立一个工程DioInterrupts1。
(2) 在新建工程中“JN51xx_15_4-main.c”文件里编辑代码或者直接将“JN51xx_15_4-main.c”文件从工程中去掉,而在工程中加入Interrupts1.c。添加消息队列处理文件AppQueueApi.c,右击Source,选择Add files,其所在目录为C:\Jennic\cygwin\Jennic\SDK\Common|Source,”,这里选择的是Release目录。
(3) 点击左上角的(Build)或(Rebuild)进行编译,无误的会有如下提示:
目标文件生成目录选为“Release”,编译工程在JN5139_Build目录的Release文件夹下生成“DioInterrupts1.bin”文件。
(4)重复上面3步,新建“DioInterrupts2.cbp”工程后编译,在Build目录的Release文件夹下生成“DioInterrupts2.bin”文件。
(5)将串口线连到节点上,打开Jennic Flash Programmer,给节点上电,下载程序DioInterrupts1.bin到开发板节点。注意:需要烧写程序时,必须在打开“Jennic Flash Programmer”后再给节点上电。
(6)关掉“Jennic Flash Programmer”软件,并重新启动节点,可以观察到节点电源灯亮,LED1和LED2暗。按下并松开SW1,对应的LED1变亮,再次按下并松开SW1,对应的LED1变灭,同样按下并松开SW2,可以看到对应的LED2的变化。
(7)重复步骤(5)、(6),下载程序DioInterrupts2.bin到开发板节点。可以用同样的方式使用按键对灯进行控制。
(1)启动code block,在C:\Jennic\cygwin\jennic\developer路径下的“uarttest”文件夹建立一个工程“uarttest.cbp”。工程类型选择15.4。
(2)删除自动生成的“JN51xx_15_4-main.c”,在“uarttest.cbp”工程中添加文件。.c文件包括AppQueueApi.c、serial.c、serialq.c、uart.c、uarttest.c,.h文件包括config.h、serial.h、serialq.h、uart.h,这些代码都可以在所给代码文件夹中的source文件夹中找到,把这些文件复制到该工程的Source文件夹中。然后选择编译完成的目标文件所在地址。添加后如下图所示:
(3)编译工程在JN5121_Build目录的Release文件夹下生成uarttest.bin文件。
(4)将串口线连到节点上,打开Jennic Flash Programmer,给节点上电,下载程序到开发板节点。注意:需要烧写程序时,必须在打开“Jennic Flash Programmer”后再给节点上电。
(5)关掉“Jennic Flash Programmer”软件,并重新启动节点,可以观察到节点电源灯常亮,SW1闪烁。打开串口调试助手,波特率选择19200,在字符串输入框里输入字符或字符串,然后发送,在接受框里可显示发送的内容。如图2-13所示:
①启动Code::Blocks软件,新建一个工程,在默认路径C:\Jennic\ctgwin\Jennic\SDK\Application 下新建一个新建一个工程:Light
添加消息队列处理文件 AppQueueApi.c ,右键点击Source——Add Files其所在目录为C:\Jennic\cygwin\Jennic\SDK\Common\Source,选择Relese模式:
接下来要编写主函数。
②编译工程,在工程Build目录的Release文件夹下生成Light.bin文件。
③将串口线连接到节点上,打开Jennic Flash Programmer软件,给节点上点,下载程序到开发板节点作为Coordinator。注意:需要烧写程序时,必须在打开Jennic Flash Programmer软件后再给节点上电。
④重复上述步骤,下载程序LightSwinch.bin文件到另外两个开发板节点作为End device。
⑤关掉Jennic Flash Programmer软件,先给Coordinator节点上点,再给End device节点上电,开启后Coordinator的LED1和电源灯同时亮,等待几秒,网络建立起来后LED2也亮。按下End device的SW2,Coordinator的LED1和LED2同时亮或灭。
五、实验过程原始记录
六、 讲义思考题解答
1, 如何使节点上电时LED1和LED2都是亮的?
1. 如何改变ticktimer定时时间?
1.如何实现多个灯开关对灯的控制?
七、实验结果及分析
展开阅读全文