微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于nrf24l01程序,请帮我看看我的程序错在那里吧

关于nrf24l01程序,请帮我看看我的程序错在那里吧

时间:10-02 整理:3721RD 点击:
发送部分
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
#define uint unsigned int

//*****************************NRF24L01寄存器指令****************************
#define READ_REG       0x00  //读寄存器指令
#define WRITE_REG      0x20  //写寄存器指令
#define RD_RX_PLOAD    0x61  //读取接收数据指令
#define WR_TX_PLOAD    0xA0  //写待发数据指令
#define FLUSH_TX       0xE1  //清除发送FIFO寄存器
#define FLUSH_RX       0xE2  //清除接收FIFO寄存器
#define REUSE_TX_PL    0xE3  //定义重复装载数据指令
#define NOP            0xFF  //保留
//*****************************NRF24L01寄存器地址****************************
#define CONFIG         0x00  //配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA          0x01  //自动应答功能设置
#define EN_RXADDR      0x02  //可用信道设置
#define SETUP_AW       0x03  //收发地址宽度设置
#define SETUP_RETR     0x04  //自动重发功能设置
#define RF_CH          0x05  //工作频率设置
#define RF_SETUP       0x06  //发射速率,功耗功能设置
#define STATUS         0x07  //状态寄存器
#define OBSERVE_TX     0x08  //发送监测功能
#define CD             0x09  //地址检测
#define RX_ADDR_P0     0x0A  //频道0接收数据地址
#define RX_ADDR_P1     0x0B  //频道1接收数据地址
#define RX_ADDR_P2     0x0C  //频道2接收数据地址
#define RX_ADDR_P3     0x0D  //频道3接收数据地址
#define RX_ADDR_P4     0x0E  //频道4接收数据地址
#define RX_ADDR_P5     0x0F  //频道5接收数据地址
#define TX_ADDR        0x10  //发送地址寄存器
#define RX_PW_P0       0x11  //接收频道0接收数据长度
#define RX_PW_P1       0x12  //接收频道1接收数据长度
#define RX_PW_P2       0x13  //接收频道2接收数据长度
#define RX_PW_P3       0x14  //接收频道3接收数据长度
#define RX_PW_P4       0x15  //接收频道4接收数据长度
#define RX_PW_P5       0x16  //接收频道5接收数据长度
#define FIFO_STATUS    0x17  //FIFO栈入栈出状态寄存器设置
//***********************NRF24L01/NRF24L01+ IO端口定义***********************
sbit MISO = P2^4;
sbit MOSI = P2^2;
sbit SCK  = P2^5;
sbit CSN  = P2^1;
sbit CE   = P2^0;
sbit IRQ  =        P2^3;
//*************************NRF24L01收发数据长度设置************************
#define tr_con        2     //设置每次发送接收数据字节数(1-32)
//***************************收发数据缓冲区********************************
uchar txbuf[tr_con];
uchar rxbuf[tr_con];
//**************************NRF24L01接收地址设置***************************
//数据通道0有40bit可配置地址
//数据通道1-5地址为:32bit共用地址+8bit各自地址(最低字节)
//数据通道1-5各自地址必须不同
uchar code r_add0[]={0x05,0x06,0x07,0x08,0x09};  //实际地址:09-08-07-06-05
uchar code r_add1[]={0x15,0x06,0x07,0x08,0x09};  //实际地址:19-18-17-16-15
uchar code r_add2[]={0x25};                      //实际地址:19-18-17-16-25
uchar code r_add3[]={0x35};                      //实际地址:19-18-17-16-35
uchar code r_add4[]={0x45};                      //实际地址:19-18-17-16-45
uchar code r_add5[]={0x55};                      //实际地址:19-18-17-16-55
//**************************串口通信相关变量*******************************
uchar flag2;
uchar i=0;
//*************************子函数申明**************************************
uchar ADC0832(uint channel);
void delay1ms(unsigned int j);
void delay_us(uchar n);
void init_nrf24l01(void);
void set_nrf24l01_rx_mode(void);
uchar nrf24l01_rdat(uchar *r_buffer);
void nrf24l01_tdat(uchar *t_buffer);
void senddata_uart(uchar dc);
uchar spi_rw(uchar ddt);
uchar spi_read_reg(uchar reg);
void spi_write_reg(uchar reg,uchar value);
void spi_read_buf(uchar reg,uchar *pbuf,uchar con);
void spi_write_buf(uchar reg,uchar *pbuf,uchar con);
//*********************************主函数************************************
void main(void)
{
  P2=0xff;
  delay1ms(60);
  init_nrf24l01();    //初始化NRF24L01/NRF24L01+
  delay1ms(600);
  delay1ms(100);
  while(1)
  {
                 //当收到串口数据后发送
             txbuf[0]=0x0f;
          txbuf[1]=0xf0;
      nrf24l01_tdat(txbuf);       //发送数据
          delay1ms(600);
  }
}

