ZigBee学习电子笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一讲
第二讲
2530通用I/O口有21个:P0/P1/口个8个;P2口5个,其中,P1_0、P_1
有20mA的驱动能力,其余只有4mA
2.IO口配置相关的寄存器(3个)
PxSEL: P0SEL、P1SEL、P2SEL,每个寄存器是1byte,分别用来设定3个口的工作模式。
IO的两种工作模式:
1.普通IO口模式:点灯、监测按键输入
2.片上外设模式:作为串口或者其他非普通IO口
PxDIR:P0DIR/P1DIR/P2DIR,每个寄存器占一个字节,用来设定IO口作为输入还是输出
PxINP:P0INP/P1INP/P2INP:
输入情况下,注意P2INP寄存器后3位的用法(见下图):
输出示例(以P0_0为例):
1)设置P0_0为普通IO口工作模式,非片上外设:P0SEL=0xFE(&11111110) 2)让P0_0作为输出用,非输入监测用:P0DIR=0x01(+ 00000001)
3)输出(如P0_0=0或P0_0=1等)。
输入示例(让P1_2作为输入):
1)设置P1_2为普通IO口工作模式,非片上外设:P1SEL=0xfd(11111011)
2)让P1_2作为输入检测用,非输出用P1DIR=0xfd(11111011)
3)选择上拉、下拉或三态中的一种输入(因为上电的时候寄存器默认为0,所以IO口都默认工作在普通IO口输入、上下拉模式)
4)检测用:
If (P1_2= =0 or 1)
{
}
Else
{
}
总结:由此可见,当芯片上电初始化后,3组IO口默认工作在普通IO口下的输入监测、上拉输入模式。
自己编程示例:
第三讲:外部中断检测
中断有3级开关:
CPU中断总开关------IO口组中断开关---------IO组内某口中断开关中断信号触发类型选择:上升、下降
因此,某IO口产生中断需配置:
1)CPU中断开关打开;
EA=1;
2)该口所在的IO组中断打开;
P0组的中断开关在IEN1的第5位;
P1组的中断开关在IEN2的第4位;
P2组的中断开关在IEN2的第1位;
3)该口中断打开;
P0IEN;8位寄存器。
例如要把P0_2脚的中断开关打开,就要把该寄存器的第2位在程序中置1
P1IEN
P2IEN
4)配置中断信号的触发方式
PICTL寄存器(8位)
中断函数:
编程示例:
#pragma vector=P0INT_VECTOR
__Interrupt void zd()
{
…...
P0IFG=0;//为避免死循环需要先清零,该寄存器有8位,分别为P0组8个脚的标志位,若某个脚产生中断,则该位置1,故出中断函数时要清零。
P0IF=0;//CPU中断标志清零
}
第四讲:时钟的切换和控制串口时钟:
cc2530片内有4个时钟源,芯片工作时必须使用一高一低频进行搭配,使用两个寄存器进行对其配置以及当前状态标志。
配置时钟源:
CLKCONCMD命令寄存器:8位寄存器
D6位用于高频时钟的选择;
D7位用于低频时钟的选择;
0表示外部,1表示内部?(视频里)
芯片进行无线通信时必须将时钟切换到32MHz的石英晶振上
CLKCONSTA除了时钟状态标志外还有时钟分频功能
参考代码如下:
串口
串口0有两组备用位置:备用位置1为P0_2和P0_3;
备用位置2为P1_4和P1_5。
到底选择哪组由PERCFG寄存器的第0位配置,0表示备用1,1表示备用2.
串口编程示例(部分):
第五讲:DIY无线通信模块
射频通信
注意:
1)数据不能直接被发送出去,必须调制到高频载波上发送以提高通信效率,接收设备再解调恢复原始数据。
IEEE802.15.4 ISM信道:2.4GHz频段/915GHz频段/896GHz频段
实验中ZigBee大约工作在2.4GHz频段(16个信道)
2)什么是信道?
2405M 11号信道
2410M 12号信道
2415M 13号信道
…..
2480M 26号信道
信道一致的两个收发模块才能进行收发!
3) 网络地址(网络短地址)、PANID(个域网ID)
网络短地址:
类似于计算机以太网的局域网,每台计算机都有唯一的一个IP地址。
在ZigBee网络中,每一个通信模块都有一个通信地址,即网络短地址;
网络短地址为2个字节。
PANID:
为了区分不同的ZigBee网络为每个ZigBee网络标示的ID,2个字节。
4)每一个CC2530芯片上都有一块RAM存放发送和接收数据,缓冲区。
都是128byte。
模块通信编程示例(以视频中板子为例)
下图是主程序(主函数):
#define SHORT_ADDR0 XREG( 0x6174 )
#define SHORT_ADDR1 XREG( 0x6175 )//宏映射到CC2530的RAM上,
操作宏就是操作对应地址上的RAM。
发送模块的主函数里做了哪些工作:
1)板子上需要用到的资源初始化;
2)设置本模块的网络短地址;
3)等待按钮中断。
4)发生按钮中断时,在按钮中断里调用void RFSend(char*pstr,char len);函数把数据发送出去
射频发送函数的定义如下:
以上为数据发送做准备
注意:RFST是数据发送寄存器
射频接收函数定义如下:
数码管配置程序:
板子上其他硬件资源配置程序(均已模块化):
实验中,使用key3按键控制另一模块的LED灯,该按键的中断程序如下图:
其中涉及到该板子系统自定义的宏(如ON_LED0),参考如下:
总结:ZigBee既需要软件上(协议栈)的支持,也需要硬件上支持协议就是基于某硬件上数据进行传输的格式
第六讲:协议栈之操作系统抽象层OSAL
1、操作系统是什么?能干什么事?为什么要在Zigbee里面引入操作系统他和Zigbee是什么关系?
Main()
{
While()
{
A;
B;//新加入B段代码后会对A段代码产生影响。
Delay();//浪费CPU的资源。
及时使用定时器也会使得代码繁琐}
}
//为了提高代码执行效率、便于管理代码、提高软硬件资源的利用率、提高整个程序效率,便引入了操作系统。
协议栈就是按照一定格式对数据进行打包、拆包以及一些其他功能的程序。
协议栈里面有一个类似操作系统的东西(OSAL)
传统程序:
Main()
{
While()
{
A;//采集数据
B;//处理数据
C;//报警、打印
}
}
引入操作系统后:
A;//采集数据-------模块化一个任务(功能、函数)1(ID)
B;//处理数据
C;//报警、打印
任务的定义:在操作系统中实现某种功能的一块代码
任务由一个全局变量来标识ID:任务ID char
任务通信:使用全局变量来标记任务执行状态、交流信息
如Char a=0来标记任务1正在执行,当为0时,主程序检测到该任务已完成,采取其他操作。
Main()
{
osal_init_system( )//初始化每一个任务
osal_start_system( )
}
每一个任务:
1)其内容由其自己的功能代码定义,代码在任务(处理)函数里,每个函数名是一个16位的地址,
2)有自己的任务ID号
3)每个任务都有一个用来通信的全局变量,为2个字节,存于16位的数组中,即
16位变量tasksEvents[任务ID],如:
tasksEvents[0]
tasksEvents[1]
操作系统初始化函数osal_start_system( )进入之后,是一个死循环:不管得检查每一个任务的通信变量是否为零如果为0,则反复检查,如果不为零,则通过该变量的下标找到其任务ID号码,在通过该ID号从tasksAst找到相应的任务函数进行处理
这就是OSAL的运作原理。
事件:按钮按下以后产生中断,中断把某个任务通信的16位变量的某一位置1(还有其他一些操作)
消息:向某一个任务发送消息就是把任务通信的16位变量的某一位置1,通信变量里面不同的位代表不同的消息
调度:调度某一个任务就是运行某一个任务
协议栈置操作系统抽象层按钮实验
代码跟踪
找到按键中断函数,half_key.c文件,里面的中断代码执行(通信变量置位等)完后发消息给主函数,检测到后进入处理函数。
怎么配置按钮中断、小灯:
OnBoard.c一些全局的函数和变量
配置在
half_key.c配置一些寄存器和宏(注释:Ctrl+K,取消shift+Ctrl+K)
OSAL 实际发消息机制
1)按钮按下进入
half_key.c
2)
操作系统的函数:
(hal_drivers.c )
OSAL 是TI 公司开发的一个类似OS 的调度软件,并不是真正的OS 第七讲:协议栈之组网通信
在无线传感器网络里,按照其网络功能将ZigBee 模块分为协调器、路由器、终端
这三者在网络中的不同点:
1) 协调器是WSN 的发起者,创建网络,路由器和终端加入该网络
2) 网络地址,加入到协调器所创建的网络里的节点(协调器、路由器、终端)都会获得一个在该网络里唯一的16位地址(2byte ),即网络地址(网络短地
址),并且,协调器的网络地址永远是0x0000,其余节点的网络短地址是不确定的
3)除了协调器之外,其他节点如要加入网络,需要待加入节点的父节点介绍引
入,注意:终端节点是不能充当父节点的,其他均可
个域网ID(PANID):区分不同ZigBee网络的网络标识ID
4)端点:每个加入到ZigBee网络里的无线模块均是一个节点,每个节点里逻辑上存在若干个端点,模块间的收发消息均需指定一个端点进行,因此节点间通信的本质是端点间的通信,端点中有若干簇,端点号可以不同,但是簇号要一致。
ZigBee网络广播通信配置流程:
<协调器>
1)接收部分
首先定义一个节点,定义一个端点描述符(结构体)
簇(数组)ID16位
填写端点描述符然后进行注册,注册完成后(端点和任务绑定),端点便可以接收消息了,外部从指定端点发来的数据都会引发对应用户任务的一个消息事件,然后调用任务处理函数,把数据取出来。
在接受处理函数里通过簇来区分
2)发送部分
首先定义一个节点,定义一个端点描述符(结构体)
簇(数组)ID16位
填写端点描述符然后进行注册,注册完成后(端点和任务绑定),端点便可以发送消息了。
因为发送的时候确定目标(宿主),所以必须要获取目标的信息,故发送方必须指定接收方的信息,如地址模式(宏),接收方接收端点
设计一个系统函数:OSAL发数据的函数:
第八讲:。