任务二 无线开关LED灯.

Slides:



Advertisements
Similar presentations
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Advertisements

NAT与ICMP交互.
计算机网络课程总结 一、计算机网络基础 计算机网络定义和功能、基本组成 OSI/RM参考模型(各层的功能,相关概念, 模型中数据传输 等)
在全旗经济工作会议上的讲话 尚志强 (2016年1月22日).
淄博信息工程学校 ZIBOIT&ENGINEERING VOCATONAL SHCOOL 03 交换机干道技术 计算机网络技术专业.
实验八 配置动态路由-OSPF协议.
项目四 组建跨地区网络 授课教师:肖颖.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
J2EE与中间件技术 ——Lab.
第二讲 搭建Java Web开发环境 主讲人:孙娜
任务八 温湿度传感器模块.
大学计算机基础 典型案例之一 构建FPT服务器.
SVN服务器的搭建(Windows) 柳峰
ARDUINO+BLUETOOTH Arduino实现蓝牙数据传输.
辅导课程六.
临界区软件互斥软件实现算法.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月20日.
SPI驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
任务十 基于Z-Stack的点对点通信.
按键驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
任务九 基于BasicRF的无线传感网络应用
利用Arduino制作定向装置 核科学与技术系 崔伟毅 梁嘉祺
S 数控机床故障诊断与维修.
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
如何生成设备节点 广州创龙电子科技有限公司
任务十三 基于Z-Stack的串口透传.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
Web安全基础教程
K60入门课程 02 首都师范大学物理系 王甜.
第四章 团队音乐会序幕: 团队协作平台的快速创建
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
主要内容: 无线局域网的定义 无线传输介质 无线传输的技术 WLAN的架构 无线网络搭建与配置 无线网络加密配置
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
实验七 安全FTP服务器实验 2019/4/28.
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
信号量(Semaphore).
任务三 无线串口通信.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
iSIGHT 基本培训 使用 Excel的栅栏问题
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
谢聪.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
3.8 局域网应用实例 某省劳动和社会保障网络中心组网实例 会议中心的无线组网实例.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
实验六静态路由.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
工业机器人入门使用教程 ESTUN机器人 主讲人:李老师
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
DSP技术与应用 电子与信息技术系.
学习目标 1、什么是列类型 2、列类型之数值类型.
JUDDI安装手册.
百万行、千万行数据查询教程 老黄牛.
Presentation transcript:

任务二 无线开关LED灯

目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤

实训目的 通过本实训,使学生了解BasicRF Layer工作机制;熟悉无线发送和接收函数;理解发送地址和接收地址、PAN_ID、RF_CHANNEL等概念;学会使用CC2530建立点对点的无线通信方法。

目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤

实训内容 以Basic RF无线点对点传输协议为基础,采用两块ZigBee模块作为无线发射模块和无线接收模块,按发射模块上的SW1键,可以控制接收模块上的LED1灯的亮和灭,实现无线开关LED灯的功能。

目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤

实训原理 TI公司提供了基于CC253x芯片的Basic RF软件代码,虽然该代码还没有用到Z-Stack协议栈,但是其包含了IEEE 802.15.4标准数据包的发送和接收,是简单无线点对点的传输协议,采用了与IEEE 802.15.4 MAC兼容的数据包结构及ACK包结构。其功能限制如下: ◇ 不提供“多跳”、“设备扫描”功能。 ◇ 不提供不同种的网络设备,如协调器、路由器等。所有节点设备同一级,只能实现点对点数据传输。 ◇ 传输时会等待信道空闲,但不按IEEE 802.15.4 CSMA-CA要求进行两次CCA检测。

实训原理 ◇ 不重传输数据。 简言之,Basic RF是简单无线点对点传输协议,可用来进行Z-Stack协议栈无线设备数据传输的入门学习。力求由浅入深,使大家逐步掌握无线点对点通讯的整体过程。并能在Basic RF软件代码的基础上,进行点对点的相对简单的无线传感控制网络应用开发。 2. 2 Basic RF软件结构 Basic RF软件结构包括硬件层(Hardware layer)、硬件抽象层(Hardware Abstraction layer)、基本无线传输层(Basic RF layer)和应用层(Application),如图2.1所示。

图2.1 Basic RF软件结构

◇ 硬件层是实现数据传输的基础,肯定要放在最底层。 ◇ 硬件抽象层包含访问无线接收功能,以及开发板上的TIMER、GPIO、UART、ADC、LCD、buttons等外设功能。 ◇ 基本无线传输层提供一种简单双向无线通信协议。 ◇ 应用层是用户编写代码的地方,可调用封装好的Basic RF 和 HAL 的函数,实现不同的应用。 CC2530 BasicRF文件结构如图2.2所示,

