【无线通信开发应用】nRF905数据手册深度解读

news2024/11/17 14:19:20

希望通过两个stm32、两个nRF905无线通信模块、串口来实现两机通信。具体功能为:

板子A、B分别包含一个stm32单片机和一个nRF905无线模块,欲实现板子A、B之间的通信。
其中,PC端串口助手可向板子A的stm32发送字符‘A’控制板子B上的LED亮灯,发送字符‘B’控制板B的LED熄灭;
同样地,可通过按下板B的按键向板A发送一段字符。

但是网络上鲜有NRF905模块的深层解读,故引出此文,主要解读NRF905的官方英文文档,以及部分重要的库函数封装,不涉及功能逻辑,不上传整个工程。
以下为文档的Git地址:NRF905相关文档下载地址


文章目录

  • 一、功能原理
  • 二、一些函数的封装

一、功能原理

在这里插入图片描述

首先看引脚定义,作为一个集成化的模块,我们需要像关注黑盒模型那样关注它的输入、输出的格式即可。
(1) 需要重点关注的是图中红框的部分:

TRX_CE:芯片收/发的使能
CD:	载波检测
AM:	地址匹配
TX_EN:	发送/接收使能

其中,TRX_CE 和 TX_EN 都为输入,需要 MCU 对其写入高低电平来控制 NRF905 的发送、接收模式的启动与否。CD 和 AM 都为输出,用来告诉 MCU “我检测到了空中跟我有相同载波频率的发送器了,并且它发过来的数据包也是发给我的(通过地址判断)”,主要是在接收模式下使用。
关于它们四个的具体解释如下:

  • NRF905 的工作模式
    在这里插入图片描述
    总的来说,在Power使能状态下,TRX_CE 和 TX_EN 共同控制 NRF905 的工作模式。
    在模块发送之前,需要将数据包写入到模块中,这需要通过SPI编程,故此需要将 TRX_CE 拉低;
    将 TRX_CE 和 TX_EN 都置1则设置为发送模式;
    将 TX_EN 拉低,设置为接收模式。

另外,工作模式的转换还需要遵守规定。 从待机模式切换到接收或发送模式都需要延迟一个650us的时间,这样才能够保证数据包被成功接收/发送。
在这里插入图片描述

(2)需要关注绿框中的几个引脚,它们是模块与 MCU通信的桥梁。
在这里插入图片描述
模块通过

MOSI:	主机发送从机接收
MISO:	从机发送主机接收
SCK:	SPI 通信的时钟线
SCN:	SPI的使能位,置0为使能

与 MCU 进行通信。置于 SPI 的使用时序,数据手册里也有所提及,在Figure 6. 到 Figure 8,不再展示。

那么 MCU 具体是如何通过 SPI 总线与 NRF905 进行通信的呢? 发送的频率、功率、目标设备的地址、数据信息都是写入到 NRF905 的哪里呢?

模块包含有五个内部寄存器,每个寄存器有各自的功能。
在这里插入图片描述
在这里插入图片描述
五个寄存器具体的作用:

  • Status – RegisterDR 标志位,当发送完一个完整的数据包(数据包的格式见下图)时或者接收到一个有效的数据包时,DR标志位置一;AM 标志位,接收模式下,当CD标志位置一后检查数据包中的地址是否和寄存器初始化时设置的本设备地址号一致,如果一致则AM标志位置一。(具体的描述见 数据手册-12 nRF905 features)
    在这里插入图片描述
    数据包中的 ADDR 和 PAYLOAD 是我们需要写入的,但是在真正发送之前,前导码和循环冗余校验会自动生成一并发送。

  • RF – Configuration Register :收发器的初始化配置,包括频率、输出功率、设备ID等。(具体的配置见下表)
    配置时需按照下表来写 RF配置寄存器的这10个字节,至于每位代表的含义需要搭配表15使用。在这里插入图片描述在这里插入图片描述
    先来大概看一下,我们需要结合Byte0和Byte1来设置发送频率、输出功率,需要Byte2来设置发送地址、接收地址的宽度,Byte5-8用来设置设备ID,最后的Byte9用来设置CRC模式等等。具体的配置待下文书写。

  • TX – Address:设置目标设备的的地址,也就是数据包中的ADDR。具体为多少个字节要在RF配置寄存器中设置。

  • TX – Payload:用来存放具体的发送信息了,具体为多少个字节要在RF配置寄存器中设置。

  • RX – Payload:用来存放具体的接收信息了,具体为多少个字节要在RF配置寄存器中设置。

