搜索
bottom↓
回复: 9

求助NRF24L01程序,试了好久也没有反应

[复制链接]

出0入0汤圆

发表于 2013-5-27 10:25:59 | 显示全部楼层 |阅读模式
发射程序
#include <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned char uint;


//****************************************IO端口定义***************************************


sbit        CE            =P1^0;
sbit        SCK            =P1^1;
sbit         MISO        =P1^2;
sbit        IRQ                =P1^3;
sbit         MOSI        =P1^4;
sbit        CSN                =P1^5;
sbit    DQ=P2^0;

uchar  disdata[5];
uint tvalue,temp;
uchar tflag;//温度正负标志
uchar temp1;
float f_temp;
uchar flag;

void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{  
    uint i,j;
      for(i=0;i<ms;i++)
      for(j=0;j<100;j++);
}


void delay_10us()         //10us延时函数
{
        unsigned char i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}


//********************************************NRF24L01*************************************
#define TX_ADR_WIDTH    5           // 5 uints TX address width
#define RX_ADR_WIDTH    5           // 5 uints RX address width
#define TX_PLOAD_WIDTH  5        // 20 uints TX payload
#define RX_PLOAD_WIDTH  5        // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
//***************************************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          // 保留
//*************************************SPI(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  // 接收频道0接收数据长度
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
#define RX_PW_P4        0x15  // 接收频道0接收数据长度
#define RX_PW_P5        0x16  // 接收频道0接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************长延时*****************************************
void Delay(unsigned int s)
{
        unsigned int i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
}
//******************************************************************************************
uint         bdata sta;   //状态标志
sbit        RX_DR        =sta^6;
sbit        TX_DS        =sta^5;
sbit        MAX_RT        =sta^4;
/******************************************************************************************
/*延时函数
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
        for(;n>0;n--)
                _nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
    delay1ms(1);
        CE=0;    // chip enable
        CSN=1;   // Spi disable
        SCK=0;   // Spi clock line init high
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许       
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                   // 16位CRC        ,主发射
}
/****************************************************************************************************
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
        uint bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
           {
                MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
                uchar = (uchar << 1);           // shift next bit into MSB..
                SCK = 1;                      // Set SCK high..
                uchar |= MISO;                         // capture current MISO bit
                SCK = 0;                              // ..then set SCK low again
           }
    return(uchar);                             // return read uchar
}
/****************************************************************************************************
/*函数:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI时序
/****************************************************************************************************/
uchar SPI_Read(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
}
/****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
        uint status;
       
        CSN = 0;                   // CSN low, init SPI transaction
        status = SPI_RW(reg);      // select register
        SPI_RW(value);             // ..and write value to it..
        CSN = 1;                   // CSN high again
       
        return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;                                    // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);                       // Select register to write to and read status uchar
       
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
                pBuf[uchar_ctr] = SPI_RW(0);    //
       
        CSN = 1;                           
       
        return(status);                    // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;            //SPI使能      
        status = SPI_RW(reg);   
        for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
                SPI_RW(*pBuf++);
        CSN = 1;           //关闭SPI
        return(status);    //
}

/***********************************************************************************************************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
        CE=0;                        //StandBy I模式       
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据       
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
        CE=1;                 //置高CE,激发数据发送
        delay1ms(1);
}

/*检测应答信号*/
uchar Check_Ack()
{
        sta=SPI_Read(STATUS);/*读取寄存状态*/
        if(TX_DS)/*如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值*/
        {
           SPI_RW_Reg(WRITE_REG+STATUS,0xfe);
           CSN=0;
           SPI_RW(FLUSH_TX);
           CSN=1;
           return 0;
         }
         else
         return 1;
}
void delay_1us(unsigned int i)//延时1微秒
{
   while(i--);
}

void ds1820_rst()/*ds1820复位*/
{
    unsigned char x=0;
        DQ = 1;          //DQ复位
        delay_1us(4); //延时
        DQ = 0;          //DQ拉低
        delay_1us(100); //精确延时大于480us
        DQ = 1;          //拉高
        delay_1us(40);
}

