OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13203|回复: 13

24l01可以发送数据了还在改进中

[复制链接]

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
发表于 2020-5-4 13:32:27 | 显示全部楼层 |阅读模式
/**********************************************************/
/* 名   称:NRF24L01+无线USB通信模块程序                  */
/* 功   能:发送接收测试程序                              */
/*          格式:首位是个数,后面跟要发送的数据          */
/*                例如:发送5个字节 11 22 33 44 55(16进制)*/
/*                电脑串口发送:1122334455                */
/*                模块实际发送:051122334455              */     
/* 作者:BQDZ     (论坛:http://bqdz.taobao.com)        */
/* 联系方式: QQ :851968194     旺旺:王亚坤2864          */
/*           手机:15821472722(上海)                    */
/**********************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器         
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址                             
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#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有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/

/******   STATUS寄存器bit位定义      *******/
#define MAX_TX          0x10            //达到最大发送次数中断
#define TX_OK           0x20            //TX发送完成中断
#define RX_OK           0x40            //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********     24L01发送接收数据宽度定义          ***********/
#define TX_ADR_WIDTH    5     //5字节地址宽度
#define RX_ADR_WIDTH    5     //5字节地址宽度
#define TX_PLOAD_WIDTH  32    //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32    //32字节有效数据宽度
        //const linshi[10]={0x00};
const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0xff}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0xff}; //接受地址


sbit NRF_CE   = P3^3;
sbit NRF_SCK  = P3^2;
sbit NRF_CSN  = P3^5;
sbit NRF_MOSI = P3^4;
sbit NRF_MISO = P3^7;
sbit NRF_IRQ  = P1^0;
sbit kab=P1^1;
sbit kac=P1^2;
sbit kad=P1^3;
sbit kae=P1^4;
sbit kaf=P1^5;
sbit kag=P1^6;
sbit kah=P1^7;


bit zd_1;//定义1
//bit key_sb1;//定义开关2
uchar rece_buf[32];
uchar aaa,aba,aab;
uchar linshi;

void delay(long dly){while(dly--);}
void fanhui(unsigned char n)//返回一个数据
{
        ES=0;
        SBUF=n;
        while(!TI);
        TI=0;
        ES=1;
}

/***************************************************************/

/*******************************************************************/
uchar SPI_RW(uchar byte)
{
        uchar i;
        for(i=0;i<8;i++)  // 输出8位
        {
                NRF_MOSI=(byte&0x80);                         // MSB TO MOSI
                byte=(byte<<1);                                        // shift next bit to MSB
        _nop_();
        NRF_SCK=1;
delay(2);
                if(NRF_MISO){byte|=NRF_MISO;}                                // capture current MISO bit
       
else{byte&=~0x01;}
_nop_();
NRF_SCK=0;

delay(2);
        }
NRF_MOSI=1;
delay(5);

        return byte;
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
        uchar status1;

        NRF_CSN=0;                  //CSN=0;   
          status1 = SPI_RW(reg);                //发送寄存器地址,并读取状态值
        SPI_RW(value);
        NRF_CSN=1;                  //CSN=1;

        return status1;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
        uchar value;

        NRF_CSN=0;              //CSN=0;   
          SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
        value = SPI_RW(NOP);
        NRF_CSN=1;                     //CSN=1;

        return value;
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
        uchar status1,u8_ctr;
        NRF_CSN=0;                           //CSN=0      
          status1=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
        for(u8_ctr=0;u8_ctr<len;u8_ctr++)
        pBuf[u8_ctr]=SPI_RW(0XFF);                //读出数据
        NRF_CSN=1;                                 //CSN=1
          return status1;                                //返回读到的状态值
}
/**********************************************/
/* 函数功能:给24L01的寄存器写值(多个字节)  */
/* 入口参数:reg  要写的寄存器地址            */
/*           *pBuf 值的存放数组               */
/*           len   数组字节长度               */
/**********************************************/
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
        uchar status1,u8_ctr;
        NRF_CSN=0;
          status1 = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
          for(u8_ctr=0; u8_ctr<len; u8_ctr++)
        SPI_RW(*pBuf++);                                 //写入数据
        NRF_CSN=1;
          return status1;                          //返回读到的状态值
}                                                                                                    

/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
        uchar state;

        state=NRF24L01_Read_Reg(STATUS);                          //读取状态寄存器的值             
