u013228784 2019-01-29 01:14 采纳率: 0%
浏览 703

nrf24l01无法同时多发一收

当EN_RXADDR寄存器设置为0x3f 使能通道012345的接收地址时 只能从通道1接收到数据,无法从通道0,2,3,4,5接收到数据
当EN_RXADDR寄存器设置为0x01 使能通道0的接收地址时 只能从通道0接收到数据

请问如何同时接收到通道0,1,2,3,4,5的数据
在不使用通讯协议的情况下如何判断接收到的数据是从通道0,1,2,3,4,5的哪个通道接收到的

我的代码如下

const u8 ADDRESS[7][5]={{0x30,0x30,0x30,0x30,0x30},{0x30,0x30,0x30,0x30,0x31},{0x30,0x30,0x30,0x30,0x32},{0x30,0x30,0x30,0x30,0x33},{0x30,0x30,0x30,0x30,0x34},{0x30,0x30,0x30,0x30,0x35},{0x30,0x30,0x30,0x30,0x36}};

/*********************************************/
/* 函数功能:设置24L01为接收模式 /
/
********************************************/

void NRF24L01_RX_Mode(void)
{

SPI_RF_CE_L;//CE拉低,使能24L01配置
NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0, (u8*)ADDRESS[0], RX_ADR_WIDTH);//写RX接收地址
NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P1, (u8*)ADDRESS[1], RX_ADR_WIDTH);//写RX接收地址

 NRF24L01_Write_Reg(WRITE_REG+RX_ADDR_P2,ADDRESS[2][4]);
 NRF24L01_Write_Reg(WRITE_REG+RX_ADDR_P3,ADDRESS[3][4]);
 NRF24L01_Write_Reg(WRITE_REG+RX_ADDR_P4,ADDRESS[4][4]);
 NRF24L01_Write_Reg(WRITE_REG+RX_ADDR_P5,ADDRESS[5][4]);

NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x3f);    //开启通道0,1,2,3,4,5自动应答    
NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f);//通道0 1,2,3,4,5 接收允许  
NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);   //设置RF工作通道频率   

NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF24L01_Write_Reg(WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道1的有效数据宽度
NRF24L01_Write_Reg(WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//选择通道2的有效数据宽度
NRF24L01_Write_Reg(WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);//选择通道3的有效数据宽度
NRF24L01_Write_Reg(WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);//选择通道4的有效数据宽度
NRF24L01_Write_Reg(WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);//选择通道5的有效数据宽度  

NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启         
NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 
SPI_RF_CE_H;//CE置高,进入接收模式 
delay_us(10);

}
/*********************************************/
/* 函数功能:设置24L01为发送模式 /
/
********************************************/
void NRF24L01_TX_Mode(void)
{

SPI_RF_CE_L;//CE拉低,使能24L01配置

NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)ADDRESS[0],TX_ADR_WIDTH);//写TX节点地址
NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)ADDRESS[0],RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK

NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x3f); //使能通道012345的自动应答

NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f); //使能通道012345的接收地址

NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次

NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);        //设置RF通道为0
NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断
SPI_RF_CE_H;//CE置高,10us后启动发送 

delay_us(10);
}

main中的死循环代码:
while(1)
{
if(SPI_RF_IRQ==0)
{
if(NRF24L01_RxPacket(rece_buf)==0)
{
Usart_SendString(rece_buf);
}
}

}

发送数据代码:
SPI_RF_CE_L;
NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
SPI_RF_CE_H;
NRF24L01_TxPacket(rece_buf);
SPI_RF_CE_L;
NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);
SPI_RF_CE_H;

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 16:30
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 文章:NRF24L01 中也许有你想要的答案,请看下吧

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 ensp的问题(需要各个路由器命令)
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题