现在我们知道了MCU通过SPI总线与模块的具体哪些寄存器进行读/写操作。在对具体的寄存器进行读/写操作之前,需要先发送SPI指令。

在这里插入图片描述
主要是用到三个指令:

  • WC指令。写RF配置寄存器,所以我们需要通过SPI总线写入0x00(从0位置开始)
  • WTA指令。向TX-ADDR寄存器写入目标设备的地址,需要SPI写入0x22.
  • RRP指令。读取RX-payload寄存器,接收到的有效数据包就存在这里面。需要SPI写入0x24.

二、一些函数的封装

  1. SPI写一个字节
    根据SPI时序来就好。
    在SCK低电平时,将一位数据通过MOSI放入,在SCK高电平时读取MOSI上的一位数据。经过循环移位,可以读取到一个字节的数据。
    void NRF905_SPI_Write_Byte(uint8_t data)
    {
    	for (uint8_t i=0; i<8; i++)
    	{
    		if (data & (0x80 << i))				
    		{
    			NRF905_MOSI_H; // 已宏定义,表示释放MOSI线。以下宏定义均同理
    		}
    		else
    		{
    			NRF905_MOSI_L; // 拉低MOSI线
    		}
    		NRF905_SCK_H; // 释放SCK线
    		NRF905_SCK_L; // 拉低SCK线
    	}
    }
    
  2. 写 RF – Configuration Register 配置寄存器
    上一章节中提到,配置寄存器总共有10个字节,我们一个个来看。
    在这里插入图片描述
    每一个字节都需要搭配着查找 Table 15. Configuration register description 来使用。
  • 写Byte0
    在这里插入图片描述
    查找表15,可以看到九位CH_NO加上一个HFREQ_PLL位共同才能决定工作频率。具体的频率需要查找表24:
    在这里插入图片描述
    可以看到,欲使得工作频率为433MHz,需CH_NO[7:0]=[01001100]=0x4c,CH_NO[8]=0,HFREQ_PLL=0,而这后两位都属于Byte1.
    总之,Byte0= 0x4c。
  • Byte1

在这里插入图片描述
bit[7:6]=00,AUTO_RETRAN=0(不自动重发),RX_RED_PWR=0(普通模式),PA_PWR=11(+10dBm),HFREQ_PLL=0,CH_NO[8]=0。因此,Byte1=00001100=0x0c。

  • Byte2
    在这里插入图片描述

