无线点灯软件设计框图
Hardware layer
放在最底,肯定是你实现数据传输的基础。
Hardware Abstraction layer
它提供了一种接口来访问TIMER,GPIO,UART,ADC等。这些接口都通过相应的函数进行实现。
Basic RF layer
为双向无线传输提供一种简单的协议
Application layer
是用户应用层,它相当于用户使用Basic RF层和HAL的接口,也就是说我们通过在Application layer就可以使用到封装好的Basic RF和HAL的函数。
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 被点亮。