最近的项目用到了NRF芯片,进过几天的奋战总算是将所有的坑都填满了。
--------------------------------------------------------华丽的分割线(以下介绍NRF特性)---------------------------------------------------------------------
主要特性
工作在 2.4GHz ISM 频段
调制方式:GFSK/FSK
数据速率:2Mbps/1Mbps/250Kbps
超低关断功耗:<0.7uA
超低待机功耗:<15uA
快速启动时间: <130uS
内部集成高 PSRR LDO
宽电源电压范围:1.9-3.6V
数字 IO 电压: 3.3V/5V
低成本晶振:16MHz±60ppm
接收灵敏度:<-83dBm @2MHz
最高发射功率:7dBm
接收电流(2Mbps):<15mA
发射电流(2Mbps):<12mA(0dBm)
10MHz 四线 SPI 模块
内部集成智能 ARQ 基带协议引擎
收发数据硬件中断输出
支持 1bit RSSI 输出
极少外围器件,降低系统应用成本
QFN20 封装或 COB 封装
--------------------------------------------------------华丽的分割线(以下介绍NRF通信时序)---------------------------------------------------------------
注意:C代表了命令,S表示寄存器值,D表示数据
写数据:SPI写命令+寄存器地址----->SPI写入数据
读数据:SPI写寄存器地址(可以使用读命令+寄存器地址)----->SPI读取数据
不论是读取或者写入数据,甚至是读/写len长度的数据都要先写寄存器地址;
--------------------------------------------------------华丽的分割线(以下介绍NRF工作模式)---------------------------------------------------------------
总的来说时候就三个模式:
1.待机模式
2.发送模式
3.接受模式
具体各个模式介绍参考数据手册。。。
--------------------------------------------------------华丽的分割线(以下介绍NRF发送数据格式)---------------------------------------------------------
nrf发送数据是以包来发送。
其中前导码和CRC不用管。具体我们来看看中间三部分:
地址:
地址也就是接收到通道的地址,如果是能了自动应答,那么我们得将发送地址(TX_ADDR) 和
接受应答信号的通道地址(RX_ADDR_P0)设置为一样的。
地址这里必须搞清楚:
发送流程:发送方根据发送地址(TX_ADDR)发送到接收方(RX_ADDR_P0)接收方收到数据后以接收通道的地址(RX_ADDR_P0)为发送地址发送应答信号给发送方(这个应答信号为自动发送不需要人为发送)。
例如:发送方TX_ADDR=0x10=接收方接收通道地址(以通道0为例:RX_ADDR_P0)=发送端接收通道地址(以通道0为例:RX_ADDR_P0), 总的来说就是接受方发送地址和接受应答信号的通道地址和接受方地址要一致。
多机组网只需要使能接收方全部通道并且分配好地址就ok了。
对于地址的分配要注意:
通道0和通道1的地址为5字节可随意给值。
其他2~5高4字节与通道1高四字节相同(通用高4字节)我们只能修改他的左后一个字节地址
例如:
const u8 RX0_ADDRESS[5]={0x10,0x10,0x10,0x10,0xAA}; //接收地址
const u8 RX1_ADDRESS[5]={0x11,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX2_ADDRESS[5]={0x12,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX3_ADDRESS[5]={0x13,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX4_ADDRESS[5]={0x14,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX5_ADDRESS[5]={0x15}; //接收地址
其实有数据手册我们知道同道1有40位同道2只有8位所以我们在给同道2~5定义地址的时候可以定义为一个字节(上述通道5)亦可以为了统一定义为5字节(通道2~4)但是要注意:定义为5字节也好1字节也好我们在配置模式的时候通道2~5在写入地址的时候自能写入1字节而不能写入5字节(会该导致接收不到数据-------这时刻巨坑)
对于包控制字:
这一部分主要是在配置模式的时候配置相应寄存器即可。
负载数据:
nrf有两个32字节的fifo寄存器用来存放负载数据的
发送负载数据寄存器:W_TX_PAYLOAD(也就是命令,本人习惯叫他寄存器)
接收负载数据寄存器:R_RX_PAYLOAD(也就是命令,本人习惯叫他寄存器)
发送/接收数据过程:配置好模式-----发送/接收数据都是对W_TX_PAYLOAD/R_RX_PAYLOAD寄存器进行读写完成数据的发送。
发送/接收完成都会产生中断,IRQ会输出低电平(原先为高电平,重点)
注意:博主在通过IRQ中断收发数据过程中遇到stm32io配置为上拉输入和IRQ引脚连接会导致有的时候进入不了中断
原因:IRQ的下拉能力太弱了会被io控偶的上拉电阻强制拉高,也就是说产生IRQ中断由于上拉电阻影响IRQ回一直置高(巨坑)。
补救方法:将io配合为浮空输入即可完美解决。。。。。
查阅资料得到:
通道0具有接收和发送能力,然而其他2~5智能接收(重点)
--------------------------------------------------------华丽的分割线(以下介绍NRF配置过程)---------------------------------------------------------
模式配置(在配置模式的时候完成地址的配置和字段字的配置):
发送模式:
1.写入发送地址和接受应答通道地址
2.使能应答通道
3.使能接收地址
4.设置自动重发时间和重发次数
5.设置通信频道
6.设置发射参数(功率,增益等)
7.设置模式(发送还是接受)
注意在配置发送或者接受时候要先让其工作再待机模式即CE要先置0.
接受模式:
1.接收通道地址
2.接收通道有效数据宽度
3.使能通道自动应答
4.使能接受通道地址
5.设置通信频道
6.设置参数
7.配置工作模式
数据的发送和接受:
发送一包数据:
1.向fifo中写入数据,等待IRQ发送完成中断
2.读取状态寄存器中的值
3.将读取到的状态寄存器中的值写入状态寄存器
4,.判断之前读取到的状态寄存器中得值判断是发送完成还是发送失败
5.清空fifo寄存器
读取一包数据:
1.读取状态寄存器中的值
2.将读取到的状态寄存器中的值写入状态寄存器
4.判断状态寄存器中得值,是否接受成功(成功就读取fifo中的数据,并且清空fifo)
总结:通信成功三个相同
1.发送接收应答地址相同(包括应答地址)
2.发送接收频道相同(信道)
3.发送接收频率相同
注意:这个芯片不光能以2.4Ghz的载波发射呢,它的带宽为2.4G----2.512G呢。这中间有一百多M的频带,可以划分成2M一个的信道。这个寄存器中的值就标明你想工作在哪个信道上啦,只有设置为同频的设备才能接收的到很容易理解吧。比如你设为10信道,则10*2=20M即发送时所用的载波频率就是2400+20=2420MHz。当然也只有设为2420M的接收设备才能接收的到了。
转载请标明原贴出处:https://blog.csdn.net/zj490044512
要源码可联系博主