2.4g无线跳频(三)

2023-11-02

2.4g无线跳频(三)

一、跳频过程分析

1.主从建立连接,开启定时器。
2.对于主机,每个定时周期内,前部分处于发送模式,后部分处于接收模式;
   对于从机,每个定时周期内,前部分处于接收模式,后部分处于发送模式;发送时间应安排小于接收时间;
3.主机发送数据后,在规定的时间后转换为接收模式;从机接收到数据后马上调整自身时间,以达到同步的目的;
   主机发送数据的时间要求准时,因为从机接收到信息后会马上调整定时器的计数,同步从机与主机的时间;
4.定时时间一到便开始跳频,注意设法让接收方先于发送方跳。
   跳频示意图:

  带序列的跳频示意图:


二、代码

#define TIMXCNT TIM3->CNT
#define NRF_CH_SIZE 32  	//频道数目
typedef struct 
{
	u8 rsq[NRF_CH_SIZE];   //序列
	u32 seed ;  //随机种子
	u32 rsqval; //当前序列值
} _rsq_st ;         //与随机序列有关的变量
_rsq_st rsq_st;


u8 semflag=0;      //全局标志变量,用于同步线程
u8 print_flag=0;   //用于串口打印输出的标志变量
/*字节对齐,方便读写*/
#pragma pack(push)
#pragma pack(4)
u8 tmp_Tbuf[NRF_CH_SIZE]; 
u8 tmp_Rbuf[NRF_CH_SIZE];  
#pragma pack(pop)

u8 pdatas[255]={0}; //用于打印测试

TIM3_Int_Init(50000-1 ,72-1 );  // 定时arr=50000

#ifdef NRF24LXX_MASTER       //主机代码
void TIM3_IRQHandler(void)   //TIM3中断
{
	        static u8 i=0 ;
	        if ( TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET)    //检查中断源 
		{
		    TIM_ClearITPendingBit( TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位


			if( NRF_CH_SIZE == i)  //序列周期到了
			{
				i=0;  
				revflag=1;
				rsq_st.seed = *(u32*)(tmp_Rbuf+4) ;   //接收种子 
				BuildRandomSequence( rsq_st.rsq, NRF_CH_SIZE, rsq_st.seed);//利用种子生成特定序列
			}
			
			rsq_st.rsqval = rsq_st.rsq[i];
			tmp_Tbuf[0] = i+'@';
			tmp_Tbuf[1] = i+'@';
			semflag = 0;//  
			i++;	 
		}
}
#else  //从机代码
void TIM3_IRQHandler(void)   
{
	static u8 i=0  ;
	if (TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET)  
	{
	   TIM_ClearITPendingBit( TIM3, TIM_IT_Update  );   
		
		  if( NRF_CH_SIZE == i )
			{
				i=0;
				revflag=1;
				BuildRandomSequence( rsq_st.rsq, NRF_CH_SIZE, rsq_st.seed);//利用种子生成特定序列
			}
			
			NRF24L01_SET_rfch( rsq_st.rsq[i] ) ;  //根据序列跳频
			NRF24L01_TX_Mode(1); 
			tmp_Tbuf[0] = i+'@'; //改变其中一个发射值
			tmp_Tbuf[1] = i+'@'; //改变其中一个发射值
			NRF24L01_TxPacket( tmp_Tbuf);
			semflag = 0;  
			i++;		
	}
}
#endif


/*生成随机种子并装载至发生内存*/
u32 mySequence()
{
	rsq_st.seed = get_random();//随机种子
	*(u32*)(tmp_Tbuf+4) = rsq_st.seed;
	return rsq_st.seed;
}

# ifdef NRF24LXX_MASTER    //主机代码
                static u8 i=0;
		NRF24L01_RX_Mode(1);//接收模式,开启自动应答
		BuildRandomSequence( rsq_st.rsq, NRF_CH_SIZE, rsq_st.seed);//利用种子生成特定序列
		while(1)
		{		
		  switch( semflag)
			{
				case 0: 						
					NRF24L01_SET_rfch( rsq_st.rsqval ) ;  //根据序列跳频
					NRF24L01_RX_Mode(1);  
					semflag++;
				break ;
				case 1:
					if( print_flag )//打印数据
				       {
						print_flag=0;
						fz+= i;fm+=NRF_CH_SIZE;
						printf (" %d:%d:%.4f:", temp, i, fz/ fm);
						pdatas[ i]='\r',pdatas[ i+1]='\n';
						myUSART_Sendarr( USART1, pdatas  , i+2) ;
						i=0; 
				        }
					semflag++;
				break ;
				case 2:
					if( TIMXCNT <30000)
				       {	
						if(NRF24L01_RxPacket( tmp_Rbuf)==0)//接收到信息 
						{
							temp= TIM3->CNT ;
							TIM3->CNT=1800 ;
							pdatas[ i]= tmp_Rbuf[0];
							i++;	
						}
					}
					else 
					semflag++;
				break ;
				case 3:
					NRF24L01_TX_Mode(1);  //发送模式,开启自动应答自动从发  
				        semflag++;
				break ;
				case 4:
					 NRF24L01_TxPacket( tmp_Tbuf);
				         if( semflag==4) semflag++;
				         mySequence();//生成随机种子并装载发送内存,为下一周期准备
				break ;
		                case 5:	 
				break ;
			}	   			
		}	
	}
