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 中也许有你想要的答案,请看下吧

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

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!