fanhui(state);
        NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志

        if(state&RX_OK)                                                                //接收到数据
        {
        //        NRF_CE = 0;
        //delay(20);
                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
                NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
        //        NRF_CE = 1;
        //        delay(20);

                return 0;
        }          
NRF24L01_Write_Reg(FLUSH_RX,0xff);                                //加的        //清除RX FIFO寄存器
        return 1;//没收到任何数据
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
uchar NRF24L01_TxPacket(uchar *txbuf)
{
        uchar state,i=1;
          NRF_CE=0;        //CE拉低,使能24L01配置
        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);//变成发射模式       
        delay(15);                                                               
          NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
        NRF_CE=1;                                                                                                //CE置高,使能发送          
        //NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
while(i)
{
state=NRF24L01_Read_Reg(STATUS);       
NRF24L01_Write_Reg(WRITE_REG+STATUS,0xff);
if(state&0x01){NRF24L01_Write_Reg(FLUSH_RX,0xff);}
if(state&MAX_TX){NRF24L01_Write_Reg(FLUSH_TX,0xff);}
fanhui(state);
if(state&TX_OK){i=0;}


if(state&0x04){i=0;}


delay(20);
}

//        state=NRF24L01_Read_Reg(STATUS);                                                  //读取状态寄存器的值          
//fanhui(state);
//        NRF24L01_Write_Reg(WRITE_REG+STATUS,0xff);                 //清除TX_DS或MAX_RT中断标志
//        if(state&MAX_TX){NRF24L01_Write_Reg(FLUSH_TX,0xff);return MAX_TX;}                                                                                //达到最大重发次数
                                                     //清除TX FIFO寄存器        
//        if(state&TX_OK){return TX_OK;}                                                                                        //发送完成
//        return 0xff;                                                                                        //发送失败
}
/********************************************/
/* 函数功能:检测24L01是否存在              */
/* 返回值;  0  存在                        */
/*           1  不存在                      */
/********************************************/

uchar NRF24L01_Check(void)
{
        uchar check_out_buf[5]={0x00};
        uchar check_tt_buf[5]={0x01,0x02,0x03,0x04,0x05};
        NRF_SCK=0;
        NRF_CSN=1;   
//        NRF_CE=1;
        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_tt_buf, 5);

        NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);

        if((check_out_buf[0] == check_tt_buf[0])&&\
           (check_out_buf[1] == check_tt_buf[1])&&\
           (check_out_buf[2] == check_tt_buf[2])&&\
           (check_out_buf[3] == check_tt_buf[3])&&\
           (check_out_buf[4] == check_tt_buf[4])){return 0;}
        else return 1;
}                       


void NRF24L01_RT_Init(void)
{       
        //        NRF_CE=0;          
        NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //00号寄存器配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
        NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);  //01   //01号寄存器使能通道0的自动应答   
        NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //02号寄存器使能通道0的接收地址  
   NRF24L01_Write_Reg(WRITE_REG+SETUP_AW,0x03); //03//03号寄存器设置地址宽度
        NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//1a//04号寄存器设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
          NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);        //05号寄存器设置RF通道为2.400GHz  频率=2.4+0GHz
          NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //07//06号寄存器设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,5);//10号寄存器写TX节点地址
          NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,32);//11号寄存器//选择通道0的有效数据宽度
        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,5); //0a号寄存器设置TX节点地址,主要为了使能ACK          
//        NRF_CE=1;

}

