项目场景:
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;
}