小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【备赛宝典】基于BasicRF点对点无线通信的应用开发核心要点

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点对点环境中在串口通信

赞(29)
未经允许不得转载:小蜜蜂笔记 » 【备赛宝典】基于BasicRF点对点无线通信的应用开发核心要点

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店