NRF24L01一对六关于通道2-5不可用的问题

项目场景:

NRF24L01使用过程中调试一对一,一对二都很好使,直到调试到了一对三,发现通道2-5怎么都调不通,整体原因在于低地址在前高地址在后,意思是你通道2-5你只能修改地址数组第一位,而不能修改地址数组最后一位。


问题描述

先上图,我愿称之为最脑残的数据手册图
在这里插入图片描述
如果你完全相信了这个数据手册地址结构图,你会发现到死都调不通通道2-通道5。
在这里定义的地址C2-C5,实际上在代码中是数组的第一位数,即能修改的其实是
RX_ADDRESS[0].

const u8 RX_ADDRESS0[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//通道0
const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0xC2,0xC2,0xC2,0xC2,0xC2};//
const u8 RX_ADDRESS2[1]={0xC3};//
const u8 RX_ADDRESS3[1]={0xC4};//
const u8 RX_ADDRESS4[1]={0xC5};//
const u8 RX_ADDRESS5[1]={0xC6};//通道5

/*或者你也可以这么理解*/
const u8 RX_ADDRESS0[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//通道0
const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0xC2,0xC2,0xC2,0xC2,0xC2};//
const u8 RX_ADDRESS2[RX_ADR_WIDTH]={0xC3,0xC2,0xC2,0xC2,0xC2};//
const u8 RX_ADDRESS3[RX_ADR_WIDTH]={0xC4,0xC2,0xC2,0xC2,0xC2};//
const u8 RX_ADDRESS4[RX_ADR_WIDTH]={0xC5,0xC2,0xC2,0xC2,0xC2};//
const u8 RX_ADDRESS4[RX_ADR_WIDTH]={0xC6,0xC2,0xC2,0xC2,0xC2};//通道5

问题二

还有一点你要记住,如果你是采用的NRF24L01转USB模块调试的话,记得也是要去修改第一位的,千万别在一个坑里面跌倒两次
在这里插入图片描述


解决方案:

整体接收端代码如下,这里我只开启了四个通道,因为是多个发送,一个接收,接收端的配置就不再赘述。
这里我也是参考了大佬代码,说通道一需要配置两次,https://blog.csdn.net/guguda1111/article/details/102599380
具体配置几次我也没有尝试。不过需要注意的一点是由于通道共用高位地址,只有最低为地址不同,在配置过程中通道2-5只需要写第一位地址即可。这也是常犯的毛病之一。
总结两点:
1.通道2-5写一位地址
2.写低位地址,但请记住地位地址在左边

void NRF24L01_RX_Mode(void)
{
	NRF24L01_CE=0;	  
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);
	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);
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS3,1);
	
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x0F);      
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x0F);	
	
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);	     	
  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//
	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+RF_SETUP,0x0f);//
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//
  	NRF24L01_CE = 1; //
}	
u8 NRF24L01_RxPacket(u8 *rxbuf0,u8 *rxbuf1,u8 *rxbuf2,u8 *rxbuf3)
{
	u8 sta,TD,flag = 0;		    							   
	SPI2_SetSpeed(SPI_BaudRatePrescaler_8); 
	sta=NRF24L01_Read_Reg(STATUS); 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta);
	{
		switch(TD){
			case 0x00:flag = 1;NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf0,RX_PLOAD_WIDTH);break;//通道0
			case 0x02:flag = 2;NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf1,RX_PLOAD_WIDTH);break;//通道1
			case 0x04:flag = 3;NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf2,RX_PLOAD_WIDTH);break;//通道2
			case 0x06:flag = 4;NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf3,RX_PLOAD_WIDTH);break;//通道3
			default:break;
		}
		NRF24L01_Write_Reg(FLUSH_RX,0xff);
		return flag;//看是哪个通道的
	}	   
	return 0;
}					
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值