#else  //从机代码
	{					
	    static u16 temp ;
		static u8 i=0;


		NRF24L01_TX_Mode(1);//发送模式,开启自动应答自动从发
		mySequence(); //生成随机数并装载发送内存,为下周期准备
		while(1)
		{
			if( TIMXCNT >20000) //时间到了开始接收模式
			{
			   if( semflag == 0) 
									NRF24L01_RX_Mode(1);  //接收模式,开启自动应答
					semflag++;  
				 }
				 else if(TIMXCNT <49500)
				 {
					 if(NRF24L01_RxPacket( tmp_Rbuf)==0) //接收到信息 
					{
						temp=TIM3->CNT ;	   //用于观察计数器
						pdatas[i]= tmp_Rbuf[0];//取第一个数装载至pdatas ,用来测试
						i++;	
					}						 
				 }
			}
				
			if( print_flag )  //打印数据
			{	
				print_flag=0;
				fz+= i;fm+= NRF_CH_SIZE;
				printf ("%d:%d:%.4f:", temp, i, fz/ fm);//串口打印
				pdatas[i]='\r',pdatas[i+1]='\n';
				myUSART_Sendarr( USART1, pdatas, i+2); //串口打印数组
				i=0;
			}		    
		};
	}
#endif

以上代码,注意主函数进程与定时器中断服务进程之间的同步,绝不要让两个进程同时访问相同的硬件(这里是无线IC)。

三、验证