bit[7]=0,TX_AFW[2:0]=100,bit[3]=0,RX_AFW[2:0]=100。因此,Byte2=01000100=0x44.

  • Byte3
    在这里插入图片描述
    bit[7:6]=0, RX_PW[5:0]=100000(32个字节的接收Buffer)。因此,Byte3=00100000=0x20.

  • Byte4
    在这里插入图片描述
    bit[7:6]=0, TX_PW[5:0]=100000(32字节的发送数据包)。因此,Byte4=00100000=0x20.

  • Byte5~Byte8
    4个字节从高到低来写设备ID。

  • Byte9
    CRC_MODE=0(8位CRC校验位),CRC_EN=1(开启CRC校验), XOF[2:0]=011(外部晶振频率16MHz), UP_CLK_EN=0,UP_CLK_FREQ[1:0]=00(输出时频)。因此,Byte9=0101 1000=0x58.

    /* 配置RF – Configuration Register */
    void NRF905_Config(void)
    {
    	NRF905_CSN_ENABLE; // 已宏定义,使能SPI
    	NRF905_SPI_Write_Byte(WC); // SPI指令
    	/*
    	* 将配置寄存器的10个字节依次写入,代码省略
    	*/
    	NRF905_CSN_DISABLE; // 失能SPI
    }
    
  1. 写要发送的数据包
    在这里插入图片描述
    根据这个流程图来,首先将TX_EN置一、TRX_CE置零,然后通过SPI总线向TX – Address写入目标地址、向TX – Payload写入32个字节的数据,随后将TRX_CE置一,设置NRF905为发送模式。之后会根据配置寄存器的设置自动生成CRC和前导码,从而组成一个完成发送数据包。
    /*
    *	NRF905在一般状态下长时间处于接收模式,当中断事件发生,方在回调函数中发送数据包。
    */
    void SendPacket(uint32_t TxBuffer)
    {
    	NRF905_TX_EN_H;
    	NRF905_TRX_CE_L;
    	delay_us(650); // 从待机模式切换到发送模式,需要650us
    	NRF905_CSN_ENABLE;
    	NRF905_SPI_Write_Byte(WTP); // Write TX-payload
    	for (uint8_t i = 0; i < 32; i++)
    	{
    		NRF905_SPI_Write_Byte(TxBuffer[i]); // 写入数据
    	}
    	NRF905_SPI_Write_Byte(WTA); 
    	for (uint8_t i = 0; i < 4; i++)
    	{
    		NRF905_SPI_Write_Byte(RF_Config[i + 5]); // 写入目标地址
    	}
    	NRF905_CSN_DISABLE;
    	NRF905_TRX_CE_H; //开启发送模式
    	
    	/*
    	*	延时至少10us(根据Data rate,见Figure 9.TX timing)
    	*/
    	NRF905_TRX_CE_L;
    }
    
  2. 接收一个数据包
    在这里插入图片描述
    根据流程图,保证TX_EN为低,将TRX_CE置一,接收器开始检测目标频率,一旦检测到则CD标志位置一,随后再检查数据包中的ADDR与自身设备ID是否一致,一致的话AM标志位置一,对接收的数据包进行循环冗余校验,如果是有效信息则DR数据位置一。
    int main(void)
    {
    /* 许多初始化,省略。 */
    	NRF905_Config(); // 写RF配置寄存器,对NRF905进行初始化
    	NRF905_TX_EN_L;
    	NRF905_TRX_CE_H;
    	delay_us(650);
    	
    	while(1)
    	{
    		if(!binarySignal) // 一个二值信号量,常为0,当中断事件发生时变为1
    		{
    			while(!(CD_ifH() & AM_ifH())) // CD标志位和AM标志位都置1
    			{
    				delay_ms(100);
    				NRF905_TX_EN_L;
    				NRF905_TRX_CE_H;
    			}
    			ReceivePacket(RxBuffer);
    			
    			/* 处理逻辑 */
    			
    		}
    	}
    }
    
    void ReceivePacket(uint32_t RxBuffer)
    {
    	NRF905_CSN_ENABLE;
    	NRF905_TRX_CE_L;
    	NRF905_SPI_Write_Byte(RRP); // Read RX-payload
    	for (uint8_t i = 0; i < 32; i++)
    	{
    		RxBuffer[i] = NRF905_SPI_Read_Byte();
    	}
    
    	NRF905_CSN_DISABLE;
    	NRF905_TRX_CE_L;
    }
    

本文的目的在于掌握阅读数据手册的能力,张贴的代码中包含许多伪代码,故而不能直接运行。此次阅读完英文数据手册,只觉层层递进、环环相扣、逻辑清晰。

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

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

相关文章

算法系列--多源BFS问题

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–多源BFS问题 大家好,今天为大家带来的是算法系列--多源BFS问题 前言: 之前我们已经学习过单源的最短路问…

质谱原理与仪器3-笔记

质谱原理与仪器3-笔记 一、质量分析器类型1、聚焦磁场分析器&#xff1a;A、单聚焦磁场分析器B、双聚焦磁场分析器 2、四极杆质量分析器3、飞行时间质谱仪(Time of Flight MS, TOF-MS)4、离子阱质量分析器 二、质谱仪的主要性能指标1、质量范围(mass range)2、分辨率(resolutio…

面试经典150题——Z 字形变换

面试经典150题 day22 题目来源我的题解方法一 使用StringBuilder数组模拟矩阵方法二 找规律直接构造 题目来源 力扣每日一题&#xff1b;题序&#xff1a;6 我的题解 方法一 使用StringBuilder数组模拟矩阵 如果numRows是1&#xff0c;则直接返回s。 否则&#xff0c;创建nu…

python实现的基于单向循环链表插入排序

相比于定义一个循环双向链表来实现插入排序来说&#xff0c;下面的实现采用一个单向循环链表来实现&#xff0c;并且不需要定义一个单向循环链表类&#xff0c;而是把一个list&#xff08;数组/顺序表&#xff09;当成单向循环链表来用&#xff0c;list的元素是一个包含两个元素…

26.统一网关Gateway

网关的功能 1.身份认证&#xff0c;权限的校验。 2.服务的路由&#xff0c;负载均衡。用户请求被分配到哪一个微服务。一个微服务可以有多个实例&#xff0c;所以使用负载均衡。 3.请求限流。 springcloud网关实现有两种&#xff1a;gateway, zuul zuul是基于servlet实现的…

Enhancing Diffusion——利用三维透视几何约束增强扩散模型

