调试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) 我正在调试,配置寄存器很有讲究,也还没通过中。。。 刚刚发现按照上面的发射配置来操作的话,单纯进入发射模式,发射完后RX FIFO是满的,很奇怪的问题 看错文档,不过结果还是一样..继续调试 回复【3楼】rahpven
-----------------------------------------------------------------------
现在怎么样了?成功了吧? 看不出有什么问题啊? 我去。。。。。。。。。。。。。。 改天发个我正在用的代码…尼玛还3星期… ohha3026 发表于 2012-12-5 02:09 static/image/common/back.gif
改天发个我正在用的代码…尼玛还3星期…
我也遇到相同问题!
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);//写发射地址 这个是我用的,其中24L01.h和spi.h是nRf2401能用到的
具体的自己看吧
ps:这是我用atmega16模拟的usb 其中就有无线传输,我也没单独发一起发吧 艹 看看是电源的问题吧,是不是需要加电容呀,0。1uf的和10uf的 我毕设也会用到,绑定 有没有频谱仪呀,看看发射出来的波形对不对,两个波形不一致的话也是收不到的,感觉你这个应该是射频方面的问题,不是寄存器配置问题,射频的寄存器配置应该很简单的。 如果采用自动重发,p0应该和你的发送地址一样。 nrf几个关键点:
1。SPI模式必须正确,一点不能出错。必须符合数据手册。
2。配置可参考成熟的模块程序的配置方法。
3。电源品质问题会导致严重的干扰和错误。
4。无论是传输还是接收,在理论上都是一个节点。
页:
[1]