两个模块,串口接收如下;
注意第一个数据是各自接收到数据时的定时器读数,而后面1.0000代表丢失率为0,数据接收质量还不错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.4g无线跳频(三) 的相关文章

  • 基于stm32与NRF24L01的无线门禁系统

    首先 xff0c 需要说明梁只是一个小本科生 xff0c 水平不高 xff0c 许多错误请大家指教 xff08 qq1257681989 xff09 所写的内容是我自己做的 xff0c 写此博客仅在于让自己在完成之后有个回顾和总结 进入正文
  • 详解NRF24L01无线收发模块

    近日有粉丝朋友留言 xff0c 希望介绍一下nRF24L01这款无线收发芯片 xff0c 正巧前不久的电赛有些涉及 xff0c 因此将自己的一些经验写在这里 xff0c 希望能有所收获 前面我们介绍过单片机的几种通信协议 xff0c 并且初
  • 基于STM32的LoRa无线通信(AS32—TTL-1W)

    目录 无线串口简介 项目简介 发送端代码 接收端代码 项目总结 前些天接触到一个小项目 xff0c 需要使用无线传输的功能 xff0c 不仅如此还需要远距离的通信 xff0c 搜索资料后最终选择了泽耀科技的LoRa xff08 AS32 T
  • NRF24L01+模块:一对一双向通信,成功!

    查找了很多资料 xff0c 好多都是复制粘贴转发 xff0c 或者安装英文手册直译的 xff08 比如我自己上篇笔记 xff0c xff0c xff09 xff0c 看完还是一脸懵逼 xff0c 没几个可行的 xff0c 推荐几个比较实在的
  • stm32驱动NRF24L01_原理+代码解析

    目录 概念 废话篇 xff08 24L01简介 xff09 引脚分配 工作模式 通信地址理解 xff08 个人疑难点 xff09 原理分析 寄存器赏析 寄存器操作指令 配置寄存器 xff08 CONFIG xff0c 位置 xff1a 0X
  • NRF24L01数据通信C程序

    NRF24l01 产品性能 xff1a 1 xff09 2 4GHZ全球开放ISM频段免许可使用 2 xff09 最高工作速率2Mbps GFSK高效调制 3 xff09 125个频道满足多点通讯和跳频通讯需求 4 xff09 1 9 3
  • 基于NRF24L01的CAN数据透传

    闲谈 xff1a 闲来无聊 xff0c 恰好公司又经常用CAN数据的传输 xff0c 自己觉得要是用无线传送多好 xff0c 然后 xff0c 就是一个奇想 xff0c 就想做一个无线数据的透传 xff0c 恰好身边又有NRF24L01 那
  • NRF24L01模块----6通道通讯测试

    一 MCU与NRF24L01通讯 采用SPI通讯协议 速率最大为10M 与普通SPI元器件稍有不同的是 多了一个CE引脚 用来开启接收 发送 以及使器件进入待机模式 具体看IC DATASHEET说明 写寄存器指令格式为 1 SPI写寄存器
  • [4G+5G专题-140]: 终端 - 5G终端主要的产品形态 - 行业终端

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123064525 目录 第1章 本章在
  • 2.4g无线跳频(三)

    2 4g无线跳频 三 一 跳频过程分析 1 主从建立连接 开启定时器 2 对于主机 每个定时周期内 前部分处于发送模式 后部分处于接收模式 对于从机 每个定时周期内 前部分处于接收模式 后部分处于发送模式 发送时间应安排小于接收时间 3 主
  • 125KHz RFID芯片模块及电路替代方案

    125K RFID芯片模块是否可以写数据 以上是125KHz RFID芯片模块的供应商和芯片名称 频段 容量 功能 协议 18000 2 11784 11785协议 集成 RFID 收发器可对 100 到 150 kHz 频率范围内的转发器
  • 查IEEE期刊名的缩写

    网址 https woodward library ubc ca research help journal abbreviations
  • 5G时代的应用场景及商业模式和财富商机

    原创文章 转载请与作者联系 0 前言 互联网兴起 诞生了一批富翁 如马云 马化腾 移动互联网兴起后 3G时代 有人做电商发财了 4G时代 有人写公众号月入六位数 有人主播卖货日进斗金 有人靠着短视频实现了财务自由 5G将开启充满机会的时代
  • 非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同

    1 非接触式IC卡的国际规范ISO IEC14443的由来 在非接触式IC卡的发展过程中 这些问题逐渐被解决并形成通用的标准 体现在现在的射频IC卡的设计上 国际标准化组织 ISO 和国际电子技术委员会 IEC 为期制定了相应的非接触式IC
  • IC卡、ID卡、CPU卡、RFID和NFC的区别

    ID卡 ID卡是早期的电子标签 只有一个ID号 不可以存储任何数据 故叫ID卡 ID卡没有算法 不可写入数据 其ID出厂一次性写入 应用人员只可读出卡号加以利用 ID卡容易复制 安全性较低 应用 主要应用在门禁系统 企业工牌 安全性 ID
  • nRF24L01单芯片2.4GHz收发模块射频信道频率

    框架图 管脚图 操作模式配置 射频信道频率 RF通道频率决定了 nRF24L01 使用的通道中心 该通道在 1Mbps 时占用 1MHz 带宽 在 2Mbps 时占用 2MHz 带宽 nRF24L01 可以在 2 400GHz 到 2 52
  • 通信子网在计算机网络中的地位和作用

    一 通信子网是计算机网络的核心组成部分 通信子网是计算机网络的核心组成部分 它负责为计算机网络中的各种设备提供通信支持 无论是主机之间的数据传输 还是主机与终端之间的数据通信 都需要通过通信子网来实现 通信子网是连接各个设备的关键基础设施
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能 负责全网的数据通信 通信子网通过使用各种通信协议和传输控制功能 能够确保数据从一台主机安全 准确地传输到另一台主机 这包括数据的封装 解封装 传输控制 差错控制等过程 完成各种网络数据的处理 转换和交
  • 计算机网络中的通信子网:架构、协议与技术简介

    在计算机网络中 通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分 它由一系列硬件设备和通信协议组成 为上层应用提供可靠 高效和透明的数据传输服务 本文将详细介绍通信子网的架构 协议与技术 一 通信子网的架构 星型拓扑 星型拓扑
  • EMC RI/CI测试方案助您对抗电磁设备干扰!

    方案背景 电磁或射频干扰的敏感性 会给工程师带来重大的风险和安全隐患 尤其是在工业 船用和医疗设备环境 这些环境系统中的控制 导航 监控 通信和警报等关键零部件必须具备电磁抗扰水平 以确保系统始终正常运行 抗扰系统测试方案一般分为传导抗扰与