void SEND_BUF(uchar *buf)
{

NRF24L01_TxPacket(buf);

        NRF_CE=0;
        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);//变回接受模式


}
void dudizhi(void)
{
        uchar check_out_buf[5]={0x00};
        NRF_SCK=0;
        NRF_CSN=1;   
//        NRF_CE=1;
        NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
        rece_buf[0]=0x0a;
        rece_buf[1]=check_out_buf[0];
        rece_buf[2]=check_out_buf[1];
        rece_buf[3]=check_out_buf[2];
        rece_buf[4]=check_out_buf[3];
        rece_buf[5]=check_out_buf[4];
        NRF24L01_Read_Buf(READ_REG+RX_ADDR_P0, check_out_buf, 5);
        rece_buf[6]=check_out_buf[0];
        rece_buf[7]=check_out_buf[1];
        rece_buf[8]=check_out_buf[2];
        rece_buf[9]=check_out_buf[3];
        rece_buf[10]=check_out_buf[4];
SEND_BUF(rece_buf);
}         
/*void fanhuijcq(void)
{
        uchar i;
        for(i=0;i<10;i++)
        {
                aba=NRF24L01_Read_Reg(i);
                fanhui(aba);
        }
        fanhui(0xff);
        dudizhi();
}*/
void fanhuijcq(void)
{
        uchar i;
rece_buf[0]=0x0a;
        for(i=0;i<10;i++)
        {
                rece_buf[i+1]=NRF24L01_Read_Reg(i);
        }
SEND_BUF(rece_buf);
//        dudizhi();
}
void zhuanfa()
{
        uchar i,k;                  
        NRF24L01_RxPacket(rece_buf);
        k=rece_buf[0]+1;
        for(i=0;i<k;i++)
        {
                fanhui(rece_buf);
        }

}
/*oid fanhuijcqsj ()
{
        uchar i,k;                  
        NRF24L01_RxPacket(rece_buf);
        k=rece_buf[0]+1;
        rece_buf[0]=0x0b;
        for(i=0;i<k;i++)
        {
                fanhui(rece_buf);
        }
        rece_buf[1]=0x01;
                        rece_buf[2]=0x02;
                        rece_buf[3]=0x03;
                        rece_buf[4]=0x04;
                        rece_buf[0]=0x04;          
}*/
void XLS()
{
        uchar i;                  
        P1=0x01;
delay(8000);
        for(i=0;i<8;i++)
        {

                P1=P1<<1;
delay(8000);
        }

}
void fanhuideshuju()

{

if(aaa==0xff){aab=1;rece_buf[31]=0xff;}

else{
rece_buf[aab]=aaa;
rece_buf[0]=aab;
aab++;
}
}

void main()
{
        SCON = 0x50;
        TMOD=0X20;
        TH1=0Xfd;
        TL1=0xfd;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;

        while(NRF24L01_Check());
        NRF24L01_RT_Init();       
        while(1)
        {

//XLS();
if(aaa==0x66)
{
fanhuijcq();
dudizhi();
aaa=0x01;
}
/*linshi=NRF24L01_Read_Reg(STATUS);
if(linshi!=0x0e)
{
fanhui(linshi);
if(linshi&0x01){NRF24L01_Write_Reg(FLUSH_TX,0xff);}
}*/
                if(!NRF_IRQ)
                {
fanhui(0x23);
                NRF24L01_RxPacket(rece_buf);


                        if(rece_buf[1]==0x01)
                        {
                                switch(rece_buf[2])//控制
                                {
       
                                        case 0x01:kad=0;fanhui(0x01);rece_buf[0]=0x02;        rece_buf[2]=0x01;SEND_BUF(rece_buf);break;
                                        case 0x02:kad=1;fanhui(0x02);rece_buf[0]=0x02;        rece_buf[2]=0x02;SEND_BUF(rece_buf);break;
                                        case 0x03:kae=0;fanhui(0x03);rece_buf[0]=0x02;        rece_buf[2]=0x03;SEND_BUF(rece_buf);break;
                                        case 0x04:kae=1;fanhui(0x04);rece_buf[0]=0x02;        rece_buf[2]=0x04;SEND_BUF(rece_buf);break;
                                        case 0x05:kaf=0;break;
                                        case 0x06:kaf=1;break;
                                        case 0x07:kag=0;break;
                                        case 0x08:kag=1;break;
                                        case 0x09:kah=0;break;
                                        case 0x0a:kah=1;break;
                                }

                        }
                        if(rece_buf[1]==0x02)//被读取
                        {
                                switch(rece_buf[2])
                                {
                                        case 0x01:fanhuijcq();break;//读00-0a寄存器
                                        case 0x02:dudizhi();break;//读发送接受地址
                                }
                        }
                        if(rece_buf[1]==0x03)//被写入
                        {
                       
                        }
                        if(rece_buf[1]==0x04)//转发
                        {
                        zhuanfa();
                        }
                        if(rece_buf[1]==0x05)//转读
                        {
       

                        }
                }
        if(rece_buf[0]==10 && rece_buf[31]==0xff){
fanhui(rece_buf[0]);
fanhui(rece_buf[1]);
fanhui(rece_buf[2]);
fanhui(rece_buf[3]);
fanhui(rece_buf[4]);
fanhui(rece_buf[5]);
fanhui(rece_buf[6]);
fanhui(rece_buf[7]);
fanhui(rece_buf[8]);
fanhui(rece_buf[9]);
fanhui(rece_buf[10]);
SEND_BUF(rece_buf);rece_buf[31]=0x00;}

}
/*if(aaa==0x66)
{
fanhuijcq();
aaa=0x01;
}/*
if(aaa==0x55)
{
                        rece_buf[1]=0x01;
                        rece_buf[2]=0x02;
                        rece_buf[3]=0x03;
                        rece_buf[4]=0x04;
                        rece_buf[0]=0x04;                                                   //一共要发送4个字节,rece_buf[0]必须是4!!!!!!
                        SEND_BUF(rece_buf);
aaa=0x01;
        }*/

}