uchar ds1820_rd()/*读数据*/
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {   DQ = 0; //给脉冲信号
            dat>>=1;
            DQ = 1; //给脉冲信号
            if(DQ)
            dat|=0x80;
            delay_1us(10);
        }
   return(dat);
}
void ds1820_wr(uchar dat)/*写数据*/
{
    unsigned char i=0;
    for (i=8; i>0; i--)
           {
             DQ = 0;
             DQ = dat&0x01;
             delay_1us(10);
             DQ = 1;
             dat>>=1;
           }
}
read_temp()/*读取温度值并转换*/
{
        uchar a,b;
        ds1820_rst();   
        ds1820_wr(0xcc);//*跳过读序列号*/
        ds1820_wr(0x44);//*启动温度转换*/
        ds1820_rst();   
        ds1820_wr(0xcc);//*跳过读序列号*/
        ds1820_wr(0xbe);//*读取温度*/
        a=ds1820_rd();//温度低8位
        b=ds1820_rd();//温度高8位
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
    if(tvalue<0x0fff)
    tflag=0;
    else
    {
            tvalue=~tvalue+1;
            tflag=1;
    }
        //tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
        f_temp=tvalue*0.0625;
        tvalue=f_temp*10+0.5;//后面小数取一位,并四舍五入
        f_temp=f_temp+0.05;
        return(tvalue);
}

/*******************************************************************/
void ds1820_disp()//温度值显示
{
     uchar flagdat;
     disdata[0]=tvalue/1000+0x30;//百位数
     disdata[1]=tvalue%1000/100+0x30;//十位数
     disdata[2]=tvalue%100/10+0x30;//个位数
         disdata[3]=0xdf;//小数点
     disdata[4]=tvalue%10+0x30;//小数位
   
     if(tflag==0)
             flagdat=0x2b;//正温度显示+

     else
       flagdat=0x2d;//负温度显示负号:-
     if(disdata[0]==0x30)
     {
                 disdata[0]=0x20;//如果百位为0,不显示
                   if(disdata[1]==0x30)
            {
                        disdata[1]=0x20;//如果百位为0,十位为0也不显示
            }
           }
   /* wr_com(0x80);
    wr_dat(flagdat);//显示符号位
    wr_dat(disdata[0]);//显示百位
    wr_dat(disdata[1]);//显示十位
    wr_dat(disdata[2]);//显示个位
    wr_dat(0x2e);//显示小数点
    wr_dat(disdata[3]);//显示小数位
    wr_dat(0xdf);//显示du
    wr_dat(0x43);//显示du C*/
}

void main(void)
{
         init_NRF24L01();
//     lcd_init();
         delay1ms(10);
         nRF24L01_TxPacket(disdata);
        while(1)
        {
                 nRF24L01_TxPacket(disdata);
                delay1ms(100);
                while(Check_Ack());

       
        }
       
}

接收程序
#include <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;
//****************************************NRF24L01端口定义***************************************
sbit        CE            =P1^0;
sbit        SCK            =P1^1;
sbit         MISO        =P1^2;
sbit        IRQ                =P1^3;
sbit         MOSI        =P1^4;
sbit        CSN                =P1^5;
sbit  RS=P2^6;
sbit  EN=P2^7;
//*******************************************************************************************
#define TX_ADR_WIDTH    5           // 5 uints TX address width
#define RX_ADR_WIDTH    5           // 5 uints RX address width
#define TX_PLOAD_WIDTH  5         // 20 uints TX payload
#define RX_PLOAD_WIDTH  5          // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
//***************************************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          // 保留
//*************************************SPI(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  // 接收频道0接收数据长度
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
#define RX_PW_P4        0x15  // 接收频道0接收数据长度
#define RX_PW_P5        0x16  // 接收频道0接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);