随机推荐

  • Vue3项目中使用TypeScript

    单文件用法 在单文件组件中使用 TypeScript 需要在 小结 注意 当 script 中使用了 ts 模板 template 在绑定表达式时也支持ts 如果在表达式中不指名类型时 编译器会报警告提示 正确写法 表达式指定类型 组合式A
  • 一文说清楚c++模板Template的用法

    一 引言 模板 Template 指c 程序设计语言中采用类型作为参数的程序设计 二 函数模板 1 通用格式 函数模板定义格式 template
  • Git:同步他人的远程仓库至自己的Git服务器并自动定时更新

    昨天晚上将2015年一篇不负责的Git服务器搭建的教程更新了一下 详见 在CentOS下搭建自己的Git服务器及使用nginx配置gitweb面板 今天折腾了一些本地的项目 倒是可以了 现在的需要是 将远程的仓库 同步一份到自己的git服务
  • C#复习题1(含答案及解析)

    1 单选题 下面有关for循环的正确描述是 A for循环只能用于循环次数已经确定的情况 B for循环的执行流程是先执行循环体语句 后判断表达式 C 在for循环中 表达式1和3可以省略 但表达式2是不能省略 D for循环的循环体中 可
  • JVM黑马版:笔记、应用、速查

    前言 由于工作中时常和JVM打交道 但是对JVM的体系缺乏系统深入了解 日前跟随b站上黑马程序猿的课程成体系地学习了JVM 结合工作中的实践写就了此笔记 黑马原视频地址 https www bilibili com video BV1yE4
  • 无域名家庭异地组网 Headscale +自建 DERP 中继服务器

    参考资料 Headscale 自部署 Tailscale 服务端 泠泫凝的异次元空间 lxnchan cn 20条消息 比 Tailscale 更好的内网穿透方案 Headscale 米开朗基杨的博客 CSDN博客 156条消息 自建 DE
  • Microsoft Access database engine 2010 (Chinese (Simplif... 您不能安装64位版本的Microsoft Access 2010 数据库引擎

    问题 Microsoft Access database engine 2010 Chinese Simplif 您不能安装64位版本的Microsoft Access 2010 数据库引擎 因为您当前已安装32位的offce 产品 若要安
  • Python render_notebook()画图不显示

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 使用jupyter lab画图 render notebook 画图不显示 解决方法 from pyecharts globals import CurrentConfig Note
  • p值小于0.05拒绝还是接受_数据科学20

    1 假设检验 假设检验用来判断样本与样本 样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法 零假设H0 差异是由抽样误差引起的 一般形式是假定参数等于某个固定值 如假设组间差异为0 回归系数为0等 备择假设H1 存在本质差异
  • 伺服电机脉冲控制方式

    伺服电机脉冲控制方式 伺服电机控制方式有脉冲 模拟量和通讯控制这三种 在不同的应用场景下 该如何确定选择伺服电机控制方式 1 伺服电机脉冲控制方式 在一些小型单机设备 选用脉冲控制实现电机的定位 应该是最常见的应用方式 这种控制方式简单 易
  • Django,Flask ,FastAPI 怎么选?

    阅读大约需要 4 5 分钟 首先我们达成一个共识 框架是用来帮助我们提升效率 节省时间 避免处理那些低级细节的 如果能达到这个目标 就是一个合适的框架 选择合适的框架 会事半功倍 Python 领域 开发 Web 应用程序的三个主流框架是
  • 面试准备:Java常见面试题汇总(一)

    面试准备 Java常见面试题汇总 一 面试准备 Java常见面试题汇总 二 面试准备 Java常见面试题汇总 三 文章目录 1 面向对象的特点 特性有哪些 补充 Java的多态是编译时多态还是运行时多态 2 接口和抽象类的相同点和不同点 3
  • cin输入错误类型导致的死循环

    项目场景 温故而知新 C 学习cin函数 循环读取数据 问题描述 cin函数读取到错误的数据类型时 导致跳过之后所有的cin操作 导致陷入死循环 void main while 1 int a 1 cout lt lt 请输入手机号 cin
  • 转:Linq基础学习

    本文为转摘博客园大牛文章之一 原文地址 http www cnblogs com foundation archive 2009 01 05 1369371 html 目录 1 LINQ查询结果集 1 2 System Array 数组 1
  • Density 计算公式

    Density 又称Utilization 计算公式如下 leaf cell 面积跟可用总面积的计算 受多种因素影响 通常leaf cell 包括std cell 跟hard macro 在计算Density 的时候 如果hard macr
  • Promise的UnhandledPromiseRejectionWarning问题

    在封装Nodejs对MySQL的CRUD API的时候遇到了UnhandledPromiseRejectionWarning提示 查询了解到这是Node js 6 6 0中增加的一个特性 对 Promise 中未处理的 rejection
  • 包管理工具详解npm、yarn、cnpm、npx 发布npm包 npm install以及npm uninstall各参数含义 package文件和package-lock文件内常见配置含义

    1 包查找地址 包地址 2 配置文件 创建 文件名不能有中文 必须配置 其他配置 及版本号 3 npm命令 4 yarn 5 cnpm 6 npx 7 package lock json文件 8 npm i 的查找规则 9 如何发布包 1
  • channel-wise卷积--学习笔记

    背景 分组卷积的分组思想会导致channel间的信息阻隔 为了增加分组间的channel信息交流 一般需要添加一个融合层 一般网络最后都使用全局池化和全连接层进行最后的分类 但参数量巨大 可转化为深度可分离卷积 使用固定权重的深度卷积代替全
  • 安全测试基础知识

    软件安全测试是评估和测试系统以发现系统及其数据的安全风险和漏洞的过程 没有通用术语 但出于我们的目的 我们将评估定义为分析和发现漏洞 而不尝试实际利用这些漏洞 我们将测试定义为发现和尝试利用漏洞 安全测试通常根据要测试的漏洞类型或正在执行的
  • 2.4g无线跳频(三)

    2 4g无线跳频 三 一 跳频过程分析 1 主从建立连接 开启定时器 2 对于主机 每个定时周期内 前部分处于发送模式 后部分处于接收模式 对于从机 每个定时周期内 前部分处于接收模式 后部分处于发送模式 发送时间应安排小于接收时间 3 主