×
单片机 > 单片机程序设计 > 详情

基于PIC单片机的NRF2401接受程序

发布时间:2020-06-22 发布时间:
|
#include
#include
//
/*************************************************************
                       引脚连接宏定义
*************************************************************/
#define DATA       LATBbits.LATB0//频道1收发数据端
#define CLK1       LATBbits.LATB1//频道1时钟
#define DR1        LATBbits.LATB2//频道1数据已准备好
#define CS         LATBbits.LATB3//配置模式片选
#define CE         LATBbits.LATB4//收发状态控制
#define PWR_UP     LATBbits.LATB5//芯片唤醒
//
/*************************************************************
                       状态切换宏定义
*************************************************************/
#define NRF2401_Mode_RT()        PWR_UP=1;CE=1;CS=0;//收发
#define NRF2401_Mode_Deploy()    PWR_UP=1;CE=0;CS=1;//配置
#define NRF2401_Mode_Free()      PWR_UP=1;CE=0;CS=0;//空闲
#define NRF2401_Mode_Off()       PWR_UP=0//关机
//
/*************************************************************
                       测试用数据
*************************************************************/
const unsigned char Dat[10]=
{
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
};
//
/*************************************************************
                       NRF2401配置数据
备    注:当芯片未掉电,且需要切换收发方式时仅需要发送一个字节
*************************************************************/
const unsigned char NRF2401_Deploy_Data[15]=
{
    0x50,//DATA2_W通道二数据包长度80bit(10byte),DATA2_W<=256-ADDR_W-CRC(bit)
    0x50,//DATA2_W通道一数据包长度,DATA1_W<=256-ADDR_W-CRC(bit)
    0x00,//通道二地址(A24),ADDR2
    0x00,//通道二地址(A23)
    0x00,//通道二地址(A22)
    0x00,//通道二地址(A21)
    0x02,//通道二地址(A20)
    0x00,//通道一地址(A14),ADDR1=0x00000000ff
    0x00,//通道一地址(A13)
    0x00,//通道一地址(A12)
    0x00,//通道一地址(A11)
    0xff,//通道一地址(A10)
    0x83,//b7~b2:接收地址宽度32位,(和发送端一致,不超过40bit),ADDR_W
         //b1~b0:16CRC模式(01-8bit;11-16bit;00/10-no);b1,CRC_L;b0,CRC_EN
    0x6F,//b15:通道二禁止(0-通道1;1-通道1和2),RX2_EN
         //b14:通讯模式为ShockBurat(0-Direct模式,1-ShockBurst模式),CM
         //b13:通信速率为1M(0-250Kbps;1-1Mbps),RFDR_SB
         //b12~b10:晶振选择16M(000-4M;001-8M;010-12M;011-16M),XO_F
         //b9~b8:发射功率0db(00,01,10,11>-20db,-10db,-5db,0db),RF_PWR
    0x05 //b7~b1:频道选择4,RF_CH#
         //b0:配置成收模式(0-发送;1-接收),RXEN
};
//
/*************************************************************
                   IO初始化函数
函数名称:Init_IOforNRF2401();
输入参数:无
输出参数:无
备    注:无

*************************************************************/
void Init_IOforNRF2401(void)
{
TRISBbits.TRISB0=0;//设置DATA引脚为输出
TRISBbits.TRISB1=0;//设置CLK引脚为输出
TRISBbits.TRISB2=1;//设置DR1引脚为输入
TRISBbits.TRISB3=0;//设置CS引脚为输出
TRISBbits.TRISB4=0;//设置CE引脚为输出
TRISBbits.TRISB5=0;//设置PWR_UP引脚为输出
}
//
/*************************************************************
                   数据串行发送函数
函数名称:NRF2401_DataSerialSend();
输入参数:待发送数据块首地址,待发送数据个数
输出参数:无
备    注:调用前要对NRF2401的工作模式做相应的设定

*************************************************************/
void NRF2401_DataSerialSend(unsigned char *p,unsigned char n)
{
unsigned char i,j;
//
unsigned char d;
//
TRISBbits.TRISB0=0;//设置DATA引脚为输出
TRISBbits.TRISB1=0;//设置CLK引脚为输出
//
CLK1=0;
for(i=0;i500nS
           }
        else
           {
            DATA=0;
           }
        //Nop();
       // Nop();
        CLK1=1;//最短时钟宽度500nS
       d<<=1;
        //Nop();
// Nop();
        CLK1=0;
       }
   }
