8.简易无线通信

news2024/11/24 20:52:40

预备知识

  • Zigbee无线通信,需要高频的载波来提供发射效率,Zigbee模块之间要可以正常的收发,接收模块必须把接收频率设置和发射模块的载波频率一致。
  • Zigbee有27个载波可以进行通信,载波叫做信道(无线通信的通道)。这些载波的频率落在某些频率区段,我们把这些区段叫做频段。
    • 2.4G频段 16个信道
    • 915M频段 896M频段 11个信道
    • 但TI的所有支持Zigbee底层协议的芯片只能在2.4G频段的16个信道里进行通信,即11-26信道。
  • 网络地址:在Zigb
  • ee无线局域网里,每一模块都一个在该网络里唯一的2个字节的地址,这个地址叫做网络地址,网络短地址。
  • PANID:这是一个2个字节的编码,用来区别不同的Zigbee无线局域网,个域网ID.

代码分析

这里不在详细介绍,只给出关键配置代码的代码模板

对于数据发送接收的程序来说,基本的无线通信的基础配置是固定的,只需要知道里面需要自己每次更改的部分即可

将两个接收和发送的代码分别烧录到两个开发板中,实验现象是:发送板按下按键发送你设定的数字SENDVAL到接收板,接收板通过数码管显示该数字

发送数据

分析

void halRfInit(void):无线通信初始化函数

void RFSend(char *pstr,char len):无线数据发送函数

__interrupt void RF_IRQ(void):无线通信中断函数

void RevRFProc():无线数据接收函数

无线通信初始化函数

在这个函数中,需要修改的只有FREQCTRLPAN_ID1两项的值

image-20231010205943211

image-20231010210142126

image-20231010210253727

无线数据发送函数

可以直接看注释,这个函数基本不用改动,使用时直接掉这个函数就行,传入发送数组和数组长度即可

image-20231010210834002

中断函数

image-20231010211712457

发送数据包数组
char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
  • 第一个字节0x0C含义,这个自己后面还有12个字节要发送,实际上是10(后面跟的)+2(默认自动添加的CRC 码)
  • 第5 6个字节表示的是PANID
  • 第7 8个字节是无线模块目标设备的网络地址 0xBEEF
  • 第9 10就是本地模块的网络地址
  • 11 个字节是我们有用的数据
  • CRC码 12 13个字节 是硬件自动追加
主函数中的注意事项

image-20231010213115722

发送数据模板代码

将两个接收和发送的代码分别烧录到两个开发板中,实验现象是:发送板按下按键发送你设定的数字SENDVAL到接收板,接收板通过数码管显示该数字

#include<iocc2530.h>
#include"74LS164_8LED.h"
#define SENDVAL 5

char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
//第一个字节0x0C含义,这个自己后面还有12个字节要发送
//第5 6个字节表示的是PANID
//第7 8个字节是无线模块目标设备的网络地址 0xBEEF
//第9 10就是本地模块的网络地址
//11 个字节是我们有用的数据
// CRC码 12 13个字节 是硬件自动追加

void Delay()
{
    int y,x;
    
    for(y=1000;y>0;y--)
      for(x=30;x>0;x--);
}

void Init32M()
{
   SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源
   while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定
   Delay();
   CLKCONCMD &=0xF8;//1111 1000 不分频输出
   CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟
   while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}

void KeysIntCfg()
{//Key3  Key4   Key5
     
     IEN2|=0x10;//开P1IE组中断
     P1IEN|=0x02;//开Key3组内中断
     PICTL|=0x02;//设置P1_1为下降沿 
     EA=1;      //开总中断
}
void halRfInit(void)
{
    EA=0;
    FRMCTRL0 |= 0x60;

    // Recommended RX settings  
    TXFILTCFG = 0x09;
    AGCCTRL1 = 0x15;
    FSCAL1 = 0x00;
    
    // enable RXPKTDONE interrupt  
    RFIRQM0 |= 0x40;//把射频接收中断打开
    // enable general RF interrupts
    IEN2 |= 0x01;
    
    //设置信道
    FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING);   
                     //设置载波为2475M
    
    //设置ID
    PAN_ID0=0x07;
    PAN_ID1=0x20; //0x2007   
    
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;    
}

