24l01室内几米远有1%左右的丢包率正常么?如何改善?
本帖最后由 bangbangji 于 2021-2-27 22:37 编辑淘宝上买的模块,发射端带天线,单方向传输。
开启了应答和自动重传,大概还有1%左右的丢包率,这个现象正常吗?
5楼有代码,帮忙分析下有无问题 开了应答,接收端要跟发送端一样才行,因为应答信号是从接收端发出,如果发射功率不够或者没天线不行; 或者换个芯片si4432 zzh90513 发表于 2021-2-27 21:02
开了应答,接收端要跟发送端一样才行,因为应答信号是从接收端发出,如果发射功率不够或者没天线不行; ...
这里确实有点问题
不过现在看好像不是应答没收到,只是单纯的发送方往接收方发的时候丢了。
如果是应答没有收到,那么发送端会重发,那么接收端可能会收到两帧相同的数,目前没有发现相同数的。 贴一下代码,发送端:
CE_L;//CE=0; // chip enable
CS_H;//CSN=1; // Spidisable
SCK_L;//SCK=0; //
SPI_RW_Reg(WRITE_REG_24L01 + STATUS, 0xff); // clear irq flag
SPI_RW(FLUSH_TX); //clear tx fifo
SPI_RW(FLUSH_RX); //clear rx fifo
SPI_Write_Buf(WRITE_REG_24L01 + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(WRITE_REG_24L01 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
SPI_Write_Buf(WR_TX_PLOAD, TxBuf, TX_PLOAD_WIDTH); // Writes data to TX payload
SPI_RW_Reg(WRITE_REG_24L01 + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG_24L01 + EN_RXADDR, 0x01);// Enable Pipe0
SPI_RW_Reg(WRITE_REG_24L01 + SETUP_RETR, 0x12); // 500us , 10 retrans...
SPI_RW_Reg(WRITE_REG_24L01 + RF_CH, ch_freq); // Select RF channel 40
SPI_RW_Reg(WRITE_REG_24L01 + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG_24L01 + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
CE_H;
while(IRQ_D == 1); //µÈ´ý·¢ËÍÍê±Ï
接收端:
if(first_flag == 0)
{//只初始化时运行1次
first_flag = 1;
CE_L;//CE=0; // chip enable
CS_H;//CSN=1; // Spidisable
SCK_L;//SCK=0; //
SPI_RW_Reg(WRITE_REG_24L01 + STATUS, 0xff); // clear irq flag
SPI_RW(FLUSH_TX); //clear tx fifo
SPI_RW(FLUSH_RX); //clear rx fifo
SPI_Write_Buf(WRITE_REG_24L01 + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(WRITE_REG_24L01 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the RX device as the TX device
SPI_RW_Reg(WRITE_REG_24L01 + EN_AA, 0x01); // 1 Enable Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG_24L01 + EN_RXADDR, 0x01);// Enable Pipe0
SPI_RW_Reg(WRITE_REG_24L01 + RF_CH, freq); // Select RF channel 40
SPI_RW_Reg(WRITE_REG_24L01 + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
SPI_RW_Reg(WRITE_REG_24L01 + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG_24L01 + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..
CE_H;
HAL_Delay(2);
}
if(IRQ_D == 0)
{
i = SPI_Read(STATUS);
if(i&(1<<6)) // STATUS's bit6 is rx flag
{
SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
SPI_RW_Reg(WRITE_REG_24L01 + STATUS, 0xff); // clear irq flag
SPI_RW(FLUSH_TX); //clear tx fifo
SPI_RW(FLUSH_RX); //clear rx fifo
send_uart_byte_array(1, RxBuf, 32);
}
} 本帖最后由 menglogic 于 2021-2-28 14:26 编辑
原来做用24L01 做遥控器时,距离几米也是有发现丢包的,不排除是其它WIFI之类的同频干扰。看网上资料要提高通信稳定性跳频是需要的。我这遥控器不需要很高的实时性,当丢包后延时再发送。 无线的方式肯定存在丢包问题,空间电磁干扰太多了。加了应答和自动重发还丢数据,只能说明你的代码应答逻辑不够严谨。
页:
[1]