//***************************************************************************
//nrf24l01初始化
//***************************************************************************
void init_nrf24l01(void)
{
  CSN=1;   //Spi disable
  SCK=0;   //Spi clock line init low
  CE=0;    //StandBy I模式
  spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,sizeof(r_add0)); //设置数据通道0接收地址
  spi_write_reg(WRITE_REG+RX_PW_P0,tr_con); //设置接收数据通道0宽度(1-32byte)
  spi_write_reg(WRITE_REG+EN_AA,0x00);      //通道0,1,2,3,4,5自动ACK应答不允许
  spi_write_reg(WRITE_REG+EN_RXADDR,0x01);  //允许接收通道0,1,2,3,4,5地址
  spi_write_reg(WRITE_REG+SETUP_AW,0x03);  //5字节宽地址
  spi_write_reg(WRITE_REG+SETUP_RETR,0x00);  //禁止自动重发
  spi_write_reg(WRITE_REG+RF_CH,0);         //设置信道工作为2.4GHZ,收发必须一致
  spi_write_reg(WRITE_REG+RF_SETUP,0x07);   //设置发射速率为1MHZ,发射功率为最大值0dB
  //spi_write_reg(,0x01);  //允许接收通道0,1,2,3,4,5地址
  spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,5);//写通道0接收地址
  spi_write_buf(WRITE_REG+TX_ADDR,r_add1,5);//写通道0接收地址
  spi_write_reg(WRITE_REG+RX_PW_P0,0x01);  //禁止自动重发
}

//***************************************************************************
//读取tx_buf数据通过nrf24l01发送
//***************************************************************************
void nrf24l01_tdat(uchar *t_buffer)
{
  uchar sta;
  uchar t_end=0;
  CE=0;                               //StandBy I模式
//  spi_write_buf(WRITE_REG+TX_ADDR,r_add0,sizeof(r_add0));  //设置本机发送地址
  spi_write_buf(WR_TX_PLOAD,t_buffer,tr_con); //装载数据
//  spi_write_reg(WRITE_REG+CONFIG,0x0e);  //IRQ收发完成中断响应,16位CRC,主发送
  spi_write_reg(WRITE_REG+STATUS,0xff); //写1清除中断标志
  CE=1;                               //置高CE,激发数据发送
  delay_us(10);                       //保持10us秒以上
  do
  {
    sta=spi_read_reg(STATUS);   //读取状态寄存其来判断数据接收状况
    if((sta&0x20)!=0)           //发送完毕中断
    {
      spi_write_reg(WRITE_REG+STATUS,0xff); //写1清除中断标志
      CSN=0;
      spi_rw(FLUSH_TX);         //清空FIFO
      CSN=1;
      t_end=1;
    }
  }while(t_end==0);             //等待发送完毕
}
//*************************延时 n*1ms********************
void delay1ms(unsigned int j)
{
  unsigned int i;
  for (;j>0;j--)
  {
    for (i=0;i<124;i++)
    {;}
  }
}
//***************************************************************************
//短延时函数
//***************************************************************************
void delay_us(uchar n)
{
  for (;n>0;n--)
    _nop_();
}



