cc2530 Basic RF 讲解 和点灯讲解(1_1)
1. Basic RF 概述
Basic RF 是 TI 提供的一套简化版的无线通信协议栈,旨在帮助开发者快速搭建无线通信系统。它基于 IEEE 802.15.4 标准的数据包收发,但只用于演示无线设备数据传输的基本方法,不包含完整功能的协议。Basic RF 的功能限制包括不提供多跳、设备扫描、Beacon,以及不同种类的网络设备(如协调器、路由器等)3。
2. Basic RF 工作原理
- 启动:创建一个
basicRfCfg
数据结构并初始化其成员,然后调用basicRfInit()
函数进行协议初始化。 - 数据发送:创建一个 buffer,将 payload 放入其中,然后调用
basicRfSendPacket()
函数发送。 - 数据接收:上层通过
basicRfPacketIsReady()
函数检查是否收到新的数据包,然后调用basicRfReceive()
函数将收到的数据复制到 buffer 中。 - 数据帧结构:数据包结构包括前导码(Preambles)、帧开始定界符(SFD)、长度、帧控制字段、序列号、PAN ID、目的地址、源地址、有效载荷和帧校验序列(Frame check sequence)3。
3. Basic RF 的限制
- Basic RF 不支持多跳和设备扫描。
- 所有节点同级,只实现点对点传输。
- 传输时仅等待信道空闲,不执行 802.15.4 CSMA-CA 要求的两次 CCA 检测。
- 不重传数据。
4.Basic RF 操作环节
Basic RF 操作依次包括启动,发送,接收三个环节
4-1启动
启动环节包括
- 初始化开发板的硬件
- 设置无线网络ID
- 设置无线通信的通信信道号
- 设置无线通信的接收和发送 模块地址
- 若有必要,设置无线通信的网络加密等级
定义位置
在 CC2530 Basic RF 的配置中,网络的结构体通常用于存储和初始化网络相关的参数。
找到图中的文件,可以看到其网络配置的结构体
其每个定义的意思和作用
typedef struct {
uint16 myAddr; //本机地址 范围0x0000~0xffff ,作为识别本模块的地址
uint16 panId; //网络ID 范围 0x0000~0xffff , 接收和发送模块此参数必须一致
uint8 channel; //通信信道号 范围 11~26 , 接收和发送模块此参数必须一致
uint8 ackRequest; //应答信号
#ifdef SECURITY_CCM //是否加密,预定义时取消了加密
uint8* securityKey; //密钥 两方必须一致
uint8* securityNonce; //IV/Nonce值 //各一个随机数即可 (它会发送给对方在配合密钥即可解密)
#endif
} basicRfCfg_t;
初始文件实现的位置
在main函数中可以看到如下的几个定义它就是其上方的定义值
// Config basicRF
basicRfConfig.panId = PAN_ID; //#define PAN_ID 0x2007
basicRfConfig.channel = RF_CHANNEL; //#define RF_CHANNEL 25 // 2.4 GHz RF channel
basicRfConfig.ackRequest = TRUE; //#define TRUE 1
硬件初始化
在主函数中可以看到 ( halBoardInit(); )函数它是 对硬件IO的初始化 位置在 hal_board.c 文件中
发送函数(按键函数来解释其发送过程)
函数
static void appSwitch() 开关函数
{
pTxData[0] = LIGHT_TOGGLE_CMD; //要发送的数据
basicRfConfig.myAddr = SWITCH_ADDR; //本机地址
if(basicRfInit(&basicRfConfig)==FAILED) { //初始化RF
HAL_ASSERT(FALSE); //设置断言
}
// Keep Receiver off when not needed to save power
basicRfReceiveOff(); //关闭接收模式
// Main loop
while (TRUE) { //TRUE = 真
if(halButtonPushed()==HAL_BUTTON_1){ //调用按键函数 判断是否按下
basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH); //调用发送函数
// Put MCU to sleep. It will wake up on joystick interrupt
halIntOff(); //关闭中断
halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global //打开全局
// interrupt enable
halIntOn(); //开启中断
}
}
}
接收函数(LED灯函数来解释其接收过程)
static void appLight()
{
// Initialize BasicRF
basicRfConfig.myAddr = LIGHT_ADDR; //本机地址
if(basicRfInit(&basicRfConfig)==FAILED) { 初始化方法与发送环节一样
HAL_ASSERT(FALSE);
}
basicRfReceiveOn(); //开启接收
// Main loop
while (TRUE) { //一直循环
while(!basicRfPacketIsReady()); //判断是否有数据
if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {//检查数据是否完整
if(pRxData[0] == LIGHT_TOGGLE_CMD) {//处理数据
halLedToggle(1);
}
}
}
}