打印
[范例教程]

单片机驱动nrf24l01

[复制链接]
2820|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
janewood|  楼主 | 2023-11-18 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


要想24L01多通道通讯成功,务必先单通道调试成功,并且懂得这块芯片通讯的一些基本知识。

一、基本的通讯条件
1、接收端的接收地址(RX_ADDR_Px)等于发射端的发射送地址(TX_ADDR)
2、收发端的频道一致(RF_CH)
3、收发端的发射参数一致(RF_SETUP)

二、收发模式初始化的基本步骤
Rx端初始化步骤:
1)写 Rx 节点的地址 RX_ADDR_Px
2)使能 AUTO ACK  EN_AA
3)使能通道的接收地址 EN_RXADDR
4)选择通信频率 RF_CH
5 ) 选择通道有效数据宽度  Rx_Pw_Px
6)配置发射参数(低噪放大器增益、发射功率、无线速率)  RF_SETUP
7)配置 24L01 的基本参数以及切换工作模式 CONFIG
Tx端初始化步骤:
1)写 Tx 节点的地址 TX_ADDR
2)写 RX通道P0 的地址 用ACK应答 RX_ADDR_P0
3)使能自动应答 EN_AA
4)使能通道接收地址 EN_RXADDR
5)配置自动重发次数 SETUP_RETR
6)选择通信频率 RF_CH
7)配置发射参数(低噪放大器增益、发射功率、无线速率)  RF_SETUP
8 ) 选择通道有效数据宽度  Rx_Pw_Px
9)配置 24L01 的基本参数以及切换工作模式 CONFIG

三、多通道通讯关键代码
接收端:

const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
//使用通道0和1通讯接收模式
//设置RX地址,写RX数据宽度,选择RF频道
//当CE变高后,即进入RX模式,并可以接收数据了
void NRF24L01_RX_Mode(void)
{
    NRF24L01_CE=0;   
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//写P0的Rx节点地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写P1的Rx节点地址

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);    //使能所有通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);//使能所有通道的接收地址  
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //设置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);//选择通道1的有效数据宽度      
    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,接收模式
    NRF24L01_CE = 1; //CE为高,进入接收模式
    delay_us(130);
}   1234567891011121314151617181920212223
发送端0:

const u8 TX_ADDRESS0[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x00}; //发送地址

//**发送端0初始化代码,使用通道0进行通讯:**
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道
void NRF24L01_TX_Mode(void)
{                                                      
    NRF24L01_CE=0;     
    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS0,TX_ADR_WIDTH);//写TX节点地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS0,RX_ADR_WIDTH); //设置RX_ADDR_P0的地址,为了使能ACK
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能所有通道自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址
    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
    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,接收模式,开启所有中断
    NRF24L01_CE=1;//CE为高,10us后启动发送
    delay_us(10);
}123456789101112131415161718192021
发送端1:

const u8 TX_ADDRESS1[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x01}; //发送地址
//**发送端1初始化代码,使用通道1进行通讯:**
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道
void NRF24L01_TX_Mode(void)
{                                                      
    NRF24L01_CE=0;     
    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS1,TX_ADR_WIDTH);//写TX节点地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS1,RX_ADR_WIDTH); //设置RX_ADDR_P0的地址,为了使能ACK   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能所有通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址
    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
    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,接收模式,开启所有中断
    NRF24L01_CE=1;//CE为高,10us后启动发送
    delay_us(10);
}1234567891011121314151617181920

四、多通道通讯关键点
1、发送端数据通道0被用做接收应答信号,因此不同通道发射端都要必须使能RX_ADDR_P0,因此需要把发送端地址写入里面。(当然除非关掉应答)
2、使能第N个​的通道,前N个通道也必须被使能。
3、2~5通道与通道1共用高32位(4字节)地址,只有低8位(1字节)可以改变,且绝不能一样,如下:

const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
const u8 RX_ADDRESS2[] = {0x02,0xff,0xff,0xff,0x01};//通道2地址
const u8 RX_ADDRESS3[] = {0x03,0xff,0xff,0xff,0x01};//通道3地址
const u8 RX_ADDRESS4[] = {0x04,0xff,0xff,0xff,0x01};//通道4地址
const u8 RX_ADDRESS5[] = {0x05,0xff,0xff,0xff,0x01};//通道5地址123456
PS:如果地址宽度是2(16位),那么高8位(1字节)共用,低8位(1字节)不同。
4、接收端写各通道地址时候,必须先从低通道(通道0开始)开始写,使能地址宽度也是。


使用特权