概述 透视在艺术中被广泛研究&#xff0c;但现代高质量图像生成方法却缺乏透视精度。新的生成模型引入了几何约束&#xff0c;通过训练过程提高透视精度。这样可以生成更逼真的图像&#xff0c;并提高相关深度估计模型的性能。 最近的图像生成技术使研究人员能够创造性地进行…

TCP/IP和HTTP协议

TCP/IP OSI 七层模型在提出时的出发点是基于标准化的考虑&#xff0c;而没有考虑到具体的市场需求&#xff0c;使得该模型结构复杂&#xff0c;部分功能冗余&#xff0c;因而完全实现 OSI 参考模型的系统不多。而 TCP/IP 参考模型直接面向市场需求&#xff0c;实现起来也比较…

App一键直达,Xinstall助力提升用户体验

在这个移动互联网时代&#xff0c;App已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;每当我们在浏览器或社交平台上看到一个有趣的App推荐&#xff0c;点击下载后却往往要经历一系列繁琐的跳转和确认过程&#xff0c;这无疑大大降低了用户体验。那么&#xff0c;…

工业三废数据集(工业烟粉尘排放量、工业二氧化硫排放量、工业废水排放量)2006-2021年

01、数据介绍 工业三废是指工业生产过程中排出的废气、废水和废渣 工业二氧化硫排放量指企业在燃料燃烧和生产工艺过程中排入大气的二氧化硫数量。 工业烟粉尘排放量是指企业在生产工艺过程中排放的烟尘和粉尘等颗粒物重量。 工业废水排放量是指企业在生产过程中产生的废水…

GPG的使用

这里写自定义目录标题 安装加密程序生成加密密钥怎么备份自己的密钥就可以使用公钥加密邮件信息了 安装加密程序 下载gpg4win&#xff1a; https://www.gpg4win.org/index.html 免费的&#xff0c;如果使用的是苹果电脑&#xff0c;使用https://gpgtools.org/。 如果是linux&a…

Go Web 开发基础【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

uniapp微信小程序开发踩坑日记:由于图表数据渲染不出来,我第一次在项目中用watch函数监听数据变化

一、发现问题 在我们团队自己开发的微信小程序中&#xff0c;引入了Echarts图表库 然后突然有一天&#xff0c;后端队友反应图表渲染有问题。后面我去试了一下&#xff0c;确实20次里面必有一次数据渲染不出来 断定代码没问题&#xff0c;于是我们将其鉴定为玄学 二、问题原因…

笔记本无线网络共享给有线使用

1.鼠标右击wifi图标选择打开网络和Internet设置 2.选择WLAN项&#xff0c;点击进入更改适配器选项 3.进入到以下界面&#xff0c;右击以太网选择启动&#xff08;不确定的话可以在设备管理器查看网卡&#xff09; 4.右击WLAN选项&#xff0c;点击属性 5.点击共享&#xff0…

日期类的实现,const成员

目录 一&#xff1a;日期类实现 二&#xff1a;const成员 三&#xff1a;取地址及const取地址操作符重载 一&#xff1a;日期类实现 //头文件#include <iostream> using namespace std;class Date {friend ostream& operator<<(ostream& out, const Dat…

AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

大连宇都环境 | 成都5月水科技大会暨技术装备成果展览会

中华环保联合会水环境治理专业委员会 秘书处 王小雅 13718793867 —— 展位号&#xff1a;A09 —— 一、企业介绍 大连宇都环境成立于2002年&#xff0c;公司20年 MBBR填料产品及工艺技术&#xff0c;&#xff0c;构建了研发、制造、设计、工程、运营链式服务能力&#xff…

CGAL 点云数据生成DSM、DTM、等高线和数据分类

原文链接 CGAL 点云数据生成DSM、DTM、等高线和数据分类 - 知乎 在GIS应用软件中使用的许多传感器(如激光雷达)都会产生密集的点云。这类应用软件通常利用更高级的数据结构&#xff1a;如&#xff1a;不规则三角格网 (TIN)是生成数字高程模型 (DEM) 的基础&#xff0c;也可以利…

docker系列8:容器卷挂载(上)

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

1.初探MPI——MPI简介

系列文章目录 初探MPI——MPI简介初探MPI——点对点通信初探MPI——集体通信 文章目录 系列文章目录前言一、MPI_COMM_WORLD, size and ranks二、Hello WorldInstructions 总结参考 前言 Message Passing Interface (MPI) 是一种标准化的消息传递库接口规范。该标准是消息传递…