//****************************************IO端口定义***************************************
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{  
    uint i,j;
      for(i=0;i<ms;i++)
      for(j=0;j<100;j++);
}


void delay_10us()         //10us延时函数
{
        unsigned char i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}

void wr_com(unsigned char com)//写指令//
{
   delay1ms(2);
   RS=0;
//RW=0;
   EN=0;
   P0=com;
   delay1ms(2);
   EN=1;
   delay1ms(2);
   EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{
   delay1ms(2);;
   RS=1;
  // RW=0;
   EN=0;
   P0=dat;
   delay1ms(2);
   EN=1;
   delay1ms(2);
   EN=0;
}
void lcd_init()//初始化设置//
{
   delay1ms(5);
   wr_com(0x38);delay1ms(2);//设置8位格式,2行,5*7
   wr_com(0x08);delay1ms(2);//读或写一个字符后地址指针加1,且光标加1
   wr_com(0x01);delay1ms(2);//清屏
   wr_com(0x06);delay1ms(2);//设置输入方式,增量不移位
   wr_com(0x0c);delay1ms(2);//关光标,不闪烁
}


void ShowChar(uchar pos,uchar c)  //显示单个字符
{
        unsigned char p;
        if (pos>=0x10)
            p=pos+0xb0; //是第二行则命令代码高4位为0xc
        else
            p=pos+0x80; //是第二行则命令代码高4位为0x8
                 wr_com(p);//写命令
                wr_dat(c);   //写数据
}

void ShowString (uchar line,char *ptr)          //显示字符串
{
         uchar l,*p;
         p=ptr;
         l=line<<4;
         while((*p)!='\0')
          {
            ShowChar(l++,*(p));
                p++;
          }
}
//*****************************************长延时*****************************************
void Delay(unsigned int s)
{
        unsigned int i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
}
//******************************************************************************************
uint         bdata sta;   //状态标志
sbit        RX_DR        =sta^6;
sbit        TX_DS        =sta^5;
sbit        MAX_RT        =sta^4;
/******************************************************************************************
/*延时函数
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
        for(;n>0;n--)
                _nop_();
}
void init_NRF24L01(void)
{
    delay1ms(1);
        CE=0;    // chip enable
        CSN=1;   // Spi disable
        SCK=0;   // Spi clock line init high
//        IRQ=1;
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许       
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,接收模式
}

/****************************************************************************************************
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
        uint bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
           {
                MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
                uchar = (uchar << 1);           // shift next bit into MSB..
                SCK = 1;                      // Set SCK high..
                uchar |= MISO;                         // capture current MISO bit
                SCK = 0;                              // ..then set SCK low again
           }
    return(uchar);                             // return read uchar
}
/****************************************************************************************************
/*函数:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI时序
/****************************************************************************************************/
uchar SPI_Read(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
}
/****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
        uint status;
       
        CSN = 0;                   // CSN low, init SPI transaction
        status = SPI_RW(reg);      // select register
        SPI_RW(value);             // ..and write value to it..
        CSN = 1;                   // CSN high again
       
        return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;                                    // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);                       // Select register to write to and read status uchar
       
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
                pBuf[uchar_ctr] = SPI_RW(0);    //
       
        CSN = 1;                           
       
        return(status);                    // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;            //SPI使能      
        status = SPI_RW(reg);   
        for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
                SPI_RW(*pBuf++);
        CSN = 1;           //关闭SPI
        return(status);    //
}

}/****************************************************************************************************/
/*函数:void SetRX_Mode(void)
/*功能:数据接收配置
/****************************************************************************************************/
void SetRX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
        CE = 1;
        //inerDelay_us(200);
        delay1ms(1);
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
    unsigned char revale=0;
        sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
        if(RX_DR)                                // 判断是否接收到数据
        {
            CE = 0;                         //SPI使能
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
                revale =1;                        //读取数据完成标志
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        return revale;
}
//************************************串口初始化*********************************************************
void StartUART( )
{                                                          //波特率9600
     SCON = 0x50;
     TMOD = 0x20;
     TH1 = 0xfd;
     TL1 = 0xfd;
     PCON = 0x00;
     TR1 = 1;
}


//***********************************************通过串口向PC发送***********************************************
void R_S_Byte(uchar R_Byte)
{
  SBUF = R_Byte;  
     while( TI == 0 );    //查询法
    TI = 0;   
}

//************************************通过串口将接收到数据发送给PC端**************************************

void sendchar(char *ch)
{
        do{
          SBUF=*ch++;//发送数据
          while(!TI);//等待发送完毕,标志置1
          TI=0; //标志清零
           }
        while(*ch);//循环直至发送完毕
}

//************************************主函数************************************************************
void main()
{
   uchar RxBuf[5],disdata[5];
   int i;
   lcd_init();
   init_NRF24L01();
   StartUART();
        while(1)
        {
        SetRX_Mode();
        //_delay_ms(100);
        if (nRF24L01_RxPacket(RxBuf))
          {
            for(i=0;i<5;i++)
                {
                   disdata[i]=RxBuf[i];
                    R_S_Byte(disdata[i]);
                    wr_com(0x80);
            //wr_dat(flagdat);//显示符号位
                    wr_dat(disdata[0]);//显示百位
                    wr_dat(disdata[1]);//显示十位
                    wr_dat(disdata[2]);//显示个位
                   // wr_dat(0x2e);//显示小数点
                    wr_dat(disdata[3]);//显示小数位
                    wr_dat(disdata[4]);//显示小数位
                    wr_dat(0xdf);//显示du
                    wr_dat(0x43);//显示du C
                }
          }
   


   }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-5-27 10:33:17 | 显示全部楼层
补充,我用的是一块STC89C52,11.0592M的晶振,另一块是STC89C51,12M的晶振,这样可以吗,会不会有什么影响,现在是完全处于通信不了的状态

出0入0汤圆

发表于 2013-5-27 10:39:00 | 显示全部楼层
貌似这个模块吐槽的人挺多的………… 估计也是因为国内的硬件模块受成本影响,工作不稳定

晶振的话… 应该影响不大,印象中这个模块是SPI通讯的,如果单片机是作为主设备,则不会有问题

出0入0汤圆

 楼主| 发表于 2013-5-27 10:42:23 | 显示全部楼层
zgxcom123 发表于 2013-5-27 10:39
貌似这个模块吐槽的人挺多的………… 估计也是因为国内的硬件模块受成本影响,工作不稳定

晶振的话… 应该 ...

我感觉不是模块的问题,是我程序的问题,今天又买了两块新的试了下,还是没有反应,呜呜呜 ,但我真的不知道程序哪里的问题

出0入0汤圆

发表于 2013-5-31 09:49:41 来自手机 | 显示全部楼层
写个简单的程序测试

出0入0汤圆

发表于 2013-6-1 15:05:59 | 显示全部楼层
你先弄个简单的程序,看看能不能通信,这么多的代码,即使有问题也不好改哦

出110入12汤圆

发表于 2013-6-1 15:08:53 来自手机 | 显示全部楼层
51的话不是都有例程吗,比对一下看看

出0入0汤圆

发表于 2013-6-1 21:10:42 | 显示全部楼层
我之前做过一个发射端是STC12C5A60S2 接收端是STM32,都没有什么问题,你挂上示波器看看电平对不对啊。

出0入0汤圆

 楼主| 发表于 2013-6-10 18:55:39 | 显示全部楼层
嗯,最后问题解决了,好像是寄存器按位读不进去,等毕设完事了,整理一下发上来,谢谢大家的回复,嘿嘿

出0入0汤圆

发表于 2013-6-10 20:08:34 来自手机 | 显示全部楼层
应该先写个模块的测试程序,最简单的,点个灯的那种,OK了再把别的程序加上。nRF24L01挺好用的,但是要用低速模式,1M/2M速率太容易被干扰,导致实际有效通信距离非常有限。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 12:20

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

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