#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;i 500nS } 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;i 5uS,两次通信间隔>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发送程序
下一篇:Microchip推出两个全新PIC®单片机系列,集成独立于内核的外设
推荐阅读最新更新时间:2024-03-16 14:25