//发送无线数据
void RFSend(char *pstr,char len)
{
    char i;
    RFST = 0xEC; //确保接收是空的
    RFST = 0xE3; //清接收标志位
    while (FSMSTAT1 & 0x22);//等待射频发送准备好
    RFST = 0xEE;//确保发送队列是空
    RFIRQF1 &= ~0x02;//清发送标志位
    //为数据发送做好准备工作

    for(i=0;i<len;i++)
    {
       RFD=pstr[i];
    }  //循环的作用是把我们要发送的数据全部压到发送缓冲区里面
    
    RFST = 0xE9; //这个寄存器一旦被设置为0xE9,发送缓冲区的数据就被发送出去
    while(!(RFIRQF1 & 0x02) );//等待发送完成
    RFIRQF1 = ~0x02;//清发送完成标志
}


void main()
{
   LS164_Cfg();//74LS164控制数码管的初始化
   Init32M(); //主时钟晶振工作在32M 
   KeysIntCfg(); 
   
   halRfInit();//无线通信的初始化  初始化相关的寄存器,配置工作信道,和PANID
   
   SHORT_ADDR0=0x50;
   SHORT_ADDR1=0x20;//设置本模块地址  设置本模块的网络地址0x2050
   //大小端模式问题,
  
    LS164_BYTE(1); 
    while(1);
}

#pragma vector=P1INT_VECTOR
__interrupt void Key3_ISR() //P1_1
{
     if(0x02 & P1IFG)
     {
         Delay();
         if(0==P1_1)
         {           
           P1DIR |=0X01;
           P1_0 ^=1;
           RFSend(SendPacket,11);//发送数据
         }     
     }

     P1IFG=0;
     P1IF=0;
}


#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{//这个是射频中断函数,当小灯模块接收到开关模块发送来的数据时,小灯模块的CPU就会进入中断函数执行
    EA=0;
    if( RFIRQF0 & 0x40 )
    {            
        RFIRQF0&= ~0x40;   // Clear RXPKTDONE interrupt
    }
    S1CON= 0;                   // Clear general RF interrupt flag
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;
}

接收数据

分析

初始化函数和发送数据的初始化函数一样,只需要把发送函数去掉,添加一个接收函数即可

注意

  1. 两相互通信的模块之间,初始化函数中的接收和发送的信道和PANID一定要一样
  2. 接收工程的主函数中设置的SHORT_ADDR网络地址需要和发送的数据包中的第7、8两个字节所生成的网络地址一致
中断函数

image-20231010213214831

无线数据接收函数

image-20231010214105096

接收数据模板代码

将两个接收和发送的代码分别烧录到两个开发板中,实验现象是:发送板按下按键发送你设定的数字SENDVAL到接收板,接收板通过数码管显示该数字

#include<iocc2530.h>
#include"74LS164_8LED.h"
#define SENDVAL 5

char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
//第一个字节0x0C含义,这个自己后面还有12个字节要发送
//第5 6个字节表示的是PANID
//第7 8个字节是无线模块目标设备的网络地址 0xBEEF
//第9 10就是本地模块的网络地址
//11 个字节是我们有用的数据
// CRC码 12 13个字节 是硬件自动追加

void Delay()
{
    int y,x;
    
    for(y=1000;y>0;y--)
      for(x=30;x>0;x--);
}

void Init32M()
{
   SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源
   while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定
   Delay();
   CLKCONCMD &=0xF8;//1111 1000 不分频输出
   CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟
   while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}

void halRfInit(void)
{
    EA=0;
    FRMCTRL0 |= 0x60;

    // Recommended RX settings  
    TXFILTCFG = 0x09;
    AGCCTRL1 = 0x15;
    FSCAL1 = 0x00;
    
    // enable RXPKTDONE interrupt  
    RFIRQM0 |= 0x40;//把射频接收中断打开
    // enable general RF interrupts
    IEN2 |= 0x01;
    
    //设置信道
    FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING);   
                     //设置载波为2475M
    
    //设置ID
    PAN_ID0=0x07;
    PAN_ID1=0x20; //0x2007   
    
//halRfRxInterruptConfig(basicRfRxFrmDoneIsr); 
    
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;    
}