void serial() interrupt 4
{





        aaa=SBUF;
        RI=0;
fanhuideshuju();
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-4 13:33:47 | 显示全部楼层
这个计划做从机实现收发数据并当数据中转站!
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-4 15:27:05 | 显示全部楼层
本帖最后由 大白猫 于 2020-5-4 15:31 编辑

重头看!大家没事不要灌水谢谢
第一个子程序是延时不说!第二个是串口通讯的不说
先说第三个读写1个字节
延时都是自己加的因为用的是淘宝20元的逻辑分析仪只有24m!不加延时波形对不上sck变化8次分析仪上变化只有5次!(分析仪反应慢!)
uchar SPI_RW(uchar byte)
{
        uchar i;//定义一个数
        for(i=0;i<8;i++)                             // 运行8次
        {
                NRF_MOSI=(byte&0x80);        // 将输入的数据左面第一位赋值给mosi
                byte=(byte<<1);                  // 数据左移一位
                _nop_();                        
                NRF_SCK=1;                        //拉高sck
                delay(2);
                byte|=NRF_MISO;                //将miso电平赋值到数据右面第一位         
                _nop_();
                NRF_SCK=0;                       //sck变0
                delay(2);
        }
        NRF_MOSI=1;                              //mosi置1
        delay(5);
        return byte;                                 //返回读到的数据
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-4 15:36:42 | 显示全部楼层
本帖最后由 大白猫 于 2020-5-4 15:51 编辑

继续第4个
这个实际上是发2个数据读一个数据发的第一个是地址的二个是数据!
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
        uchar status1;
        NRF_CSN=0;                  //CSN=0;   
          status1 = SPI_RW(reg);                //发送寄存器地址,并读取状态值
        SPI_RW(value);              //发数据
        NRF_CSN=1;                  //CSN=1;

        return status1;
}

把这个改了!
void NRF24L01_Write_Reg(uchar reg,uchar value)
{
        NRF_CSN=0;                  //CSN=0;   
          SPI_RW(reg);                //发送寄存器地址,并读取状态值
        SPI_RW(value);              //发数据
        NRF_CSN=1;                  //CSN=1;
}

不要返回值!后面也没用到!

回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-4 15:44:42 | 显示全部楼层
第五个和第四个没多大差别,第四个是写地址并读状态然后写数据第五个是写地址度数据!
uchar NRF24L01_Read_Reg(uchar reg)
{
         uchar value;

        NRF_CSN=0;              //CSN=0;   
          SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
        value = SPI_RW(NOP);
        NRF_CSN=1;                     //CSN=1;

        return value;
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-4 16:09:08 | 显示全部楼层
继续改,把第四和第五合成一个
uchar NRF24L01_Read_Write_Reg(uchar reg,uchar status1)
{
uchar value;

        NRF_CSN=0;              //CSN=0;   
          SPI_RW(reg);                        //发送寄存器值
        value = SPI_RW(status1);
        NRF_CSN=1;                     //CSN=1;

        return value;
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 10:30:38 | 显示全部楼层
第6和第七段
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
        uchar status1,i;
        NRF_CSN=0;                           //CSN=0      
          status1=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
        for(i=0;i<len;i++)
        pBuf[i]=SPI_RW(0XFF);                //读出数据
        NRF_CSN=1;                                 //CSN=1
          return status1;                                //返回读到的状态值
}
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
        uchar status,u8_ctr;
        NRF_CSN=0;
          status = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
          for(u8_ctr=0; u8_ctr<len; u8_ctr++)
        SPI_RW(*pBuf++);                                 //写入数据
        NRF_CSN=1;
          return status;                          //返回读到的状态值
}
没什么好说的只有一条不同!
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 11:00:13 | 显示全部楼层
在下面第八段收数据数据
先跳过因为接受失败
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
        uchar state;
        state=NRF24L01_Read_Write_Reg(STATUS,NOP);                          //读取状态寄存器的值             
        NRF24L01_Read_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
        if(state&RX_OK)                                                                                        //接收到数据
        {
                NRF_CE = 0;//
                delay(20);
                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
                NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
                NRF_CE = 1;//这个很关键!只有ce跳变才发数据
                delay(20);
                return 0;
        }          
        NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);                                //加的        //清除RX FIFO寄存器
        return 1;//没收到任何数据、、没什么用
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 11:09:56 | 显示全部楼层
第九段发送数据我用的擦寻法就是不用irq引脚
void NRF24L01_TxPacket(uchar *txbuf)
{
        uchar state;
          NRF_CE=0;        //CE拉低,使能24L01配置
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0e);//变成发射模式       
        delay(15);                                                               
          NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
        NRF_CE=1;                                                                                                //这个关键必须有CE置高,使能发送          
        while(1)
        {
                state=NRF24L01_Read_Write_Reg(STATUS,NOP);//读7号寄存器       
                NRF24L01_Read_Write_Reg(WRITE_REG+STATUS,0xff);//清空7号寄存器
                if(state&0x01){NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);}//如果读出的第7位是1证明发送寄存器满清除RX FIFO寄存器
                if(state&MAX_TX){NRF24L01_Read_Write_Reg(FLUSH_TX,0xff);}//如果读出的第4位是1证明从发次数满清除RX FIFO寄存器
                //fanhui(state);
                if(state&TX_OK){break;}//如果读出的第2位是1证明发送成功
                if(state&0x04){break;}//如果读出的第7位是1证明已发送
        }
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 11:12:15 | 显示全部楼层
第十段检查24l01是否存在就是向24l01的地址寄存器写一个地址在读出来!读出成功证明24l01存在
uchar NRF24L01_Check(void)
{
        uchar check_out_buf[5]={0x00};
        uchar check_tt_buf[5]={0x01,0x02,0x03,0x04,0x05};
        NRF_SCK=0;NRF_CSN=1;NRF_CE=1;
        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_tt_buf, 5);
        NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
        if((check_out_buf[0] == check_tt_buf[0])&&\
           (check_out_buf[1] == check_tt_buf[1])&&\
           (check_out_buf[2] == check_tt_buf[2])&&\
           (check_out_buf[3] == check_tt_buf[3])&&\
           (check_out_buf[4] == check_tt_buf[4])){return 0;}
        else return 1;
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 11:13:31 | 显示全部楼层
第十一段配置寄存器
void NRF24L01_RT_Init(void)
{       
        NRF_CE=0;          
        NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0f);    //00号寄存器配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
        NRF24L01_Read_Write_Reg(WRITE_REG+EN_AA,0x01);  //01   //01号寄存器使能通道0的自动应答   
        NRF24L01_Read_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //02号寄存器使能通道0的接收地址  
   NRF24L01_Read_Write_Reg(WRITE_REG+SETUP_AW,0x03); //03//03号寄存器设置地址宽度
        NRF24L01_Read_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//1a//04号寄存器设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
          NRF24L01_Read_Write_Reg(WRITE_REG+RF_CH,0);        //05号寄存器设置RF通道为2.400GHz  频率=2.4+0GHz
          NRF24L01_Read_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //07//06号寄存器设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,5);//10号寄存器写TX节点地址
          NRF24L01_Read_Write_Reg(WRITE_REG+RX_PW_P0,32);//11号寄存器//选择通道0的有效数据宽度
        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,5); //0a号寄存器设置TX节点地址,主要为了使能ACK          
        NRF_CE=1;
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 11:18:27 | 显示全部楼层
本帖最后由 大白猫 于 2020-5-7 12:13 编辑

