搜索
bottom↓
回复: 14

关于调试NRF24L01的一些记录(误码率)

[复制链接]

出0入0汤圆

发表于 2010-12-8 10:37:43 | 显示全部楼层 |阅读模式
昨天,也在这里找了很多资料,现在把一些心得,记录一下,希望能帮助到大家。

半年前,买了2快NRF24L01模块,调了好几天,都没什么好的结果,最后只调到误码率为80%左右(发送10个,收到2个,晕啊!呵呵),不过,总算是能收到,也算是一点进步吧,哎~

昨天,无聊,又拿出一起焊的板子,拿来调,刚开始,收都收不到,后来,偶尔能收到几个。(原来的板子,原来的程序。)

下班后,会到家,在家里的电脑上,竟然可以收到,误码率为20%左右,(开通ASK功能,误码率为10%左右)哈哈,有进步,
不过,还是不爽,要知道,我这距离基本为0啊。
虽然可以用软件的方法,判断和重发,达到没有误码,但我看别人,应该不会误码率这么高的。

今天,回到公司,在公司的电脑上,误码率,又回到80%,晕。
后来,论坛上有人说,最好加滤波电容,我就在1117-3.3的输出端加了个104,奇迹发生了,误码率为千分之一以下。
晕啊,一颗104(主要是接收板上的那颗),让NRF24L01模块的误码率从100%(最坏的情况)到0%。害的我还调了N天。

出0入0汤圆

发表于 2010-12-8 11:02:04 | 显示全部楼层
回复【楼主位】zzz1367  
-----------------------------------------------------------------------

谢谢分享

出0入0汤圆

发表于 2010-12-8 11:34:43 | 显示全部楼层
回复【楼主位】zzz1367
-----------------------------------------------------------------------

楼主可能看见我的帖子了。。呵呵。。。满高兴的。。能帮助你。。。。我现在把NRF24L01能够发送图片和中文了。。有机会我把这些代码上传给大家。。。

出0入0汤圆

 楼主| 发表于 2010-12-8 14:01:16 | 显示全部楼层
回复【3楼】myqiang1990 切.格瓦拉
========================================================================================

呵呵,这论坛上的关于NRF24L01的 讨论,基本上 都有你参加。

看来是玩NRF24L01 的高手了。呵呵。

我的只有10米,不知道 怎么样才能增加距离?

出0入0汤圆

发表于 2010-12-8 14:10:33 | 显示全部楼层
加PA咯

出0入0汤圆

发表于 2010-12-21 09:49:05 | 显示全部楼层
楼主调24L01的经验很丰富啊,我现在也遇到了问题,是软件方面的,在接受端不能清除RX_FIFO而且和那奇怪要再读一次RX_PAYLOAD才行,不然只能接收一次,可能不太好懂,一下是我的程序
#include "msp430x14x.h"
void init_chip(void);               
void init_uart(void);
void init_clock(void);

unsigned char SPI_RW(unsigned char byte);
unsigned char SPI_Write(unsigned char byte);
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value);
unsigned char SPI_Read(unsigned char reg);
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes);
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes);  
void StandbyI(void);
void StadbyII(void);
void RX_Mode(void);
void TX_Mode(void);
void setupnrf(void);

void delay(int a);
void LED(void);
/******************************************************************************/  
#define ADR_WIDTH    5   // 5 bytes TX(RX) address width (地址长度)
#define PLOAD_WIDTH  20  // 20 bytes TX payload (最大是 32 bytes)

unsigned char        TX_ADDRESS[ADR_WIDTH]                = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address (即目标地址)
unsigned char        Local_ADDRESS[ADR_WIDTH]        = {0x34,0x43,0x10,0x10,0x01}; // Define a static RX address (即本地地址)
                                                                                          
unsigned char rx_buf[PLOAD_WIDTH];        //接收缓存容器
unsigned char tx_buf[PLOAD_WIDTH]={'c','o','n','g','r','a','t','u','l','a','t','i','o','n',' ','r','i','g','h','t'};        //发送缓存容器
//unsigned char tx_buf[PLOAD_WIDTH]={0x01,0x02,0x03,0x04,0x05,0x01,0x02,0x03,0x04,0x05,0x01,0x02,0x03,0x04,0x05,0x34,0x43,0x10,0x10,0x01};        //发送缓存容器
unsigned char flag;                                        //标志
int flag_r;
int flag_t;
int flag_e;
//************************************************************************************