uchar spi_rw(uchar ddt)
{
  uchar c;
  for(c=8;c!=0;c--)     //output 8bit
  {
    MOSI=(ddt&0x80);    //output'ddt', MSB to MOSI
    ddt=(ddt<<1);       //shift next bit into MSB
    SCK=1;              //Set SCK high
    ddt|=MISO;          //capture current MISO bit
    SCK=0;              //then set SCK low again
  }
  return(ddt);          //return read ddt
}
//***************************************************************************
//写NRF24L01寄存器函数
//***************************************************************************
void spi_write_reg(uchar reg,uchar value)
{
  CSN=0;                //CSN low, initialize SPI communication
  spi_rw(reg);          //select register
  spi_rw(value);        //and write value to it
  CSN=1;                //CSN high, terminate SPI communication
}
//***************************************************************************
//连续写数据,reg:寄存器地址,pbuf:待写入数据地址,con:写入数据的个数
//***************************************************************************
void spi_write_buf(uchar reg,uchar *pbuf,uchar con)
{
  uchar c;
  CSN=0;                //CSN low, initialize SPI communication
  spi_rw(reg);          //select register
  for(c=0;c<con;c++)
  {
    spi_rw(*pbuf++);    //and write value to it
  }
  CSN=1;                //CSN high, terminate SPI communication
}
//***************************************************************************
//读NRF24L01寄存器函数
//***************************************************************************
uchar spi_read_reg(uchar reg)
{
  uchar reg_val;
  CSN=0;                //CSN low, initialize SPI communication
  spi_rw(reg);          //Select register to read from
  reg_val=spi_rw(0);    //then read registervalue
  CSN=1;                //CSN high, terminate SPI communication
  return(reg_val);      //return register value
}
//***************************************************************************
//连续读数据,reg:寄存器地址,pbuf:待读出数据地址,con:读出数据的个数
//***************************************************************************
void spi_read_buf(uchar reg,uchar *pbuf,uchar con)
{
  uchar c;
  CSN=0;                //CSN low, initialize SPI communication
  spi_rw(reg);          //Select register to read from
  for(c=0;c<con;c++)
  {
    pbuf[c]=spi_rw(0);  //发送哑数据,读取spi总线值
  }
  CSN=1;                //CSN high, terminate SPI communication
}