评论回复
沙发
hudi008| | 2024-5-3 17:57 | 只看该作者
在单片机的IO口与NRF24L01模块接口之间应串联一个1KΩ的电阻,以实现电平匹配。

使用特权

评论回复
板凳
caigang13| | 2024-5-4 08:38 | 只看该作者
现在还有用这个无线芯片的吗?感觉现在这颗芯片性价比不高了。

使用特权

评论回复
地板
ingramward| | 2024-5-4 17:31 | 只看该作者
在使用nRF24L01模块之前,需要通过SPI接口配置其内部寄存器。了解每个寄存器的功能和作用,并根据实际需求进行配置。

使用特权

评论回复
5
chenjun89| | 2024-5-5 20:04 | 只看该作者
这颗片子已经很老了,现在可以选择的无线通信芯片很多。

使用特权

评论回复
6
weifeng90| | 2024-5-6 07:56 | 只看该作者
这颗2.4G无线芯片确实很经典了,读书时就用的这个。

使用特权

评论回复
7
abotomson| | 2024-5-6 15:45 | 只看该作者
如果单片机需要在接收到数据时通过外部中断触发,需要正确配置NRF24L01模块的IRQ引脚,并在单片机中配置相应的中断服务程序。

使用特权

评论回复
8
kmzuaz| | 2024-5-7 09:03 | 只看该作者
NRF24L01模块在通信过程中有严格的时序要求,特别是在写入和读取数据时,需要确保单片机的SPI时序满足模块的要求。

使用特权

评论回复
9
burgessmaggie| | 2024-5-7 10:28 | 只看该作者
如果单片机带有硬件SPI接口,应正确配置SPI外设来驱动NRF24L01。如果没有硬件SPI接口,可以使用IO口模拟SPI时序进行通信。在初始化SPI时,需要设置空闲状态SCK为低电平,CPOL=0,数据在时钟的第一个边沿采集,CPHA=0。

使用特权

评论回复
10
earlmax| | 2024-5-7 16:45 | 只看该作者
NRF24L01模块使用4线SPI通信,主机(通常是单片机)负责提供时钟信号,从机(NRF24L01)负责提供数据

使用特权

评论回复
11
tifmill| | 2024-5-7 22:37 | 只看该作者
nRF24L01模块需要稳定的3.3V电源。确保电源质量良好,避免电源噪声影响通信质量。同时,注意电源管理,如上电、掉电顺序等。

使用特权

评论回复
12
chenqianqian| | 2024-5-8 08:19 | 只看该作者
从调试角度来讲,先调通点对点,才是点对多点

使用特权

评论回复
13
bestwell| | 2024-5-8 12:43 | 只看该作者
nrf24l01不建议在TX模式下长时间停留,因为这可能会导致模块过热或其他问题。在发送完数据后,应及时将模块切换到其他模式或关闭模块。

使用特权

评论回复
14
updownq| | 2024-5-8 17:08 | 只看该作者
NRF24L01模块发送和接收数据包有一定的限制,例如数据包的最大长度,需要在应用程序中处理好数据包的封装和解封装。

使用特权

评论回复
15
fengm| | 2024-5-8 18:29 | 只看该作者
软件配置:
在单片机程序中配置NRF24L01的GPIO引脚,确保它们以正确的方向(输入或输出)工作。
配置NRF24L01的SPI接口,包括设置合适的速度和数据格式。
配置NRF24L01的工作模式,如发射功率、频率、通信地址等

使用特权

评论回复
16
elsaflower| | 2024-5-8 20:13 | 只看该作者
NRF24L01支持多种工作模式,包括Tx(发送)和Rx(接收)。正确配置这些模式对于无线通信至关重要

使用特权

评论回复
17
sheflynn| | 2024-5-9 15:49 | 只看该作者
NRF24L01模块可以通过SPI接口与单片机通信,单片机需先配置好模块的配置寄存器,包括频道、通道、地址等参数,再根据需要设置为发送或接收模式。

使用特权

评论回复
18
maudlu| | 2024-5-9 18:29 | 只看该作者
与NRF24L01模块的CE、CSN、SCK、MOSI、MISO管脚正确连接,并在软件中正确设置这些GPIO管脚的功能。

使用特权

评论回复
19
geraldbetty| | 2024-5-9 20:08 | 只看该作者
在电磁干扰较强的环境中,可能会影响NRF24L01模块的通信稳定性,需要采取一定的屏蔽和接地措施。

使用特权

评论回复
20
bestwell| | 2024-5-9 22:07 | 只看该作者
NRF24L01模块与ESP8266模块在外观上很相似

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

1272

帖子

1

粉丝