/**************************************************************************************/
unsigned char        sta;                          //状态标志
#define RX_DR      sta&0x40       // RX_DR=sta^6;  接收数据中断,当接收到有效数据后置1
#define TX_DS      sta&0x20       //TX_DS =sta^5;  数据发送完成中断
#define MAX_RT     sta&0x10       // MAX_RT =sta^4; 达到最多次重发中断
/**************************************************************************************/
/**************************************************************************************/
//DEFINE IO
#define SET_CSN P5OUT|=0X01
#define CLR_CSN P5OUT&=0XFE
//#define SET_CE  P5OUT|=0X10
//#define CLR_CE  P5OUT&=0XEF
#define SET_CE    P1OUT|=0X40
#define CLR_CE    P1OUT&=0XBF
#define SET_MOSI  P5OUT|=0X02
#define CLR_MOSI  P5OUT&=0XFD
#define SET_SCK   P5OUT|=0X08
#define CLR_SCK   P5OUT&=0XF7

/**************************************************************************************/
// SPI(nRF24L01) commands
#define READ_REG        0x00  // Define read command to register
#define WRITE_REG       0x20  // Define write command to register
#define RD_RX_PLOAD     0x61  // Define RX payload register address
#define WR_TX_PLOAD     0xA0  // Define TX payload register address
#define FLUSH_TX        0xE1  // Define flush TX register command
#define FLUSH_RX        0xE2  // Define flush RX register command
#define REUSE_TX_PL     0xE3  // Define reuse TX payload register command
#define NOP             0xFF  // Define No Operation, might be used to read status register
// SPI(nRF24L01) registers(addresses)
#define CONFIG          0x00  // 'Config' register address
#define EN_AA           0x01  // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR       0x02  // 'Enabled RX addresses' register address
#define SETUP_AW        0x03  // 'Setup address width' register address
#define SETUP_RETR      0x04  // 'Setup Auto. Retrans' register address
#define RF_CH           0x05  // 'RF channel' register address
#define RF_SETUP        0x06  // 'RF setup' register address
#define STATUS          0x07  // 'Status' register address
#define OBSERVE_TX      0x08  // 'Observe TX' register address
#define CD              0x09  // 'Carrier Detect' register address
#define RX_ADDR_P0      0x0A  // 'RX address pipe0' register address
#define RX_ADDR_P1      0x0B  // 'RX address pipe1' register address
#define RX_ADDR_P2      0x0C  // 'RX address pipe2' register address
#define RX_ADDR_P3      0x0D  // 'RX address pipe3' register address
#define RX_ADDR_P4      0x0E  // 'RX address pipe4' register address
#define RX_ADDR_P5      0x0F  // 'RX address pipe5' register address
#define TX_ADDR         0x10  // 'TX address' register address
#define RX_PW_P0        0x11  // 'RX payload width, pipe0' register address
#define RX_PW_P1        0x12  // 'RX payload width, pipe1' register address
#define RX_PW_P2        0x13  // 'RX payload width, pipe2' register address
#define RX_PW_P3        0x14  // 'RX payload width, pipe3' register address
#define RX_PW_P4        0x15  // 'RX payload width, pipe4' register address
#define RX_PW_P5        0x16  // 'RX payload width, pipe5' register address
#define FIFO_STATUS     0x17  // 'FIFO Status Register' register address
/***************************************************************************************/
void init_chip()
{
  P5SEL=0;
  P5DIR|=0X1B;                  //P5.0 5.1 5.35.4输出P5.2输入
  P1SEL=0;
  P1DIR|=0X40;
  CLR_CE;
  SET_CSN;
  CLR_SCK;
  CLR_MOSI;  
  P1OUT=0X00;
  P1IE|=0X80;
  P1IES|=0X80;
  P1IFG=0X00;
  //_EINT();
}
void init_clock()
{
  BCSCTL1=0X80;
  do
  {IFG1&=~OFIFG;
  delay(159);}
  while(IFG1&OFIFG);
  BCSCTL2=SELM0+SELM1;
  
}
void init_uart()
{
  P3SEL|=0X30;
  UCTL0=SWRST;
  ME1|=UTXE0+URXE0;                     //使能发送接收
  UCTL0|=CHAR;
  UTCTL0=SSEL0;
  U0BR0=0X03;
  U0BR1=0X00;
  U0MCTL=0X4A;   
  UCTL0&=~SWRST;                  
  IE1|=URXIE0+UTXIE0;                   //使能中断
}
unsigned char SPI_Write(unsigned char byte)
{
  int i;
  for(i=0;i<8;i++)
  {
    if(byte&0x80!=0)
      SET_MOSI;
    else
      CLR_MOSI;
    byte=byte<<1;
    SET_SCK;
    if(P5IN&0x40)
      byte|=0x01;
    else
      byte&=0xfe;
    CLR_SCK;
   
  }
  return(byte);
}

