大体情况:
目前我开了6路,发射机每隔1s发送一次数据,经过长期几十个小时的测试,数据收发比较稳定。但是不定期时间内,会丢1-2次包,丢包很少,但是存在,在三秒之内所有的发射机必定都会收到正确的数据(通过看闪灯的情况)。
目前在分析丢包的原因:
1.同频干扰排除,之前看到一个网友,调试时频率调到2.5G, 排除wifi干扰。 频率调到2.5G测试过,仍然存在这个问题。
2.电源干扰。使用的电池都比较好的稳定的电池。加在stm32与nrf24l01,还有pa上的都比较稳定。
3.第三点我就想到,开启了ack后,看到英文手册上,接收机接收到数据后,shockburst模式中自动切换到发射模式,发送应答,发完后又切换回来。
会不会存在这样一种情况:就是6路发射机的信号同时到达,接收机接收其中一路,应答一路。其他发射机,则进入自动重发。(这里设置的重发15次)以此这样循环。但是不确定这一点。跳出来想想,芯片设计能1对6,肯定是考虑到这种情况的。
我想问一下大家,有没有遇到的同样的情况的。或是能给我提供一些其他丢包的原因 。^-^谢谢!
下面是发包代码。
void nRF24L01_TxPacket(unsigned char * tx_buf,u8 tx_len, unsigned char pwr)
{
u8 sta_reg;
CE_0;
inerDelay_us(10);//StandBy I模式
sta_reg = SPI_Read(STATUS);
if(sta_reg & 0x70)
SPI_RW_Reg(WRITE_REG+STATUS,sta_reg & 0x70); //清标志
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, tx_len); // 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE_1; //置高CE,激发数据发送
inerDelay_us(60);
do{
sta_reg = SPI_Read(STATUS);
if(sta_reg & 0x20)
break;
inerDelay_us(5);
}while(!(sta_reg & 0x10));
SPI_RW_Reg(FLUSH_TX,0xff);//清空FIFO
CE_0;//发送完成后,进入待机模式1
}
main.c中:
nRF24L01_TxPacket(Tx_DAT,TX_PLOAD_WIDTH_WORK,pwr);// 发送
if (0x20 & SPI_Read(STATUS))
LED_flash(GREEN,1);
//闪绿灯,发送成功
else
LED_flash(ORANGE,1);
//闪橙灯,发送失败
大体情况:
目前我开了6路,发射机每隔1s发送一次数据,经过长期几十个小时的测试,数据收发比较稳定。但是不定期时间内,会丢1-2次包,丢包很少,但是存在,在三秒之内所有的发射机必定都会收到正确的数据(通过看闪灯的情况)。
目前在分析丢包的原因:
1.同频干扰排除,之前看到一个网友,调试时频率调到2.5G, 排除wifi干扰。 频率调到2.5G测试过,仍然存在这个问题。
2.电源干扰。使用的电池都比较好的稳定的电池。加在stm32与nrf24l01,还有pa上的都比较稳定。
3.第三点我就想到,开启了ack后,看到英文手册上,接收机接收到数据后,shockburst模式中自动切换到发射模式,发送应答,发完后又切换回来。
会不会存在这样一种情况:就是6路发射机的信号同时到达,接收机接收其中一路,应答一路。其他发射机,则进入自动重发。(这里设置的重发15次)以此这样循环。但是不确定这一点。跳出来想想,芯片设计能1对6,肯定是考虑到这种情况的。
我想问一下大家,有没有遇到的同样的情况的。或是能给我提供一些其他丢包的原因 。^-^谢谢!
下面是发包代码。
void nRF24L01_TxPacket(unsigned char * tx_buf,u8 tx_len, unsigned char pwr)
{
u8 sta_reg;
CE_0;
inerDelay_us(10);//StandBy I模式
sta_reg = SPI_Read(STATUS);
if(sta_reg & 0x70)
SPI_RW_Reg(WRITE_REG+STATUS,sta_reg & 0x70); //清标志
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, tx_len); // 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE_1; //置高CE,激发数据发送
inerDelay_us(60);
do{
sta_reg = SPI_Read(STATUS);
if(sta_reg & 0x20)
break;
inerDelay_us(5);
}while(!(sta_reg & 0x10));
SPI_RW_Reg(FLUSH_TX,0xff);//清空FIFO
CE_0;//发送完成后,进入待机模式1
}
main.c中:
nRF24L01_TxPacket(Tx_DAT,TX_PLOAD_WIDTH_WORK,pwr);// 发送
if (0x20 & SPI_Read(STATUS))
LED_flash(GREEN,1); //闪绿灯,发送成功
else
LED_flash(ORANGE,1);//闪橙灯,发送失败
举报