当前位置: 首页 > article >正文

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启动

启动环节包括

  1. 初始化开发板的硬件
  2. 设置无线网络ID
  3. 设置无线通信的通信信道号
  4. 设置无线通信的接收和发送 模块地址
  5. 若有必要,设置无线通信的网络加密等级
定义位置

在 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);
            }
        }
    }
}


http://www.kler.cn/news/367456.html

相关文章:

  • Redis 事务 总结
  • k8s可以部署私有云吗?私有云部署全攻略
  • 基于信号分解和多种深度学习结合的上证指数预测模型
  • Java-图书管理系统
  • 攻防世界-流量分析WP
  • dbt-codegen: dbt自动生成模板代码
  • tkinter包中包含的colorchooser模块简介
  • 卷积神经网络:卷积层,池化层,全连接层
  • springboot2.6.15升级至3.3.4,Spring Framework升级至6.1.14
  • GIT使用list
  • Java - Maven中pom文件的filtering作用
  • TDengine数据库整合MyBatis实现SpringBoot项目CRUD
  • 标准版增加订单导出的字段
  • Go encoding/json库
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day6
  • CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)
  • 守护灯杆安全的智能卫士 —— 灯杆倾斜检测传感器
  • 【AIGC】AI如何匹配RAG知识库:混合检索
  • 【CTF】文件包含漏洞-php://filter 流包装器 【详】
  • acwing排列数字
  • 一个和v-html功能一样且能防止xss攻击的插件
  • Java多线程详解②(全程干货!!!)Thread Runnable
  • 本地docker-compose仓库搭建以及推送docker镜像到仓库
  • 音视频入门基础:AAC专题(11)——AudioSpecificConfig简介
  • 【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性
  • 【Qt6聊天室项目】 主界面功能实现