#include<p18f4550.h> #include<delays.h> // /************************************************************* 引腳連接宏定義 *************************************************************/ #define DATA LATBbits.LATB0//頻道1收發(fā)數(shù)據(jù)端 #define CLK1 LATBbits.LATB1//頻道1時鐘 #define DR1 LATBbits.LATB2//頻道1數(shù)據(jù)已準(zhǔn)備好 #define CS LATBbits.LATB3//配置模式片選 #define CE LATBbits.LATB4//收發(fā)狀態(tài)控制 #define PWR_UP LATBbits.LATB5//芯片喚醒 // /************************************************************* 狀態(tài)切換宏定義 *************************************************************/ #define NRF2401_Mode_RT() PWR_UP=1;CE=1;CS=0;//收發(fā) #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//關(guān)機 // /************************************************************* 測試用數(shù)據(jù) *************************************************************/ const unsigned char Dat[10]= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; const unsigned char Add[4]= {//目標(biāo)地址000000ff 0x00,0x00,0x00,0xff }; /************************************************************* NRF2401配置數(shù)據(jù) 備 注:當(dāng)芯片未掉電,且需要切換收發(fā)方式時僅需要發(fā)送一個字節(jié) *************************************************************/ const unsigned char NRF2401_Deploy_Data[15]= { 0x50,//DATA2_W通道二數(shù)據(jù)包長度80bit(10byte),DATA2_W<=256-ADDR_W-CRC(bit) 0x50,//DATA2_W通道一數(shù)據(jù)包長度,DATA1_W<=256-ADDR_W-CRC(bit) 0x00,//通道二地址(A24),ADDR2 0x00,//通道二地址(A23) 0x00,//通道二地址(A22) 0x00,//通道二地址(A21) 0x02,//通道二地址(A20) 0x00,//通道一地址(A14),ADDR1=0x00000000fe 0x00,//通道一地址(A13) 0x00,//通道一地址(A12) 0x00,//通道一地址(A11) 0xfe,//通道一地址(A10) 0x83,//b7~b2:接收地址寬度32位,(和發(fā)送端一致,不超過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:發(fā)射功率0db(00,01,10,11>-20db,-10db,-5db,0db),RF_PWR 0x04 //b7~b1:頻道選擇4,RF_CH# //b0:收發(fā)控制(0-發(fā)送;1-接收),RXEN }; // /************************************************************* IO初始化函數(shù) 函數(shù)名稱:Init_IOforNRF2401(); 輸入?yún)?shù):無 輸出參數(shù):無 備 注:無 *************************************************************/ void Init_IOforNRF2401(void) { TRISBbits.TRISB0=0;//設(shè)置DATA引腳為輸出 TRISBbits.TRISB1=0;//設(shè)置CLK引腳為輸出 TRISBbits.TRISB2=1;//設(shè)置DR1引腳為輸入 TRISBbits.TRISB3=0;//設(shè)置CS引腳為輸出 TRISBbits.TRISB4=0;//設(shè)置CE引腳為輸出 TRISBbits.TRISB5=0;//設(shè)置PWR_UP引腳為輸出 } // /************************************************************* 數(shù)據(jù)串行通信函數(shù) 函數(shù)名稱:NRF2401_DataSerialSend(); 輸入?yún)?shù):待發(fā)送數(shù)據(jù)塊首地址,待發(fā)送數(shù)據(jù)個數(shù) 輸出參數(shù):無 備 注:調(diào)用前要對NRF2401的工作模式做相應(yīng)的設(shè)定 *************************************************************/ void NRF2401_DataSerialSend(unsigned char *p,unsigned char n) { unsigned char i,j; // unsigned char d; // TRISBbits.TRISB0=0;//設(shè)置DATA引腳為輸出 TRISBbits.TRISB1=0;//設(shè)置CLK引腳為輸出 // CLK1=0; LATAbits.LATA5 = 0; for(i=0;i<n;i++)//字節(jié)數(shù) { d=*(p++); for(j=0;j<8;j++) { if(d&0x80)//MSB { DATA=1;//數(shù)據(jù)建立時間>500nS } else { DATA=0; } //Nop(); CLK1=1;//最短時鐘寬度500nS d<<=1; // Nop(); CLK1=0; } } LATAbits.LATA5 = 1; DATA=0; } // /************************************************************* NRF2401初始化配置 函數(shù)名稱:NRF2401_Init(); 輸入?yún)?shù):無 輸出參數(shù):無 備 注:具體配置見NRF2401_Deploy_Data數(shù)組 該函數(shù)為15個字節(jié)全部配置 若只需要改變收發(fā)狀態(tài),僅需發(fā)送NRF2401_Deploy_Data[14] *************************************************************/ void NRF2401_Init(void) { NRF2401_Mode_Free();//進入待機 Delay1KTCYx(3);//由待機進入配置延時3mS NRF2401_Mode_Deploy();//進入配置模式時引腳保持時間>5uS,兩次通信間隔>50nS Delay10TCYx(3); NRF2401_DataSerialSend((unsigned char *)NRF2401_Deploy_Data,15);//發(fā)送數(shù)據(jù) NRF2401_Mode_RT();//從配置模式退出,進入到收發(fā)模式,使配置有效 Delay10TCYx(2); } // /************************************************************* NRF2401收發(fā)狀態(tài)配置 函數(shù)名稱:NRF2401_R_and_T(); 輸入?yún)?shù):n n>0 收狀態(tài) n=0 發(fā)狀態(tài) ch 要選擇的頻道 輸出參數(shù):無 備 注:用于更改收發(fā)模式和通信頻道 最后兩個字節(jié)具體配置見NRF2401_Deploy_Data數(shù)組 僅用于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();//從配置模式退出,進入到收發(fā)模式 Delay10TCYx(2); } // /************************************************************* NRF2401發(fā)送數(shù)據(jù) 函數(shù)名稱:NRF2401_Send(); 輸入?yún)?shù):*Add 發(fā)送目標(biāo)地址 *Dat 待發(fā)送數(shù)據(jù)塊首地址 輸出參數(shù):無 備 注:確保該函數(shù)執(zhí)行前NRF2401處于發(fā)射狀態(tài) *************************************************************/ void NRF2401_Send(unsigned char *Add,unsigned char *Dat) { NRF2401_Mode_RT();//配置芯片為收發(fā)模式 //Delay10TCYx(1);//建立時間>5uS NRF2401_DataSerialSend(Add,4);//32位地址,根據(jù)最初的配置信息改動,或者NRF2401_Deploy_Data[12]>>2表示 NRF2401_DataSerialSend(Dat,10);//10bety數(shù)據(jù),根據(jù)最初的配置信息改動,或者NRF2401_Deploy_Data[1]表示 NRF2401_Mode_Free();//拉低CE,使芯片開始發(fā)送 } // /************************************************************* 主函數(shù) *************************************************************/ void main(void) { //unsigned char i=0xaa; TRISAbits.TRISA5=0;//LED LATAbits.LATA5=0; Init_IOforNRF2401();//初始化端口 NRF2401_Init();//按表格配置NRF2401 while(1) { NRF2401_Send((unsigned char *)Add,(unsigned char *)Dat); Delay10KTCYx(10); } }