图2.2 CC2530 BasicRF文件结构

Basic RF操作包括启动、发送、接收三个环节。 1.启动 启动过程包括:初始化开发板的硬件外设和配置I/O端口,设置无线通讯的网络ID、信道、接收和发送模块地址、安全加密等参数。 (1)创建basicRfCfg_t数据结构。在basic_rf.h文件上可以找到basicRfCfg_t数据结构的定义。 typedef struct { uint16 myAddr; //本机地址,取值范围0x0000 ~ 0xffff,作为识别本模块的地址 uint16 panId; //网络ID,取值范围0x0000 ~ 0xffff,要建立通讯此参数必须一致 uint8 channel; //通信信道,取值范围11~26,要建立通讯此参数必须一致

uint8 ackRequest; //应答信号 #ifdef SECURITY_CCM //是否加密,预定义时取消了加密 uint8* securityKey; uint8* securityNonce; #endif } basicRfCfg_t; 注意:首先要确定两个通讯模块的网络ID和通信信道要一致,其次设置各模块的识别地址,即模块的地址或编号。

(2)为basicRfCfg_t型结构体变量basicRfConfig填充部分参数。在void main(void)函数中有如下3行代码,就是为basicRfConfig数据结构部分变量赋值的。 basicRfConfig.panId = PAN_ID; //宏定义:#define PAN_ID 0x2007 basicRfConfig.channel = RF_CHANNEL; //宏定义:#define RF_CHANNEL 25 basicRfConfig.ackRequest = TRUE; //宏定义:#define TRUE1 (3)调用halBoardInit()函数,对硬件外设和I/O端口进行初始化,void halBoardInit(void)函数在hal_board.c文件中。

(4)调用halRfInit()函数,打开射频模块,设置默认配置选项,允许自动确认和允许随机数产生。 2.发送 创建一个buffer,把数据放入其中,调用basicRfSendPacket()函数发送数据。在该工程中,light_switch.c文件中的appSwitch()函数是用来发送数据的,appSwitch()函数代码如下,请注意删除了液晶显示代码。

static void appSwitch() { pTxData[0] = LIGHT_TOGGLE_CMD; //发送的数据放到buffer中(即数组pTxData) basicRfConfig.myAddr = SWITCH_ADDR; //本机地址 if(basicRfInit(&basicRfConfig)==FAILED) { //初始化 HAL_ASSERT(FALSE); } basicRfReceiveOff(); //关闭接收模式,节能 while (TRUE) { if(halButtonPushed()==HAL_BUTTON_1) { //调用按键函数

basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH); halIntOff(); //关中断 halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global halIntOn(); //开中断 }

(1)第2行,把要发送的数据LIGHT_TOGGLE_CMD(宏定义该值为1)放到buffer中,数组pTxData就是发送的buffer,即把要发送的数据存放到该数组中。 (2)第3行,为basicRfCfg_t型结构体变量basicRfConfig.myAddr赋值,宏定义SWITCH_ADDR为0x2520,即发射模块的本机地址。 (3)第4行,调用basicRfInit(&basicRfConfig)初始化函数,负责调用halRfInit(),配置参数,设置中断等。在 basic_rf.c 代码中可以找到uint8 basicRfInit(basicRfCfg_t* pRfConfig)。

(4)第10行,调用发送函数basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH),该函数的形参数格式是:basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)。 ① destAddr是发送的目标地址,实参是LIGHT_ADDR,即接收模块的地址。 ② pPayload是指向发送缓冲区的地址,实参是pTxData,该地址的内容是将要发送的数据。 ③ length是发送数据长度,实参是APP_PAYLOAD_LENGTH,单位是字节数。

3.接收 通过调用basicRfPacketIsReady()函数来检查是否收到一个新的数据包,若有新数据,则调用basicRfReceive()函数,把数据接收到。在该工程中,light_switch.c文件中的appLight()函数是用来发送数据的,appLight()函数代码如下,请注意删除了液晶显示代码。 static void appLight() { basicRfConfig.myAddr = LIGHT_ADDR; //设定本模块地址 if(basicRfInit(&basicRfConfig)==FAILED) { //初始化,方法与发送一样 HAL_ASSERT(FALSE); }

basicRfReceiveOn(); //开启接收功能 while (TRUE) { while(!basicRfPacketIsReady()); //检查是否有新数据,没有则一直等待 if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) { if(pRxData[0] == LIGHT_TOGGLE_CMD) { //判断接收的内容是否正确 halLedToggle(1); //改变LED1的亮灭状态 }

(1)第8行,调用basicRfPacketIsReady()函数来检查是否收到一个新数据包,若有新数据,则返回TRUE。新数据包信息存放在basicRfRxInfo_t型结构体变量rxi中。 typedef struct { uint8 seqNumber; uint16 srcAddr; //数据来源的地址,即发送模块的地址 uint16 srcPanId; //网络ID int8 length; //新数据长度 uint8* pPayload; //新数据包存放地址 uint8 ackRequest; int8 rssi; //信号强度 volatile uint8 isReady; //检查到新数据包的标志 uint8 status; } basicRfRxInfo_t;

(2)第9行,调用basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)函数,把收到的数据复制到buffer中,即pRxData,注意与发送数据buffer的pTxData区别。 uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi) { halIntOff(); //关闭中断 memcpy(pRxData, rxi.pPayload, min(rxi.length, len)); //从rxi.pPayload中复制数据到pRxData if(pRssi != NULL) { if(rxi.rssi < 128){ *pRssi = rxi.rssi - halRfGetRssiOffset(); } else{ *pRssi = (rxi.rssi - 256) - halRfGetRssiOffset();

} rxi.isReady = FALSE; //取消新数据包标志 halIntOn(); //开中断 return min(rxi.length, len); //返回接收的字节数(最少的) } 从上述代码可知:接收到新数据被复制到pRxData中。 说明:RSSI 一般是用来说明无线信号强度的。英文是 Received signal strength indication, 它与模块的发送功率以及天线的增益有关。 (3)第10行,判断接收的内容是否与发送的数据一致。若正确,则改变LED1灯的亮、灭状态。

目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤

实训步骤 第一步,打开IT官网的工程 图2.3 light_switch.eww工程界面

实训步骤 登录TI官网,下载CC2530 BasicRF.rar,解压后双击“\CC2530 BasicRF\CC2530 BasicRF\ide\srf05_cc2530\iar”文件夹中的“light_switch.eww”工程文件,如图2.3所示。 ZigBee模块(网关节点)上有2个按键和4个LED,其中按键SW1和SW2分别由P1.2和P1.6控制,LED1~LED4分别由P1.0、P1.1、P1.3和P1.4控制,如图2.4所示。这些接口与TI官网发布的开发平台有所差别,所以需要修改一下。操作方法如下:

实训步骤 图2.4 LED与P1引脚连接图 1.打开“hal_board.h”头文件,打开方法有两种。 (1)展开左边Workspace栏中的“light_switch.c”的“+”号,就可以在展开文件列表中找到“hal_board.h”头文件,双击该文件,就可以打开它。

2.在“hal_board.h”头文件找到如下代码,并按照如下要求修改它,如图2.5所示。 (2)在“light_switch.c”文件的开始部分代码中,可以找到“include <hal_board.h>”宏定义,右击该宏定义并选中【Open“hal_board.h”】命令,立刻打开该文件。

其中,HAL_BOARD_IO_LED_x_PORT表示:x端口(x可以是0、1、2);HAL_BOARD_IO_LED_y_PIN表示:x 其中,HAL_BOARD_IO_LED_x_PORT表示:x端口(x可以是0、1、2);HAL_BOARD_IO_LED_y_PIN表示:x.y引脚(x端口的第y个引脚,y可以是0~7)。 3.修改“light_switch.c”文件中的“static void appSwitch()”函数代码。把该函数中的“if( halJoystickPushed() ){”行代码注释掉,在其下一行添加“if(halButtonPushed()==HAL_BUTTON_1){”代码。 4.注释掉如图2.6所示的有影响代码。

图2.6 注释代码

第二步,下载程序 给发射和接收模块下载程序。 (1)在“light_switch.c”的主函数中找到“uint8 appMode = NONE;”代码,并把它注释掉,在其下一行添加“uint8 appMode = SWITCH;”代码。编译程序,无误后下载到发射模块中。 (2)在“light_switch.c”的主函数中找到 “uint8 appMode = SWITCH;”代码,将其修改为:“uint8 appMode = LIGHT;”。编译程序,无误后下载到接收模块中。

第三步,测试程序功能 每按一下发射模块中的SW1键,接收模块上的LED1灯的状态就会改变,即LED1灯亮和灭交替变化。把两个模块隔开20m以上的距离,进行测试。

谢谢!