微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于PIC单片机的NRF2401接受程序

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

时间:11-29 来源:互联网 点击:
#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),ADDR20x00,//通道二地址(A23)0x00,//通道二地址(A22)0x00,//通道二地址(A21)0x02,//通道二地址(A20)0x00,//通道一地址(A14),ADDR1=0x00000000ff0x00,//通道一地址(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_EN0x6F,//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_PWR0x05 //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;//最短时钟宽度500nSd<=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,两次通信间隔>50nSDelay10TCYx(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();//进入配置模式,保持时间>5uSDelay10TCYx(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);//建立时间>5uSNRF2401_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;//关闭模拟IOTRISA = 0x00;//A口为输出TRISAbits.TRISA5=0;//LED点亮Init_IOforNRF2401();//初始化端口NRF2401_Init();//按表格配置NRF2401//TRISB=0xff;while(1){//NRF2401_Init();//按表格配置NRF2401if(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;}}}

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

网站地图

Top