本博客是在I_Still_love_you作者的《NRF24l01一对一通信、多对一(一对六、六发一收)通信最终解决办法。亲测好用。》的改进方案:因为如果多对一一直发的话容易抢频道。没学过的朋友可以先去学习一下!!!!!
本文链接:NRF24l01一对一通信、多对一(一对六、六发一收)通信最终解决办法。亲测好用。_nrf24l01可以一对多少个-CSDN博客
1. 简介
使用NRF24L01是 nordic 的无线通信芯片,它具有以下特点:
1) 2.4G 全球开放的 ISM 频段(2.400 - 2.4835GHz),免许可证;
2)最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强;
3) 125 个可选的频道,满足多点通信和调频通信的需要;
4)内置 CRC 检错和点对多点的通信地址控制;
5)低工作电压(1.9~3.6V),待机模式下状态为 26uA;掉电模式下为 900nA;
6)可设置自动应答,确保数据可靠传输;
7)工作于EnhancedShockBurst 具有Automatic packet handling,Auto packet transaction handling ,可以实现点对点或是 1 对 6 的无线通信,速度可以达到 2M(bps),具有可选的内置包应答机制,极大的降低丢包率。
8)通过 SPI 总线与单片机进行交互,最大通信速率为10Mbps;
1.1 结构框图
如图右侧为六个控制和数据信号,分别为 CSN、 SCK、 MISO、 MOSI、 IRQ、 CE。
版权声明:本文为CSDN博主「霁风AI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wwt18811707971/article/details/82949243
1.2 NRF24L01引脚分布以及作用
1.2初始化24l01大致步骤
要控制模块需要使用“SPI”接口
C8T6有两个SPI,根据情况来选择对应的端口
NSS引脚可以不用.
2. NRF24L01一对多通讯。
1.接收端程序
通过改变通讯频率的方法来进行通讯来解决多对一通信时通道拥挤的问题。
1.通道配置
void NRF24L01_RT_Init(void)
{
u16 a,b;
W_CE(0);
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);
//写RX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);
//写RX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,1);
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//写RX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS3,1);//写RX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P4,(u8*)RX_ADDRESS4,1);//写RX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P5,(u8*)RX_ADDRESS5,1);//写RX节点地址
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);//使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,pl); //设置RF通信频率
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);
//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
W_CE(1);//CE为高,进入接收模式
pl++;
if(pl>1)//频率在0——1之间来回切换
{
Delay_ms(1);
pl=0;//频率清零
}
}
2.接收程序
每一个数据都是放进rxbuf_1——6的数组里的所以要六个数组。
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&RX_OK)//接收到数据
{
switch((sta >> 1) & 0x07)
{
case 0x00:NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf_1,RX_PLOAD_WIDTH);//读取数据
break;
case 0x01: NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf_2,RX_PLOAD_WIDTH);
break;
case 0x02: NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf_3,RX_PLOAD_WIDTH);
break;
case 0x03:NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf_4,RX_PLOAD_WIDTH);//读取数据
break;
case 0x04: NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf_5,RX_PLOAD_WIDTH);
break;
case 0x05: NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf_6,RX_PLOAD_WIDTH);
break;
default: ;
break;
}
NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
return 0;
}
return 1;//没收到任何数据
}
2.发送端程序
发送端一的配置:
设置为通道为0的频率(他原本就是2.4GHZ的通讯频率)。
void NRF24L01_RT_Init(void)
{
W_CE(0);
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS2,TX_ADR_WIDTH);
//写TX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS2,RX_ADR_WIDTH);
//设置TX节点地址,主要为了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);
//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,0); //设置RF通道为0
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);
//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
W_CE(1);
}
发送端二的配置:
只需将通信的频率修改即可。设置为通道为1的频率(2.4GHZ+0.01HZ)。
void NRF24L01_RT_Init(void)
{
W_CE(0);
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS2,TX_ADR_WIDTH);
//写TX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS2,RX_ADR_WIDTH);
//设置TX节点地址,主要为了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);
//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,1); //设置RF通道为1
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);
//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
W_CE(1);
}