Download presentation
Presentation is loading. Please wait.
1
任务二 无线开关LED灯
2
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
3
实训目的 通过本实训,使学生了解BasicRF Layer工作机制;熟悉无线发送和接收函数;理解发送地址和接收地址、PAN_ID、RF_CHANNEL等概念;学会使用CC2530建立点对点的无线通信方法。
4
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
5
实训内容 以Basic RF无线点对点传输协议为基础,采用两块ZigBee模块作为无线发射模块和无线接收模块,按发射模块上的SW1键,可以控制接收模块上的LED1灯的亮和灭,实现无线开关LED灯的功能。
6
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
7
实训原理 TI公司提供了基于CC253x芯片的Basic RF软件代码,虽然该代码还没有用到Z-Stack协议栈,但是其包含了IEEE 标准数据包的发送和接收,是简单无线点对点的传输协议,采用了与IEEE MAC兼容的数据包结构及ACK包结构。其功能限制如下: ◇ 不提供“多跳”、“设备扫描”功能。 ◇ 不提供不同种的网络设备,如协调器、路由器等。所有节点设备同一级,只能实现点对点数据传输。 ◇ 传输时会等待信道空闲,但不按IEEE CSMA-CA要求进行两次CCA检测。
8
实训原理 ◇ 不重传输数据。 简言之,Basic RF是简单无线点对点传输协议,可用来进行Z-Stack协议栈无线设备数据传输的入门学习。力求由浅入深,使大家逐步掌握无线点对点通讯的整体过程。并能在Basic RF软件代码的基础上,进行点对点的相对简单的无线传感控制网络应用开发。 2. 2 Basic RF软件结构 Basic RF软件结构包括硬件层(Hardware layer)、硬件抽象层(Hardware Abstraction layer)、基本无线传输层(Basic RF layer)和应用层(Application),如图2.1所示。
9
图2.1 Basic RF软件结构
10
◇ 硬件层是实现数据传输的基础,肯定要放在最底层。
◇ 硬件抽象层包含访问无线接收功能,以及开发板上的TIMER、GPIO、UART、ADC、LCD、buttons等外设功能。 ◇ 基本无线传输层提供一种简单双向无线通信协议。 ◇ 应用层是用户编写代码的地方,可调用封装好的Basic RF 和 HAL 的函数,实现不同的应用。 CC2530 BasicRF文件结构如图2.2所示,
11
图2.2 CC2530 BasicRF文件结构
12
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,要建立通讯此参数必须一致
13
uint8 ackRequest; //应答信号
#ifdef SECURITY_CCM //是否加密,预定义时取消了加密 uint8* securityKey; uint8* securityNonce; #endif } basicRfCfg_t; 注意:首先要确定两个通讯模块的网络ID和通信信道要一致,其次设置各模块的识别地址,即模块的地址或编号。
14
(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文件中。
15
(4)调用halRfInit()函数,打开射频模块,设置默认配置选项,允许自动确认和允许随机数产生。
2.发送 创建一个buffer,把数据放入其中,调用basicRfSendPacket()函数发送数据。在该工程中,light_switch.c文件中的appSwitch()函数是用来发送数据的,appSwitch()函数代码如下,请注意删除了液晶显示代码。
16
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) { //调用按键函数
17
basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);
halIntOff(); //关中断 halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global halIntOn(); //开中断 }
18
(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)。
19
(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,单位是字节数。
20
3.接收 通过调用basicRfPacketIsReady()函数来检查是否收到一个新的数据包,若有新数据,则调用basicRfReceive()函数,把数据接收到。在该工程中,light_switch.c文件中的appLight()函数是用来发送数据的,appLight()函数代码如下,请注意删除了液晶显示代码。 static void appLight() { basicRfConfig.myAddr = LIGHT_ADDR; //设定本模块地址 if(basicRfInit(&basicRfConfig)==FAILED) { //初始化,方法与发送一样 HAL_ASSERT(FALSE); }
21
basicRfReceiveOn(); //开启接收功能
while (TRUE) { while(!basicRfPacketIsReady()); //检查是否有新数据,没有则一直等待 if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) { if(pRxData[0] == LIGHT_TOGGLE_CMD) { //判断接收的内容是否正确 halLedToggle(1); //改变LED1的亮灭状态 }
22
(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;
23
(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();
24
} rxi.isReady = FALSE; //取消新数据包标志 halIntOn(); //开中断 return min(rxi.length, len); //返回接收的字节数(最少的) } 从上述代码可知:接收到新数据被复制到pRxData中。 说明:RSSI 一般是用来说明无线信号强度的。英文是 Received signal strength indication, 它与模块的发送功率以及天线的增益有关。 (3)第10行,判断接收的内容是否与发送的数据一致。若正确,则改变LED1灯的亮、灭状态。
25
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
26
实训步骤 第一步,打开IT官网的工程 图2.3 light_switch.eww工程界面
27
实训步骤 登录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官网发布的开发平台有所差别,所以需要修改一下。操作方法如下:
28
实训步骤 图2.4 LED与P1引脚连接图 1.打开“hal_board.h”头文件,打开方法有两种。
(1)展开左边Workspace栏中的“light_switch.c”的“+”号,就可以在展开文件列表中找到“hal_board.h”头文件,双击该文件,就可以打开它。
29
2.在“hal_board.h”头文件找到如下代码,并按照如下要求修改它,如图2.5所示。
(2)在“light_switch.c”文件的开始部分代码中,可以找到“include <hal_board.h>”宏定义,右击该宏定义并选中【Open“hal_board.h”】命令,立刻打开该文件。
31
其中,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所示的有影响代码。
32
图2.6 注释代码
33
第二步,下载程序 给发射和接收模块下载程序。 (1)在“light_switch.c”的主函数中找到“uint8 appMode = NONE;”代码,并把它注释掉,在其下一行添加“uint8 appMode = SWITCH;”代码。编译程序,无误后下载到发射模块中。 (2)在“light_switch.c”的主函数中找到 “uint8 appMode = SWITCH;”代码,将其修改为:“uint8 appMode = LIGHT;”。编译程序,无误后下载到接收模块中。
34
第三步,测试程序功能 每按一下发射模块中的SW1键,接收模块上的LED1灯的状态就会改变,即LED1灯亮和灭交替变化。把两个模块隔开20m以上的距离,进行测试。
35
谢谢!
Similar presentations