第十二段发数据!改到第八段里了!
第八段变成
void SEND_BUF(uchar *txbuf)
{
        uchar state;
          NRF_CE=0;        //CE拉低,使能24L01配置
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0e);//变成发射模式        
        delay(15);       //这个该成20就可以让irq右跳变信号了。                                                       
          NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
         NRF_CE=1;                                                                                                //这个关键必须有CE置高,使能发送           
        while(1)
        {
                state=NRF24L01_Read_Write_Reg(STATUS,NOP);//读7号寄存器        
                NRF24L01_Read_Write_Reg(WRITE_REG+STATUS,0xff);//清空7号寄存器
                if(state&0x01){NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);}//如果读出的第7位是1证明发送寄存器满清除RX FIFO寄存器
                if(state&MAX_TX){NRF24L01_Read_Write_Reg(FLUSH_TX,0xff);}//如果读出的第4位是1证明从发次数满清除RX FIFO寄存器
                //fanhui(state);
                if(state&TX_OK){break;}//如果读出的第2位是1证明发送成功
                if(state&0x04){break;}//如果读出的第7位是1证明已发送
        }
        NRF_CE=0;
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0f);//变回接受模式
        NRF_CE=1;
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-7 11:53:13 | 显示全部楼层
第十三,十四个子程序  
自己写的十三是读地址并发送出去十四是读00-0a寄存器的值并发送
void dudizhi(void)
{
        uchar check_out_buf[5]={0x00};
        NRF_SCK=0;NRF_CSN=1;NRF_CE=1;
        NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
        rece_buf[0]=0x0a;
        rece_buf[1]=check_out_buf[0];
        rece_buf[2]=check_out_buf[1];
        rece_buf[3]=check_out_buf[2];
        rece_buf[4]=check_out_buf[3];
        rece_buf[5]=check_out_buf[4];
        NRF24L01_Read_Buf(READ_REG+RX_ADDR_P0, check_out_buf, 5);
        rece_buf[6]=check_out_buf[0];
        rece_buf[7]=check_out_buf[1];
        rece_buf[8]=check_out_buf[2];
        rece_buf[9]=check_out_buf[3];
        rece_buf[10]=check_out_buf[4];
SEND_BUF(rece_buf);
}
void fanhuijcq(void)
{
        uchar i;
rece_buf[0]=0x0a;
        for(i=0;i<10;i++)
        {
                rece_buf[i+1]=NRF24L01_Read_Write_Reg(i,NOP);
        }
SEND_BUF(rece_buf);
//        dudizhi();
}
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
 楼主| 发表于 2020-5-8 11:52:45 | 显示全部楼层