void StandbyI()
{
  SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
}
void StandbyII()
{
  SPI_RW_Reg(WRITE_REG+CONFIG,0X3E);
  SPI_RW(FLUSH_TX);
  delay(1000);
  SET_CE;
}
void setupnrf()
{
  SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);
  SPI_RW_Reg(WRITE_REG+SETUP_AW,0X03);
}

unsigned char SPI_RW(unsigned char byte)
{
  int i;
for(i=0;i<8;i++)
  {  
    if(byte&0x80)
    P5OUT|=0X02;
  else
    P5OUT&=0XFD;
  byte<<=1;
  _NOP();_NOP();_NOP();
   _NOP();_NOP();_NOP();
  P5OUT|=0X08;
  _NOP();_NOP();_NOP();
  _NOP();_NOP();_NOP();
  _NOP();
  if(P5IN&0X04)
    byte|=0x01;
  else
    byte&=0xfe;
    _NOP();_NOP();_NOP();
     _NOP();_NOP();_NOP();
  P5OUT&=0XF7;
  }
  return(byte);  
}
unsigned char SPI_RW_Reg(unsigned char reg,unsigned char value)
{
    unsigned char status;
    SET_CSN;
    CLR_CSN;
    status=SPI_RW(reg);
    SPI_RW(value);
    SET_CSN;
    return(status);
}
unsigned char SPI_Read(unsigned char reg)
{
  unsigned char reg_val;
  SET_CSN;
  CLR_CSN;
  SPI_RW(reg);
  reg_val=SPI_RW(0);
  SET_CSN;
  return(reg_val);
}
unsigned char SPI_Write_Buf(unsigned char reg,unsigned char *pBuf,unsigned char bytes)
{
  unsigned char status,byte_ctr;
  SET_CSN;
  CLR_CSN;
  status=SPI_RW(reg);
  for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
    SPI_RW(*pBuf++);
  SET_CSN;
  return(status);
}
unsigned char SPI_Read_Buf(unsigned char reg,unsigned char *pBuf,unsigned char bytes)
{
  unsigned char status,byte_ctr;
  SET_CSN;
  CLR_CSN;
  status=SPI_RW(reg);
  for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  {
    pBuf[byte_ctr]=SPI_RW(0);
  }
  SET_CSN;
  return(status);
}
void TX_Mode(void)
{
  //P1OUT&=0XBF;          //P1.6=0
  CLR_CE;        //P5.4=0
  SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,ADR_WIDTH);
  SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,ADR_WIDTH);
  SPI_Write_Buf(WR_TX_PLOAD,tx_buf,PLOAD_WIDTH);  
  SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
  SPI_RW_Reg(WRITE_REG+EN_AA,0X00);
  SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);
  SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1a);
  SPI_RW_Reg(WRITE_REG+RF_CH,0X00);
  SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);

  //P1OUT|=0X40;          //P1.6=1
  SET_CE;        //P5.4=1
  delay(159);
  CLR_CE;
}
void RX_Mode(void)
{
  //P1OUT&=0XBF;          //P1.6=0
  CLR_CE;            //P5.4=0
  SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,Local_ADDRESS,ADR_WIDTH);
  SPI_RW_Reg(WRITE_REG+EN_AA,0X00);
  SPI_RW_Reg(WRITE_REG+EN_RXADDR, 0x01);
  SPI_RW_Reg(WRITE_REG+SETUP_AW,0X03);
  SPI_RW_Reg(WRITE_REG+RF_CH,0X00);
  SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);
  SPI_RW_Reg(WRITE_REG+RX_PW_P0,PLOAD_WIDTH);  
  SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
  //P1OUT|=0X40;          //P1.6=1