//接受无线数据
void RevRFProc()
{
	static char len;
	static char  ch;

    len = ch = 0;
    RFIRQM0 &= ~0x40;
    IEN2 &= ~0x01;
    EA = 0;
 
    len = RFD;//读第一个字节判断这一串数据后面有几个字节;

    while (len > 0) 
    {//只要后面还有数据那么就把他都从接受缓冲区取出来
        ch=RFD;
        if(3 == len)
        {//读取倒数第三个字节的数字,通过数码管显示
           LS164_BYTE(ch);
        }
        len--;
     }     
    EA=1;
    RFIRQM0 |= 0x40;
    // enable general RF interrupts
    IEN2 |= 0x01;        
}


void main()
{
  
  LS164_Cfg();//74LS164控制数码管的初始化
  Init32M(); //主时钟晶振工作在32M 
  halRfInit();
   
  SHORT_ADDR0=0xEF;
  SHORT_ADDR1=0xBE;//设置本模块地址  0xBEEF
  
  LS164_BYTE(2); 
  while(1);
}

#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{//这个是射频中断函数,当小灯模块接收到开关模块发送来的数据时,小灯模块的CPU就会进入中断函数执行
    EA=0;
    if( RFIRQF0 & 0x40 )
    {
        
        RevRFProc();
             
        RFIRQF0&= ~0x40;   // Clear RXPKTDONE interrupt
    }
    S1CON= 0;                   // Clear general RF interrupt flag
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4 EQS环境查询 学习笔记

EQS环境查询对应Actor的范围 EQS环境查询查询对应的类 查询到即有一个蓝色的球在Actor上&#xff0c;里面有位置信息等等 在行为树运行EQS&#xff0c;按键&#xff08;‘&#xff09;可以看到Player的位置已经被标记 运行对应的EQS在这里放如EQS就可以了 Generated Point&…

2023年中国分布式光纤传感产量、需求量及行业市场规模分析[图]

分布式光纤传感器中的光纤能够集传感、传输功能于一体&#xff0c;能够完成在整条光纤长度上环境参量的空间、时间多维连续测量&#xff0c;具有结构简单、易于布设、性价比高、易实现长距离等独特优点&#xff0c;常用的分布式光纤传感器有光时域反射仪、布里渊分析仪、喇曼反…

【AI视野·今日Robot 机器人论文速览 第五十四期】Fri, 13 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 13 Oct 2023 Totally 45 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;AI与机器人安全, 从攻击界面、伦理法律和人机交互层面进行了论述。(from 密西西比大学) &#x1f4da;机器人与图机器学…

Windows端口号被占用的查看方法及解决办法

Windows端口号被占用的查看方法及解决办法 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-10-14 22:58:32.069 ERROR 6488 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***…

Qt 布局(QLayout 类QStackedWidget 类) 总结

一、QLayout类(基本布局) QLayout类是Qt框架中用于管理和排列QWidget控件的布局类。它提供了一种方便而灵活的方式来自动布局QWidget控件。QLayout类允许您以一种简单的方式指定如何安排控件&#xff0c;并能够自动处理控件的位置和大小&#xff0c;以使其适应更改的父窗口的大…

【HCIA】静态路由综合实验

实验要求&#xff1a; 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff0c;该设备只能配置IP地址之后不能再对其进行任何配置 2、R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24&#xff0c;请合理分配 3、R1、R2、R4&#xff0c;各有两个环回IP地址;R5,R6各有一…

基于 Kubernetes 的 Serverless PaaS 稳定性建设万字总结

作者&#xff1a;许成铭&#xff08;竞霄&#xff09; 数字经济的今天&#xff0c;云计算俨然已经作为基础设施融入到人们的日常生活中&#xff0c;稳定性作为云产品的基本要求&#xff0c;研发人员的技术底线&#xff0c;其不仅仅是文档里承诺的几个九的 SLA 数字&#xff0c…

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存 10.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession对象 查询的结果数据会被缓存&#xff0c;下次执行相同的查询语句&#xff0c;就 会从缓存中&#xff08;缓存在内存里&#xff09;直接获取&#xff0c;不会重新访问…

c++string类的赋值问题