已经成功实现收发数据


/**********************************************************/
/* 名   称:NRF24L01+无线USB通信模块程序                  */
/* 功   能:发送接收测试程序                              */
/*          格式:首位是个数,后面跟要发送的数据          */
/*                例如:发送5个字节 11 22 33 44 55(16进制)*/
/*                电脑串口发送:1122334455                */
/*                模块实际发送:051122334455              */     
/* 作者:BQDZ     (论坛:http://bqdz.taobao.com)        */
/* 联系方式: QQ :851968194     旺旺:王亚坤2864          */
/*           手机:15821472722(上海)                    */
/**********************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器         
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址                             
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#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有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/

/******   STATUS寄存器bit位定义      *******/
#define MAX_TX          0x10            //达到最大发送次数中断
#define TX_OK           0x20            //TX发送完成中断
#define RX_OK           0x40            //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********     24L01发送接收数据宽度定义          ***********/
#define TX_ADR_WIDTH    5     //5字节地址宽度
#define RX_ADR_WIDTH    5     //5字节地址宽度
#define TX_PLOAD_WIDTH  32    //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32    //32字节有效数据宽度
        //const linshi[10]={0x00};
const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0xff}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0xff}; //接受地址


sbit NRF_CE   = P3^3;
sbit NRF_SCK  = P3^2;
sbit NRF_CSN  = P3^5;
sbit NRF_MOSI = P3^4;
sbit NRF_MISO = P3^7;
sbit NRF_IRQ  = P1^0;
sbit kab=P1^1;
sbit kac=P1^2;
sbit kad=P1^3;
sbit kae=P1^4;
sbit kaf=P1^5;
sbit kag=P1^6;
sbit kah=P1^7;


bit zd_1;//定义1
//bit key_sb1;//定义开关2
uchar rece_buf[32];
uchar aaa,aba,aac,aab;
uchar linshi;

