本文为博主学习NRF24L01的一些理解以及对相应代码的详细解释,文章参考了《NRF24L01中文说明书》。如有错误,欢迎大家指出。
一.发送模式初始化:
初始化代码:
void NRF24L01_Init(void){
W_CE(0); //拉低CE
W_Buf(NRF_WRITE_REG+TX_ADDR,T_ADDR,5);//配置发送通道TX的地址
W_Buf( NRF_WRITE_REG+ RX_ADDR_P0,R_ADDR,5); //配置接收通道0地址
W_Reg( NRF_WRITE_REG+CONFIG,0x0E); //配置成发送模式(最后一位为0)
W_Reg( NRF_WRITE_REG+EN_AA,0x01);//开启接收通道0自动应答
W_Reg( NRF_WRITE_REG+RF_CH,0x00);//配置通信频率2.4G
W_Reg(NRF_WRITE_REG+RF_SETUP,0x1a);//配置发送的参数
W_Reg( NRF_WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
W_Reg( NRF_WRITE_REG+SETUP_RETR,0x1A);//配置自动重发(580us重发间隔,重复10次)
W_CE(1);//拉高CE
}
1.拉低CE(写寄存器之前一定要进入待机模式或掉电模式)
2.配置发送通道地址
3.配置接收通道0的地址:
用来接收应答信号,地址与发送端地址(TX_ADDR)相同
4.配置为发送模式:
写配置寄存器(CONFIG),位0(PRIM_RX)写0即为发送模式
5.开启接收通道0自动应答:
在自动应答模式使能的情况下,收到有效的数据包后,系统将进入发送模式并发送确认信号。发送完
确认信号后,系统进入正常工作模式(工作模式由PRIM RX位和CE引脚决定)。
6.设置发送频率:
频率 =2400+RF_CH /Mhz
设置为0x00,则发送频率为2.4GHZ
7.配置TX发送的参数
8.配置自动重发
自动重发功能是针对自动应答系统的发送方。
SETUP_RETR 寄存器设置:启动重发数据的时间长度。
在每次发送结束后系统都会进入接收模式并在设定的时间范围内等待应答信号。接收到应答信号后,系统转入正常发送模式。
如果TX FIFO中没有待发送的数据且CE脚电平为低,则系统将进入待机模式。
如果没有收到确认信号,则系统返回到发送模式并重发数据直到收到确认信号或重发次数超过设定值(达到最大的重发次数)。
有新的数据发送或PRIM_RX寄存器配置改变时丢包计数器复位
9.拉高CE
二.发送流程:
发送操作代码:
uint8_t SendData(uint8_t *Buf)
{
uint8_t Status;
W_CE(0); //写寄存器要处于待机状态或掉电状态
W_Buf(WR_TX_PLOAD,Buf,2); //向TX写入有效数据,Buf为数据数组名,2为长度(单位字节)
W_CE(1); //拉高CE开始发送
while(R_IRQ()==1);//等待中断
Status =R_Reg(NRF_READ_REG+STATUS); //读取状态寄存器的值
if(Status&0x10) //当发送达到最大次数
{
W_Reg(FLUSH_TX,NOP);//清除TX Fifo寄存器
W_Reg(NRF_WRITE_REG+STATUS,Status); //清除中断
return 3;
}
else if(Status&0x20) //当发送成功,接收到应答信号
{
W_Reg(NRF_WRITE_REG+STATUS,Status); //清除中断
return 2;
}
else return 1;
}
1.拉低CE(写寄存器之前一定要进入待机模式或掉电模式)
2.写TX有效数据:
使用了寄存器操作指令 WR_TX_PLOAD,将要发送的数据写入TX_PLD。
(当 MCU 有数据要发送时,接收节点地址(TX_ADDR)和有效数据(TX_PLD)通过 SPI接口写入
nRF24L01。发送数据的长度以字节计数从MCU写入TX FIFO )
3.拉高CE:
启动发送。CE 高电平持续时间最小为10us。
4.等待中断:
IRQ(中断引脚)为低电平触发,当状态寄存器中TX_DS ,RX_DR或MAX_RT为高时触发中断。
5.读取状态寄存器(STATUS)的值并进行判断: