rahpven 发表于 2010-11-24 21:23:35

调试NRF24L01已经三个星期了,还是无法接受数据,抓狂了...

最近在帮老师做一个无线音频通讯的项目,射频部分用NRF24L01,MCU是用M16。但是调试了两个星期,还是没有结果,快疯了,现在只能想大家求助。

现在的问题是两个24L01无法实现单向数据传输,已排除硬件无问题。
    首先,分别对接受和发射模块的TX_ADDR和RX_PW_P0地址寄存器写入相同的地址,之后再读出地址,读出的地址和写入的地址一致并且频率,地址宽度,传输速率,校验选项,数据长度设置都相同。
发射端使能MAX_RT中断,SETUP_RETR为默认的0x03,接收端无法接受到数据,发射端能触发MAX_RT中断。接收端能CD能检测到发射端的信号(通过IO口判断CD状态
,4个脉冲中后三个重发,与SETUP_RETR设置符合),可却无法接收到发射的数据。
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_600210A6TJ1C.jpg
(原文件名:波形图.jpg)
下面是发射和接收的配置
void TX_Mode(void)
{
        CE_L;
        WIRTE_BUF(TX_ADDR + WRITE,ADDRESS,ADR_WIDTH);//设置发射地址
        WIRTE_BUF(RX_ADDR_P0 + WRITE,ADDRESS,ADR_WIDTH);//设置接收地址
        SPI_RW_REG(WRITE + EN_AA, ENAA_P0); // 数据通道 0 自动应答允许
        SPI_RW_REG(WRITE + EN_RXADDR, ERX_P0); // 接收数据通道 0 允许
        SPI_RW_REG(WRITE + SETUP_AW, 0x03); //地址宽度
        SPI_RW_REG(WRITE + RF_CH, frequency); // 2 Mbps 0dBm低噪声放大器增益
        SPI_RW_REG(WRITE + RF_SETUP, 0x07);       
        SPI_RW_REG(WRITE + RX_PW_P0, 31);       
        SPI_RW_REG(WRITE + CONFIG, EN_CRC + CRCO + PWR_UP);
}
void send_data(uchar *address, uchar *buffer,uchar length)
{
        CE_L;
        CSN_L;
        SPI_RW_REG(FLUSH_TX);//清除发射FIFO的数据
        CSN_H;
        WIRTE_BUF(RX_ADDR_P0 + WRITE,address,length);//写接收地址
        WIRTE_BUF(TX_ADDR + WRITE,address,length);//写发射地址
        WIRTE_BUF(WR_TX_PLOAD,buffer,length);//向FIFO写数据
        CE_H;//激活发射
        delay_us(20);
        //CE_L;       
}

void RX_Mode(void)
{
        CE_L;
        WIRTE_BUF(TX_ADDR + WRITE,ADDRESS,ADR_WIDTH);//设置发射地址
        WIRTE_BUF(RX_ADDR_P0 + WRITE,ADDRESS,ADR_WIDTH);//设置接收地址
        SPI_RW_REG(WRITE + EN_AA, ENAA_P0);// 数据通道 0 自动应答允许
        SPI_RW_REG(WRITE + EN_RXADDR, ERX_P0);// 接收数据通道 0 允许
        SPI_RW_REG(WRITE + SETUP_AW, 0x03);//地址宽度
        SPI_RW_REG(WRITE + RF_CH, frequency);//频率
        SPI_RW_REG(WRITE + RF_SETUP, 0x07);// 2 Mbps 0dBm低噪声放大器增益       
        SPI_RW_REG(WRITE + RX_PW_P0, 31);        //数据长度
        SPI_RW_REG(WRITE + CONFIG, EN_CRC + CRCO + PWR_UP+ PRIM_RX);
        CE_H;
}
下面是代码
代码ourdev_600211J5FV6X.rar(文件大小:37K) (原文件名:NRF24l01A.rar)

lanmanck 发表于 2010-11-27 17:20:28

我正在调试,配置寄存器很有讲究,也还没通过中。。。

rahpven 发表于 2010-11-28 20:05:31

刚刚发现按照上面的发射配置来操作的话,单纯进入发射模式,发射完后RX FIFO是满的,很奇怪的问题

rahpven 发表于 2010-11-28 20:14:24

看错文档,不过结果还是一样..继续调试

changzi2008 发表于 2011-4-24 21:31:24

回复【3楼】rahpven
-----------------------------------------------------------------------

现在怎么样了?成功了吧?

lanjingjing 发表于 2011-8-18 17:15:34

看不出有什么问题啊?

北极星之北边 发表于 2012-11-30 16:49:48

我去。。。。。。。。。。。。。。

ohha3026 发表于 2012-12-5 02:09:29

改天发个我正在用的代码…尼玛还3星期…

北极星之北边 发表于 2012-12-6 16:17:06

ohha3026 发表于 2012-12-5 02:09 static/image/common/back.gif
改天发个我正在用的代码…尼玛还3星期…

我也遇到相同问题!

allwireless 发表于 2012-12-9 21:44:37

void send_data(uchar *address, uchar *buffer,uchar length)
{
      CE_L;
      CSN_L;
      SPI_RW_REG(FLUSH_TX);//清除发射FIFO的数据
      CSN_H;
      WIRTE_BUF(RX_ADDR_P0 + WRITE,address,length);//写接收地址
      WIRTE_BUF(TX_ADDR + WRITE,address,length);//写发射地址
      WIRTE_BUF(WR_TX_PLOAD,buffer,length);//向FIFO写数据
      CE_H;//激活发射
      delay_us(20);
      //CE_L;      
}

改为
WIRTE_BUF(RX_ADDR_P0 + WRITE,address,ADR_WIDTH);//写接收地址
WIRTE_BUF(TX_ADDR + WRITE,address,ADR_WIDTH);//写发射地址

ohha3026 发表于 2012-12-21 23:50:48

这个是我用的,其中24L01.h和spi.h是nRf2401能用到的
具体的自己看吧
ps:这是我用atmega16模拟的usb 其中就有无线传输,我也没单独发一起发吧 艹

linyili1989 发表于 2013-1-4 20:00:43

看看是电源的问题吧,是不是需要加电容呀,0。1uf的和10uf的

外卡传媒 发表于 2013-2-28 18:51:30

随风允诺 发表于 2013-3-13 00:45:48

我毕设也会用到,绑定

brian_wsn 发表于 2013-3-15 09:31:45

有没有频谱仪呀,看看发射出来的波形对不对,两个波形不一致的话也是收不到的,感觉你这个应该是射频方面的问题,不是寄存器配置问题,射频的寄存器配置应该很简单的。

noynot 发表于 2013-4-8 10:41:15

如果采用自动重发,p0应该和你的发送地址一样。

achieveIEEE 发表于 2013-4-8 17:36:21

nrf几个关键点:
1。SPI模式必须正确,一点不能出错。必须符合数据手册。
2。配置可参考成熟的模块程序的配置方法。
3。电源品质问题会导致严重的干扰和错误。
4。无论是传输还是接收,在理论上都是一个节点。
页: [1]
查看完整版本: 调试NRF24L01已经三个星期了,还是无法接受数据,抓狂了...