接受部分
#include <reg51.h>#include <intrins.h>typedef unsigned char uchar;
//*****************************NRF24L01寄存器指令****************************#define READ_REG       0x00  //读寄存器指令#define WRITE_REG      0x20  //写寄存器指令#define RD_RX_PLOAD    0x61  //读取接收数据指令#define WR_TX_PLOAD    0xA0  //写待发数据指令#define FLUSH_TX       0xE1  //清除发送FIFO寄存器#define FLUSH_RX       0xE2  //清除接收FIFO寄存器#define REUSE_TX_PL    0xE3  //定义重复装载数据指令#define NOP            0xFF  //保留//*****************************NRF24L01寄存器地址****************************#define CONFIG         0x00  //配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA          0x01  //自动应答功能设置#define EN_RXADDR      0x02  //可用信道设置#define SETUP_AW       0x03  //收发地址宽度设置#define SETUP_RETR     0x04  //自动重发功能设置#define RF_CH          0x05  //工作频率设置#define RF_SETUP       0x06  //发射速率,功耗功能设置#define STATUS         0x07  //状态寄存器#define OBSERVE_TX     0x08  //发送监测功能#define CD             0x09  //地址检测#define RX_ADDR_P0     0x0A  //频道0接收数据地址#define RX_ADDR_P1     0x0B  //频道1接收数据地址#define RX_ADDR_P2     0x0C  //频道2接收数据地址#define RX_ADDR_P3     0x0D  //频道3接收数据地址#define RX_ADDR_P4     0x0E  //频道4接收数据地址#define RX_ADDR_P5     0x0F  //频道5接收数据地址#define TX_ADDR        0x10  //发送地址寄存器#define RX_PW_P0       0x11  //接收频道0接收数据长度#define RX_PW_P1       0x12  //接收频道1接收数据长度#define RX_PW_P2       0x13  //接收频道2接收数据长度#define RX_PW_P3       0x14  //接收频道3接收数据长度#define RX_PW_P4       0x15  //接收频道4接收数据长度#define RX_PW_P5       0x16  //接收频道5接收数据长度#define FIFO_STATUS    0x17  //FIFO栈入栈出状态寄存器设置//***********************NRF24L01/NRF24L01+ IO端口定义***********************sbit MISO = P0^2;sbit MOSI = P0^4;sbit SCK  = P0^1;sbit CSN  = P0^5;sbit CE   = P0^0;sbit IRQ  =        P0^3;//*************************NRF24L01收发数据长度设置************************#define tr_con        2     //设置每次发送接收数据字节数(1-32)//***************************收发数据缓冲区********************************uchar txbuf[tr_con];uchar rxbuf[tr_con];
//**************************NRF24L01接收地址设置***************************//数据通道0有40bit可配置地址//数据通道1-5地址为:32bit共用地址+8bit各自地址(最低字节)//数据通道1-5各自地址必须不同uchar code r_add0[]={0x05,0x06,0x07,0x08,0x09};  //实际地址:09-08-07-06-05uchar code r_add1[]={0x15,0x06,0x07,0x08,0x09};  //实际地址:19-18-17-16-15uchar code r_add2[]={0x25};                      //实际地址:19-18-17-16-25uchar code r_add3[]={0x35};                      //实际地址:19-18-17-16-35uchar code r_add4[]={0x45};                      //实际地址:19-18-17-16-45uchar code r_add5[]={0x55};                      //实际地址:19-18-17-16-55//**************************串口通信相关变量*******************************uchar flag2;uchar i=0;//*************************子函数申明**************************************void delay1ms(unsigned int j);void delay_us(uchar n);void init_nrf24l01(void);void set_nrf24l01_rx_mode(void);uchar nrf24l01_rdat(uchar *r_buffer);void nrf24l01_tdat(uchar *t_buffer);void senddata_uart(uchar dc);uchar spi_rw(uchar ddt);uchar spi_read_reg(uchar reg);void spi_write_reg(uchar reg,uchar value);void spi_read_buf(uchar reg,uchar *pbuf,uchar con);void spi_write_buf(uchar reg,uchar *pbuf,uchar con);//*********************************主函数************************************void main(void){   P0=0xff;  delay1ms(60);  init_nrf24l01();    //初始化NRF24L01/NRF24L01+
  delay1ms(600);  delay1ms(100);  P1=0;  while(1)  {
    //=========================接收数据=====================================     set_nrf24l01_rx_mode();         P0=0xff;     if(nrf24l01_rdat(rxbuf))   /*******************用接收到的数据rxbuf[1]调整速度***************/     {              P2=rxbuf[0];

         }         else P1=0x0f;  }}
//***************************************************************************//nrf24l01初始化//***************************************************************************void init_nrf24l01(void){  CSN=1;   //Spi disable  SCK=0;   //Spi clock line init low  CE=0;    //StandBy I模式
  spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,sizeof(r_add0)); //设置数据通道0接收地址  spi_write_reg(WRITE_REG+RX_PW_P0,tr_con); //设置接收数据通道0宽度(1-32byte)
  spi_write_reg(WRITE_REG+EN_AA,0x00);      //通道0,1,2,3,4,5自动ACK应答不允许  spi_write_reg(WRITE_REG+EN_RXADDR,0x01);  //允许接收通道0,1,2,3,4,5地址  spi_write_reg(WRITE_REG+SETUP_AW,0x03);  //5字节宽地址  spi_write_reg(WRITE_REG+SETUP_RETR,0x00);  //禁止自动重发  spi_write_reg(WRITE_REG+RF_CH,0);         //设置信道工作为2.4GHZ,收发必须一致  spi_write_reg(WRITE_REG+RF_SETUP,0x07);   //设置发射速率为1MHZ,发射功率为最大值0dB  //spi_write_reg(,0x01);  //允许接收通道0,1,2,3,4,5地址  spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,5);//写通道0接收地址  spi_write_buf(WRITE_REG+TX_ADDR,r_add1,5);//写通道0接收地址  spi_write_reg(WRITE_REG+RX_PW_P0,0x01);  //禁止自动重发}