void delay(long dly){while(dly--);}
void fanhui(unsigned char n)//返回一个数据
{
        ES=0;
        SBUF=n;
        while(!TI);
        TI=0;
        ES=1;
}

/***************************************************************/

/*******************************************************************/
uchar SPI_RW(uchar byte)
{
        uchar i;//定义一个数
        for(i=0;i<8;i++)  // 运行8次
        {
                NRF_MOSI=(byte&0x80);                         // 将输入的数据左面第一位赋值给mosi
                byte=(byte<<1);                                        // 数据左移一位
                _nop_();                        
                NRF_SCK=1;//拉高sck
                delay(1);
                byte|=NRF_MISO;//将miso电平赋值到数据右面第一位          
                _nop_();
                NRF_SCK=0;//sck变0
                delay(1);
        }
        NRF_MOSI=1;//mosi置1
        delay(1);
        return byte;//返回读到的数据
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
/*
void NRF24L01_Write_Reg(uchar reg,uchar value)
{
        NRF_CSN=0;                  //CSN=0;   
          SPI_RW(reg);                //发送寄存器地址
        SPI_RW(value);              //发数据
        NRF_CSN=1;                  //CSN=1;
}*/
/*读写数据*/
uchar NRF24L01_Read_Write_Reg(uchar reg,uchar status1)
{
        uchar value;
        NRF_CSN=0;              //CSN=0;   
          SPI_RW(reg);                        //发送寄存器值
        value = SPI_RW(status1);
        NRF_CSN=1;                     //CSN=1;
        return value;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
/*uchar NRF24L01_Read_Reg(uchar reg)
{
        uchar value;

        NRF_CSN=0;              //CSN=0;   
          SPI_RW(reg);                        //发送寄存器值
        value = SPI_RW(NOP);
        NRF_CSN=1;                     //CSN=1;

        return value;
}*/
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
        uchar status1,i;
        NRF_CSN=0;                           //CSN=0      
          status1=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
        for(i=0;i<len;i++)
        pBuf=SPI_RW(0XFF);                //读出数据
        NRF_CSN=1;                                 //CSN=1
          return status1;                                //返回读到的状态值
}                                                                                                    
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
        uchar status,i;
        NRF_CSN=0;
          status = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
          for(i=0; i<len; i++)
        SPI_RW(pBuf);                                 //写入数据
        NRF_CSN=1;
          return status;                          //返回读到的状态值
}
/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
        uchar state;
        state=NRF24L01_Read_Write_Reg(STATUS,NOP);                          //读取状态寄存器的值             
        NRF24L01_Read_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
        if(state&RX_OK)                                                                                        //接收到数据
        {
                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,32);//读取数据
                NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
//        NRF24L01_Read_Write_Reg(FLUSH_TX,0xff);
        return 1;
        }          
//        NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);                                //加的        //清除RX FIFO寄存器
        return 0;//没收到任何数据、、没什么用
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
void SEND_BUF(uchar *txbuf)
{
        uchar state;
          NRF_CE=0;        //CE拉低,使能24L01配置
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0e);//变成发射模式       
        delay(20);        //这个原来是15改到20就能收到数据了                                                       
          NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
        NRF_CE=1;                                                                                                //这个关键必须有CE置高,使能发送          
//        NRF24L01_Read_Write_Reg(REUSE_TX_PL,0xff);//ce=1不跳变ce有时候可以送成功
        while(1)
        {
                state=NRF24L01_Read_Write_Reg(STATUS,NOP);//读7号寄存器       
                NRF24L01_Read_Write_Reg(WRITE_REG+STATUS,0xff);//清空7号寄存器
                //fanhui(state);
                if(state&0x01){NRF24L01_Read_Write_Reg(FLUSH_TX,0xff);}//如果读出的第7位是1证明发送寄存器满清除RX FIFO寄存器
                if(state&MAX_TX){NRF24L01_Read_Write_Reg(FLUSH_TX,0xff);}//如果读出的第4位是1证明从发次数满清除RX FIFO寄存器
                if(state&TX_OK){break;}//如果读出的第2位是1证明发送成功
                if(state&0x04){break;}//如果读出的第7位是1证明已发送
        }
        NRF_CE=0;
        delay(20);
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0f);//变回接受模式
        NRF_CE=1;
}

/********************************************/
/* 函数功能:检测24L01是否存在              */
/* 返回值;  0  存在                        */
/*           1  不存在                      */
/********************************************/

