希望通过两个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 – Register :DR 标志位,当发送完一个完整的数据包(数据包的格式见下图)时或者接收到一个有效的数据包时,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:设置目标设备的的地址,