515135896 发表于 2012-12-2 08:23:39

熟悉无线模块 nrf24L01的朋友进来看看

最近在做无线语音通信的项目,用到了24L01,24LE1(个人感觉24LE1跟24L01区别不大,核心都是NRF的无线收发,只是24LE1多了一个51内核)
方案是24L01作为中继,24LE1作为对讲机
遇到一个麻烦,中继24L01发送两次,对讲机才接收到一次……
给我的感觉是第一次发送接收都正常,第二次发送没起到作用,第三次却接收到了,第四次又不能接受到,第五次又可以了……就是这样的情况
我分析可能是时序的问题,但是还没发现到底是哪的问题,请教有经验的朋友说说自己是怎么处理的呢?

515135896 发表于 2012-12-2 08:50:53

这是涉及到的一些代码,大家看看有什么问题吗

/**************************************************/
// 功能:RF中断服务子程序
/**************************************************/
void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
{
        EA=0;
        sta=SPI_Read(STATUS);                                                // 保存寄存器状态值
        if(RX_DR)
        {
                RFCE=0;
                RD_PAYLOAD();       //读取接收到的信息到缓冲区
//                receive_flag=1;
//                LED1=0;
                receive_show();       //显示接收到的信息
        }
        else
        {
                receive_flag=0;
        }
        SPI_RW_Reg(WRITE_REG+STATUS,0x70);                        // 清除所有中断标志
        RFCE=1;
        EA=1;
}


void receive_show()
{
        unsigned char i=1,j=0;
        LCD_P8x16Str(0,0,"Total:0");        //7*8=56
        j=rx_buf;
        LCD_Pchar8x16(48,0,j+0X30);
        while(j--)
        {
                LCD_Pchar8x16( 0,i*2,rx_buf[(i-1)*4+1]);
                LCD_Pchar8x16( 8,i*2,rx_buf[(i-1)*4+2]);
                LCD_Pchar8x16(16,i*2,rx_buf[(i-1)*4+3]);
                LCD_Pchar8x16(24,i*2,rx_buf[(i-1)*4+4]);
                i++;
        }
}

void RD_PAYLOAD(void)
{
    uint8_t i;

        RFCSN=0;                                                                          // 进入SPI操作
        SPI_RW(RD_RX_PLOAD);                                                // 写入命令
        for (i=0;i<TX_PLOAD_WIDTH;i++)
    {
          rx_buf = SPI_RW(0);                        // 读出数据
      rx_start++;                                                                // 改变指针
      rx_start&=0x3f;
                rx_num++;                                                                // 接收数据总数加一
    }                                                                                          
        RFCSN=1;                                                                        // 结束SPI操作
       
        RFCSN=0;                                                                          // 进入SPI操作
        SPI_RW_Reg(FLUSH_RX,0);                                                // 清除接收缓冲区
        RFCSN=1;                                                                          // 进入SPI操作
}

515135896 发表于 2012-12-2 08:51:23

肯请大侠的帮助啊!!

dreamc 发表于 2012-12-14 12:36:07

很多人用中断也遇到了这个问题,查询的话确实很少有你出现的这种情况啊。24l01还是有弊端啊。有时IRQ根本不动作 可是数据却发出去啊

fmdz 发表于 2012-12-22 14:51:45

我用SI24R1也有这种IRQ不触发的问题

dreamc 发表于 2012-12-25 09:20:43

fmdz 发表于 2012-12-22 14:51 static/image/common/back.gif
我用SI24R1也有这种IRQ不触发的问题

程序问题的,你CE启动后不能有任何操作,要在那里等待发送完成

migrant 发表于 2012-12-25 09:32:58

贴的是收代码,实际是发送问题,估计是未等待发生完成就发下一包,导致间隔丢包。

t3486784401 发表于 2012-12-25 09:52:46

以前用24L01作半双工 查询-返回 式程序时,就遇到过此类问题,就是发的太快了:

被查询方如果收到数据包后迅速返回,则查询方收不到该包;
使用第三个24L01监视期间通信,则也只有查询包没有反馈。

当时是强行用延时给包之间增加了近100us的间隔,才最终解决。

斗笠渔翁 发表于 2012-12-2 08:23:40

之前我遇到过哦这情况。
收发各有三个缓存区,及时清除缓冲区。发送前后清除缓冲区。接收有可能没中断触发,用查询寄存器去读取。

我现在遇到别的问题

目前两点之间通信基本算稳定,但是一(仅)发二(仅)收的系统经常发送失败,发送设备在发送过程需要切换地址,两接收设备一直处于接收状态。是什么原因?
目前我分析如下可能:

1、三系统供电都是DCDC 3.3V,无线模块使用开关电源不稳定?

2、发送设备在写入地址的时候不正确写入,导致发送失败?

3、其它原因?

此外还有几点使用疑问:
1、发送的时候CE端一直保持高电平,TX缓冲区只要不为空模块是不是一直处于发送状态,一直发送缓冲区的数据?要是一直发送缓冲区数据,发送不成功产生超时超次数(MAX_RT)中断,我们寄存器写入清除中断标志后模块是否会继续发送数据?还是?

2、模块中的指令“ACTIVATE ”“R_RX_PL_WID”“W_ACK_PAYLOAD”“W_TX_PAYLOAD_NO
ACKa”是什么作用?如何使用?

有经验前辈分析一下注意的使用心得~~~

yinnianlong 发表于 2014-11-9 23:12:03

原来如此
页: [1]
查看完整版本: 熟悉无线模块 nrf24L01的朋友进来看看