Zigbee学习笔记二:无线点灯实验

      CC2530是比较常用的一款Zigbee芯片,TI也提供了丰富的开发资料,CC2530除了用Zigbee协议栈组网通信外,还提供了一个直接通信的方式,这种方式仅是让芯片发送符合IEEE 802.15.4 标准的数据包,不需要协议栈。

      TI提供了软件参考:CC2530 Software Examples,可以在官网上下载。软件主要分以下几个层次

Hardware layer

放在最底,肯定是你实现数据传输的基础。

Hardware Abstraction layer

它提供了一种接口来访问TIMER,GPIO,UART,ADC等。这些接口都通过相应的函数进行实现。

Basic RF layer

为双向无线传输提供一种简单的协议

Application layer

是用户应用层,它相当于用户使用Basic RF层和HAL的接口,也就是说我们通过在Application layer就可以使用到封装好的Basic RF和HAL的函数。

各层的关系如下图:

QQ截图20181114204211.png

Basic RF layer简介:

Basic RF 由 TI 公司提供,它包含了 IEEE 802.15.4 标准的数据包的收发功能但并没有使用到协议栈,它仅仅是是让两个结点进行简单的通信,也就是说Basic RF 仅仅是包含着 IEEE 802.15.4 标准的一小部分而已。


其主要特点有:

1、不会自动加入协议、 也不会自动扫描其他节点也没有组网指示灯( LED3),直接将数据发送到目标地址。

2、没有协议栈里面所说的协调器、路由器或者终端的区分,节点的地位都是相等的,因此不支持两个以上的设备组网。

3、没有自动重发的功能。


Basic RF layer 为双向无线通信提供了一个简单的协议,通过这个协议能够进行数据的发送和接收。 Basic RF 还提供了安全通信所使用的 CCM-64 身份验证和数据加密,它的安全性读者可以通过在工程文件里面定义 SECURITY_CCM


在Project->Option 里面就可以选择,由于实验并不是什么高度机密,所以在 SECURITY_CCM 前面带 x 了,禁用。


Basic RF 的工作过程包括如下:启动、发射、接收。

启动

1、 确保外围器件没有问题

2、 创建一个 basicRfCfg_t 的数据结构,并初始化其中的成员,在basic_rf.h 代码中可以找到

typedef struct {

uint16 myAddr; //16 位的短地址(就是节点的地址)

uint16 panId; //节点的 PAN ID

uint8 channel; //RF 通道(必须在 11-26 之间)

uint8 ackRequest; //目标确认就置 true

#ifdef SECURITY_CCM //是否加密,预定义里取消了加密

uint8* securityKey;

uint8* securityNonce;

#endif

} basicRfCfg_t;


3.调用 basicRfInit()函数进行协议的初始化,在 basic_rf.c 代码中可以找到

uint8 basicRfInit(basicRfCfg_t* pRfConfig)    

函数功能:对 Basic RF 的数据结构初始化,设置模块的传输通道,短地址,PAD ID。


发送

1、创建一个 buffer,把payload 放入其中。 Payload 最大为103 个字节。

2、调用 basicRfSendPacket()函数发送,并查看其返回值在 basic_rf.c 中可以找到

uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)

destAddr 目的短地址

pPayload 指向发送缓冲区的指针

length 发送数据长度

函数功能: 给目的短地址发送指定长度的数据,发送成功刚返回 SUCCESS,失败则返回 FAILED


接收

1、上层通过 basicRfPacketIsReady()函数来检查是否收到一个

新数据包在 basic_rf.c 中可以找到

uint8 basicRfPacketIsReady(void)

函数功能: 检查模块是否已经可以接收下一个数据,如果准备好刚返回TRUE

2、调用 basicRfReceive()函数,把收到的数据复制到 buffer 中。代码可以在 basic_rf.c 中可以找到

uint8 basicRfReceive(uint8* pRxData, uint8 len,

int16* pRssi)

函数功能: 接收来自 Basic RF 层的数据包,并为所接收的数据和 RSSI 值 配缓冲区


具体实验操作:


第一步:打开….\CC2530 BasicRF\ide 文件夹下面的工程 


在 light_switch.c 里面找到 main 函数,找到下面内容,把 appLight(); 注释掉,下载到发射模块。


/************Select one and shield to another************/

appSwitch(); //节点为按键 S1 P0_0

// appLight(); //节点为指示灯 LED1 P1_0


第二步:找到相同位置,这次把 appSwitch();注释掉,下载到接收模块。

/************Select one and shield to another***********by boo*/

//appSwitch(); //节点为按键 S1 P0_0

appLight(); //节点为指示灯 LED1 P1_0


完成烧写后上电,按下发射模块的 S1 按键,可以看到接收模块的 LED1 被点亮。这时要注意按键和LED对应的引脚是否与官方的一致,如果不一室,还得更改按键与LED部分代码。

0 条评论

目前没有人发表评论

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。