BasicRF点对点概述
BasicRF软件包有四大部分:
<1> 硬件层:Hardware Layer。
<2> 硬件抽象层:Haware Abstraction Layer。
<3> 基本无线传输层:Basic RF Layer。
<4> 应用层:Appliaction。
BasicRF包括了IEEE 802.15.4标准数据包的发送和接收,采用了与IEEE 802.15.4 MAC兼容的数据包结构和ACK结构。在使用中,有如下的功能限制:
<1> 不具备“多跳”、“设备扫描”功能。
<2> 不提供多种网络设备,如协调器、路由器等。所有的节点为同一等级,只能实现点对点的数据传输。
<3> 传输时会等待信道空闲,但不会按照IEEE 802.15.4 CSMA-CA的要求进行两次CCA检测。
<4> 不支持数据重传。
BasicRF点对点开发要点
Basic RF软件包看起来挺复杂的,实际上与无线数据传输相关的并不多。通过抽丝剥茧,发现真正与Basic RF相关的也就四个部分:
<1> 无线参数配置。
<2> 无线模块初始化。
<3> 无线数据发送。
<4> 无线数据接收。
该软件包的其他部分,都是管理CC2530硬件的内容,在实际的开发中,你可以使用Basic RF软件包提供的API来控制硬件,当然也可以自己重新写,这就跟单纯的CC2530控制应用开发一样。
无线参数的配置
在basic_rf.h的文件中,有一个basicRfCfg_t类型的数据结构定义,该结构体包含了无线相关的所有参数。
在应用开发中,先创建一个该类型的结构体变量,再根据实际情况,把本机地址、网络ID、通信信道、应答信号和加密设置填充到该结构体变量中。然后再通过basicRfInit(basicRfCfg_t* pRfConfig)初始化函数将参数写入到无线模块中。
注意:两个要建立通信的节点,网络ID和通信信道必须一致。
typedef struct
{
uint16 myAddr; // 本机地址,作为识别本模块的设备地址
uint16 panId; // 网络ID,两个节点必须一致
uint8 channel; // 通信信道, 11~26,两个节点必须一致
uint8 ackRequest; //应答信号
#ifdef SECURITY_CCM //是否加密,预定义时取消了加密
uint8 *securityKey;
uint8 *securityNonce;
#endif
} basicRfCfg_t;
无线模块初始化
在hal_rf.c文件中,有一个halRfInit()函数,该函数初始化射频无线模块,设置默认配置选项,允许自动确认和允许随机数产生。
在应用开发中,直接调用该函数来初始化无线模块,不需要关注该函数的实现细节。
uint8 halRfInit(void)
{
// Enable auto ack and auto crc
FRMCTRL0 |= (AUTO_ACK | AUTO_CRC);
// Write non-default register values
// Tuning settings
TXPOWER = CC2530_TXPOWER_0_DBM; // TX output power ~0 dBm
// Recommended RX settings
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;
// Enable random generator -> Not implemented yet
// Enable CC2591 with High Gain Mode -> Not implemented yet
// Enable RX interrupt
halRfEnableRxInterrupt();
return SUCCESS;
}
无线数据发送
在basic_rf.c文件中,有一个basicRfSendPacket()函数,负责无线数据的发送。
该函数有三个参数,依次是:
uint16 destAddr———->发送目标的地址
uint8* pPayload———->发送内容的数组
uint8 length———->发送数据的长度
在应用开发中,先创建一个字节数组作为数据发送的缓冲区,将要发送的内容置于数组之中,然后直接调用该无线数据发送函数进行发送即可。
函数执行成功返回:SUCCESS。
函数执行失败返回:FAILED。
无线数据接收
在无线数据的接收中,首先要查询并判断是否接收到新的数据,如果有,则把接收的数据读出去来,因此需要用到basic_rf.c文件中的2个API函数:
basicRfPacketIsReady()函数。
basicRfReceive()函数。
首先调用basicRfPacketIsReady()函数来查询是否收到新的数据包,如果有新的数据包,则返回TRUE。新的数据包信息会存放在basicRfRxInfo_t类型结构体的rxi成员中。在应用开发中,我们不需要过多关注该结构体。因为当查询到新的数据包后,调用basicRfReceive()函数就可以把新接收到的数据复制到自定义的数据缓冲区中,然后进行应用开发。
basicRfReceive()函数有三个参数,依次是:
uint8* pRxData———->数据接收缓冲区
uint8 len———->要接收的数据长度
int16* pRssi———->无线信号强度,实际应用中填NULL
函数执行成功返回:接收的字节数。
技能大赛中的BasicRF
BasicRF点对点无线通信应用,是物联网应用技术技能大赛中一个非常重要的部分。如果能熟练掌握核心知识和开发要点,该部分的分数是比如容易获得的。
技能大赛所提供的BasicRF工程在TI公司的原版工程上稍做了修改,主要是有2个方面:
一个是跟串口通信有关,在hal_uart.c文件中。
另一个是跟传感器模块有关,在sensor.c文件中。
在比赛中,要求选手在提供的BasicRF工程中补充适当的代码,完成题目的要求。
/*****点对点通讯地址设置******/
#define RF_CHANNEL xx // 频道 11~26
#define PAN_ID 0xXXXX //网络id
#define MY_ADDR 0xXXXX //本机模块地址
#define SEND_ADDR 0xXXXX //发送地址
/**************************************************/
/********************MAIN************************/
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
while(1)
{
/* user code start */
/* user code end */
}
}
资源下载:物联网技能大赛提供的BasicRF工程资源
开发速查:BasicRF点对点开发大赛官方API函数汇总
开发速查:BasicRF中传感器模块电路接口及官方API函数汇总
BasicRF相关的视频教程及训练题目
视频教程01:BasicRF点对点无线应用开发要点
视频教程02:BasicRF点对点环境中在串口通信