//***************************************************************************//设置nrf24l01为接收模式//***************************************************************************void set_nrf24l01_rx_mode(void){  CE=0;             //StandBy I模式  spi_write_reg(WRITE_REG+CONFIG,0xff);  //没有任何中断响应,16位CRC,f主接收e主发送  CE=1;  delay_us(130);    //保持10us秒以上}
//***************************************************************************//读取nrf24l01接收数据放入r_buffer缓冲区//***************************************************************************uchar nrf24l01_rdat(uchar *r_buffer){  uchar revale=0;  uchar sta=0;  uchar rx_p;
  sta=spi_read_reg(STATUS);   //读取状态寄存其来判断数据接收状况  if((sta&0x40)!=0)           //判断是否接收到数据  {            rx_p=sta&0x0e;            //获取通道号    CE=0;                     //StandBy I模式    spi_read_buf(RD_RX_PLOAD,r_buffer,tr_con);//读取RX_FIFO    revale=1;                 //读取数据完成标志    spi_write_reg(WRITE_REG+STATUS,0xff); //写1清除中断标志    CSN=0;    spi_rw(FLUSH_RX);         //清空FIFO    CSN=1;  }  return revale;}

//*************************延时 n*1ms********************void delay1ms(unsigned int j){  unsigned int i;  for (;j>0;j--)  {    for (i=0;i<124;i++)    {;}  }}
//***************************************************************************//短延时函数//***************************************************************************void delay_us(uchar n){  for (;n>0;n--)    _nop_();}



uchar spi_rw(uchar ddt){  uchar c;  for(c=8;c!=0;c--)     //output 8bit  {    MOSI=(ddt&0x80);    //output'ddt', MSB to MOSI    ddt=(ddt<<1);       //shift next bit into MSB    SCK=1;              //Set SCK high    ddt|=MISO;          //capture current MISO bit    SCK=0;              //then set SCK low again  }  return(ddt);          //return read ddt}
//***************************************************************************//写NRF24L01寄存器函数//***************************************************************************void spi_write_reg(uchar reg,uchar value){  CSN=0;                //CSN low, initialize SPI communication  spi_rw(reg);          //select register  spi_rw(value);        //and write value to it  CSN=1;                //CSN high, terminate SPI communication}
//***************************************************************************//连续写数据,reg:寄存器地址,pbuf:待写入数据地址,con:写入数据的个数//***************************************************************************void spi_write_buf(uchar reg,uchar *pbuf,uchar con){  uchar c;  CSN=0;                //CSN low, initialize SPI communication  spi_rw(reg);          //select register  for(c=0;c<con;c++)  {    spi_rw(*pbuf++);    //and write value to it  }  CSN=1;                //CSN high, terminate SPI communication}
//***************************************************************************//读NRF24L01寄存器函数//***************************************************************************uchar spi_read_reg(uchar reg){  uchar reg_val;  CSN=0;                //CSN low, initialize SPI communication  spi_rw(reg);          //Select register to read from  reg_val=spi_rw(0);    //then read registervalue  CSN=1;                //CSN high, terminate SPI communication  return(reg_val);      //return register value}
//***************************************************************************//连续读数据,reg:寄存器地址,pbuf:待读出数据地址,con:读出数据的个数//***************************************************************************void spi_read_buf(uchar reg,uchar *pbuf,uchar con){  uchar c;  CSN=0;                //CSN low, initialize SPI communication  spi_rw(reg);          //Select register to read from  for(c=0;c<con;c++)  {    pbuf[c]=spi_rw(0);  //发送哑数据,读取spi总线值  }  CSN=1;                //CSN high, terminate SPI communication}

出现啥问题了啊?

求帮忙看一下啊

哥们儿  这程序太长了 没办法一直看啊 建议你找一个人家写好的驱动,直接拿过来用就可以了。有句话说:站在巨人的肩上,你会看的更远!

可是网上的好像不怎么好用啊,你有没有自己写好的能用的啊?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top