来看问题&#xff1a; 为什么呢&#xff1f;是因为定义string a""时候a没有占用空间&#xff0c;所以没有a[0],a[1],a[3]。如果说string a"hhhhhh"&#xff0c;那么图中a[0],a[1],a[3]就有效了。正确的做法是用连接&#xff0c;或者是定义时写成string a(6…

爬虫 | 正则、Xpath、BeautifulSoup示例学习

文章目录 &#x1f4da;import requests&#x1f4da;import re&#x1f4da;from lxml import etree&#x1f4da;from bs4 import BeautifulSoup&#x1f4da;小结 契机是课程项目需要爬取一份数据&#xff0c;于是在CSDN搜了搜相关的教程。在博主【朦胧的雨梦】主页学到很多…

vsc连接wsl安装vsc时遇到权限问题的解决方案

当点击左下角的连接 遇到下面的权限提示时 mkdir: cannot create directory ‘/home/xxx(用户名)/.vscode-server’: Permission denied 可以新建文件 /etc/wsl.conf&#xff0c;并拷贝如下内容 # Automatically mount Windows drive when the distribution is launched [aut…

面试总结之Java基础

1、反射 1.1、概述 反射&#xff1a;加载类&#xff08;通过反射将类的字节码文件加载到内存中&#xff09;&#xff0c;并允许以编程的方式解剖类中的各种成分&#xff08;成员变量、方法、构造器等&#xff09;反射需要掌握的内容&#xff1a; 1&#xff09;记载类&#xf…

实习项目遇到的bug

问题1&#xff1a; 大概是因为没设置ts类型&#xff0c;它查不到的问题&#xff0c;不定义的话加上问号&#xff0c;加上可选链就不会报错了 {{bizEquipmentInfo.lastUnlockingVO?.lastUnlockingTime.replace(T, )? bizEquipmentInfo.lastUnlockingVO?.lastUnlockingTime.r…

通讯网关软件024——利用CommGate X2Access实现Modbus TCP数据转储Access

本文介绍利用CommGate X2ACCESS实现从Modbus TCP设备读取数据并转储至ACCESS数据库。CommGate X2ACCESS是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从Modbus TCP设备读取数据并转储…

【EventLoop】问题一次搞定

&#x1f4cd; JS的事件循环机制恐怕是大多数前端开发者头顶上的一座大山之一&#xff0c;最近通过拜读两篇文档&#xff0c;对eventloop进行了深刻的理解&#xff1b;通过这篇文档对要点进行总结&#xff1b; article1&#xff1a; 波神的这篇eventLoop文章适合反复重温&…

Ubuntu22安装Docker engine(apt安装方式)

一、准备工作 新创建一个虚拟机。 进入虚拟机&#xff1a; 二、安装docker docker现在对用不同主机提供了不同安装包&#xff1a;docker engine 和 docker desktop。 docker desktop适用于图形化的桌面电脑&#xff0c;docker engine适用于服务器。我们这里当然是安装docker…

Mac 远程 Ubuntu

1. Iterm2 添加ssh 参考&#xff1a;https://www.javatang.com/archives/2021/11/29/13063392.html 2. Finder 添加远程文件管理 2.1 ubuntu 配置 安装samba sudo apt-get install samba配置 [share]path /home/USER_NAME/shared_directoryavailable yesbrowseable ye…

快速计算发票金额

快速计算发票总额 背景 在日常的工作中&#xff0c;我们不免需要面临费用报销问题&#xff0c;在进行费用报销时&#xff0c;我们需要提供费用相关的发票&#xff0c;并需要在报销单上填写相关的金额数据。这时我们将面临核对和计算发票金额的需求。 核对发票 如今&#xf…

基于和声优化的BP神经网络(分类应用) - 附代码

基于和声优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于和声优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.和声优化BP神经网络3.1 BP神经网络参数设置3.2 和声算法应用 4.测试结果&#xff1a;5.M…

STM32成熟变频逆变器方案

该方案是一款成熟的变频逆变器的方案&#xff0c;主要是把电源从直流到3相交流的转换&#xff0c;包含变频控制板&#xff0c;逆变主板&#xff0c;IO板&#xff0c;变频控制板主控是STM32F103VET6&#xff0c;配套软件。每一块板子都是原理图和PCB一一对应&#xff0c;并且配套…