uchar NRF24L01_Check(void)
{
        uchar check_out_buf[5]={0x00};
        uchar check_tt_buf[5]={0x01,0x02,0x03,0x04,0x05};
        NRF_SCK=0;NRF_CSN=1;NRF_CE=1;
        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_tt_buf, 5);
        NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
        if((check_out_buf[0] == check_tt_buf[0])&&\
           (check_out_buf[1] == check_tt_buf[1])&&\
           (check_out_buf[2] == check_tt_buf[2])&&\
           (check_out_buf[3] == check_tt_buf[3])&&\
           (check_out_buf[4] == check_tt_buf[4])){return 0;}
        else return 1;
}                       


void NRF24L01_RT_Init(void)
{       
        NRF_CE=0;          
        NRF24L01_Read_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
        NRF24L01_Read_Write_Reg(FLUSH_TX,0xff);                                                                        //清除RX FIFO寄存器   
        NRF24L01_Read_Write_Reg(WRITE_REG+CONFIG,0x0f);    //00号寄存器配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
        NRF24L01_Read_Write_Reg(WRITE_REG+EN_AA,0x01);  //01   //01号寄存器使能通道0的自动应答   
        NRF24L01_Read_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //02号寄存器使能通道0的接收地址  
   NRF24L01_Read_Write_Reg(WRITE_REG+SETUP_AW,0x03); //03//03号寄存器设置地址宽度
        NRF24L01_Read_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//1a//04号寄存器设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
          NRF24L01_Read_Write_Reg(WRITE_REG+RF_CH,0);        //05号寄存器设置RF通道为2.400GHz  频率=2.4+0GHz
          NRF24L01_Read_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //07//06号寄存器设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,5);//10号寄存器写TX节点地址
          NRF24L01_Read_Write_Reg(WRITE_REG+RX_PW_P0,32);//11号寄存器//选择通道0的有效数据宽度
        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,5); //0a号寄存器设置TX节点地址,主要为了使能ACK          
        NRF_CE=1;
}         
void fanhuijcq(void)
{
        uchar i;
        uchar check_out_buf[5]={0x00};
        rece_buf[0]=0x14;
        for(i=0;i<10;i++){rece_buf[i+1]=NRF24L01_Read_Write_Reg(i,NOP);} //读寄存器i
        NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
        for(i=0;i<5;i++){rece_buf[i+11]=check_out_buf;}
        NRF24L01_Read_Buf(READ_REG+RX_ADDR_P0, check_out_buf, 5);
        for(i=0;i<5;i++){rece_buf[i+16]=check_out_buf;}
        for(i=0;i<21;i++){fanhui(rece_buf);_nop_();}
        SEND_BUF(rece_buf);
}
void fanhuideshuju()
{
if(aaa==0xff){aab=1;rece_buf[31]=0xff;}
else
{
        rece_buf[aab]=aaa;
        rece_buf[0]=aab;
        aab++;
}
}
void fanhuibuf()
{
        uchar i;
        for(i=0;i<rece_buf[0];i++){fanhui(rece_buf[i+1]);} //读寄存器i
}
void main()
{
        SCON = 0x50;
        TMOD=0X20;
        TH1=0Xfd;
        TL1=0xfd;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(NRF24L01_Check());
        NRF24L01_RT_Init();       
        while(1)
        {
                while(NRF24L01_RxPacket(rece_buf))
                {
                        if(rece_buf[1]==0x01&&rece_buf[2]==0x01){kah=0;SEND_BUF(rece_buf);break;}
                        if(rece_buf[1]==0x01&&rece_buf[2]==0x02){kah=1;SEND_BUF(rece_buf);break;}                       
                        if(rece_buf[1]==0x01&&rece_buf[2]==0x03){kah=~kah;SEND_BUF(rece_buf);break;}               
                        if(rece_buf[1]==0x02&&rece_buf[2]==0x01){fanhuijcq();break;}               
                        if(rece_buf[1]==0xff){rece_buf[31]=0x00;aac=0;break;}
                }
                if(rece_buf[0]==10 && rece_buf[31]==0xff)
{
if(aac==0){SEND_BUF(rece_buf);}
aac++;if(aac==250){aac=0;}
}
}       
}
void serial() interrupt 4
{
        aaa=SBUF;
        RI=0;
fanhuideshuju();
}



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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