DATA=0;
//CLK1=0;
}
//
/*************************************************************
                   数据串行读取函数
函数名称:NRF2401_DataSerialRead();
输入参数:接收数觉存储区首地址,接收数觉个数
输出参数:接收是否与设置吻合
备    注:调用前要对NRF2401的工作模式做相应的设定

*************************************************************/
unsigned char NRF2401_DataSerialRead(unsigned char *p,unsigned char n)
{
unsigned char i,j;
unsigned char d;
TRISBbits.TRISB0=1;//设置DATA引脚为输入
TRISBbits.TRISB1=0;//设置CLK引脚为输出
CLK1=0;
for(i=0;i5uS,两次通信间隔>50nS
Delay10TCYx(3);
NRF2401_DataSerialSend((unsigned char *)NRF2401_Deploy_Data,15);//发送数据
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式,使配置有效
}
//
/*************************************************************
                   NRF2401收发状态配置
函数名称:NRF2401_R_and_T();
输入参数:n   n>0  收状态
              n=0  发状态
          ch  要选择的频道
输出参数:无
备    注:用于更改收发模式和通信频道
          最后两个字节具体配置见NRF2401_Deploy_Data数组
          仅用于NRF2401被配置过,且没有掉电的情况

*************************************************************/
void NRF2401_R_and_T(unsigned char n,unsigned char ch)
{
unsigned char i;
NRF2401_Mode_Deploy();//进入配置模式,保持时间>5uS
Delay10TCYx(2);
if(n)
   {    
    i=(ch<<1)|0x01;
   }
else
   {
    i=(ch<<1)&0xfe;
   }
NRF2401_DataSerialSend(&i,1);
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式
Delay10TCYx(2);
}
//
/*************************************************************
                   NRF2401发送数据
函数名称:NRF2401_Send();
输入参数:*Add   发送目标地址
          *Dat   待发送数据块首地址
输出参数:无
备    注:确保该函数执行前NRF2401处于发射状态

*************************************************************/
void NRF2401_Send(unsigned char *Add,unsigned char *Dat)
{
NRF2401_Mode_RT();//配置芯片为收发模式
//Delay10TCYx(2);//建立时间>5uS
NRF2401_DataSerialSend(Add,4);//32位地址,根据最初的配置信息改动,或者NRF2401_Deploy_Data[12]>>2表示
NRF2401_DataSerialSend(Dat,10);//10bety数据,根据最初的配置信息改动,或者NRF2401_Deploy_Data[1]表示
NRF2401_Mode_Free();//拉低CE,使芯片开始发送
}
//
/*************************************************************
                           主函数
*************************************************************/
void main(void)
{
unsigned char DATA_for_R[10];
unsigned char a,b,c,d,e,f,g,h,i,j;
unsigned char k;
ADCON1 = ADCON1 | 0x0f;//关闭模拟IO
TRISA = 0x00;//A口为输出
TRISAbits.TRISA5=0;//LED点亮
Init_IOforNRF2401();//初始化端口
NRF2401_Init();//按表格配置NRF2401
//TRISB=0xff;
while(1)
   {
//NRF2401_Init();//按表格配置NRF2401
if(PORTBbits.RB2==1)
     {
      LATAbits.LATA5=0;
        NRF2401_DataSerialRead(DATA_for_R,10);
        a=DATA_for_R[0];
        b=DATA_for_R[1];
        c=DATA_for_R[2];
        d=DATA_for_R[3];
        e=DATA_for_R[4];
        f=DATA_for_R[5];
        g=DATA_for_R[6];
        h=DATA_for_R[7];
        i=DATA_for_R[8];
        j=DATA_for_R[9];  
for(k=0;k<10;k++)
    {
      if(DATA_for_R[k]!=Dat[k])
            {
              LATAbits.LATA5=1;
              while(1);
            }
    }
  
     }
else
    {
      LATAbits.LATA5=1;
    }
  }
}
关键字:PIC单片机  NRF2401  接受程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向