SET_CE;         //P5.4=1
delay(159);
}
void flash_write(unsigned char byte)
{
  /*unsigned char data[24];
  for(int i=0;i<24;i++)
  {
    data=i;
  }*/

  unsigned char *tp;//,*write_ptr;
  tp=(unsigned char *)0x1000;
  FCTL2=FWKEY+FSSEL0+FN0;
  FCTL3=FWKEY;
  //*tp=1;
  FCTL1=FWKEY+WRT;
  //for(i=0;i<24;i++)
  //{
    *tp=byte;
    //tp++;
  //}
  FCTL1=FWKEY;
  FCTL3=FWKEY+LOCK;
}
void delay(int a)
{
  while(a--){}
}
void IRQEINT()
{
  sta=SPI_Read(STATUS);
  int i;
  if(RX_DR)
  {
    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,20);
    flash_write( rx_buf[0]);
    for(i=0;i<PLOAD_WIDTH;i++)
    {TXBUF0=rx_buf;
    while((UTCTL0&TXEPT)!=TXEPT);}
    flag=1;
    //TX_Mode();
    delay(1000);
  }
  else
    flag=0;
  SPI_RW(FLUSH_RX);
  SPI_RW_Reg(WRITE_REG+STATUS,sta);
  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,20);         //就是一定要加这句话才能继续接收,要不RX_DR就是0不产生标志位了
  sta=SPI_Read(STATUS);
}
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  //int i;
  init_chip();
  init_clock();
  init_uart();

  StandbyI();
  SPI_RW(FLUSH_RX);
  //_EINT();
  //RX_Mode();
  while(1)
  {
   RX_Mode();
   IRQEINT();
   //sta=SPI_Read(STATUS);
   }
}

出0入0汤圆

发表于 2010-12-21 09:51:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-13 23:18:03 | 显示全部楼层
查看FIFO_STATUS寄存器是否还有数据 是否使用了三级FIFO 当你接收到第一个FIFO时 读取的时候第二个FIFO已经到了 悬挂起来了
需要查看FIFO_STATUS 决定是否再次读取数据 用串口查看下数据是否重复了  而且看下是否启动了 使用上包数据那个寄存器 那个需要关闭 强制刷新FIFO也行

出0入0汤圆

发表于 2011-2-13 23:40:29 | 显示全部楼层
24L01很不给力啊,为什么还有那么多人在尝试


点击此处下载 ourdev_612616Z6NMKL.pdf
(文件大小:716K)
(原文件名:UTC-1212无线模块使用文档2.0.pdf)
点击此处下载 ourdev_612617SAH7NP.pdf
(文件大小:1.18M)
(原文件名:UTC-2303使用手册2.0.pdf)
点击此处下载 ourdev_612030EKE7Y1.rar(文件大小:11K)
(原文件名:UTC1212-C51参考程序.rar)

点击此处下载 ourdev_612031XYUJW9.rar(文件大小:4.63M)
(原文件名:UTC2303驱动.rar)

点击此处下载 ourdev_612032HBJX03.rar(文件大小:311K)
(原文件名:UTC-121配置软件.rar)

出0入0汤圆

发表于 2011-2-13 23:55:26 | 显示全部楼层
回复【楼主位】zzz1367   
-----------------------------------------------------------------------

谢谢分享

出0入0汤圆

发表于 2011-2-14 22:44:34 | 显示全部楼层
太感谢LZ了,我最近学习用24L01,也是发送上百次才有几次接收到。
104真的神了,并联一个马上就和谐鸟

出0入0汤圆

发表于 2011-7-10 16:57:07 | 显示全部楼层
在哪里并联电容啊?楼上说清楚点吧

出0入0汤圆

 楼主| 发表于 2011-7-25 16:22:41 | 显示全部楼层
回复【13楼】xumengkai
-----------------------------------------------------------------------

在1117-3.3的输出端加了个104,奇迹发生了,误码率为千分之一以下。
晕啊,一颗104(主要是接收板上的那颗),

在3.3V电源处,并联一个104,接收板 那块。

发送板,好像不加问题也不大。

出0入0汤圆

发表于 2011-11-6 22:54:26 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 12:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表