最近有人過來問2401的調試問題,在這里把調試過程中應該注意的問題簡要說明如下:
1.nRF2401是3.3V供電的,電壓過低或過高都會對通信造成影響,要么不能完全通信要么斷斷續續地通信,至于怎么穩壓到3.3V,可以采用穩壓二級管,可以使用LM317,這幾種方法都試用過,都可行。
2.一般的微處理器的I/O口電壓為5V,而2401的I/O口電壓為3.3V,若直接相連,容易燒壞2401,可以采用串連2K電阻的方法,也可以使用3.3V和5V電平轉換芯片如74LVX3245。
3.至于程序部分,一兩句話也說不清楚,請仔細閱讀nRF2401的使用說明書。下面公布一段2401程序僅供參考,此程序多次修改,久經考驗,應該沒有問題。
2401.h下面的代碼 //說明:nRF2401 CE腳控制收發使能,CS控制片選,均為高電平有效 //===============引腳定義======================= #define nRF2401_CE_PORT PORTD.1// #define nRF2401_CE_DDR DDRD.1// #define nRF2401_PWR_PORT PORTD.0// #define nRF2401_PWR_DDR DDRD.0// #define nRF2401_CS_PORT PORTD.3// #define nRF2401_CS_DDR DDRD.3// #define nRF2401_CLK1_PORT PORTD.5// #define nRF2401_CLK1_DDR DDRD.5// #define nRF2401_DATA1_PORT PORTD.4 #define nRF2401_DATA1_DDR DDRD.4 #define nRF2401_DATA1_PIN PIND.4 #define nRF2401_DR1_PORT PORTD.2// #define nRF2401_DR1_DDR DDRD.2// #define nRF2401_DR1_PIN PIND.2// unsigned char Address[4]={0x00,0x00,0x00,0x99}; //===================配置字定義================================ unsigned char nRF2401_InitData[15]={ //設配置字 //test 8,8, //通道2與通道1數據寬度設置為8位 0,0,0,0,57, //通道2接收地址 0x00,0x00,0x00,0x00,0x99, //通道1接收地址 0x83, //通道1和通道2地址寬度為32位,開CRC,16位,CRC 校驗 0x6F, //4F //雙頻道功能禁用,ShockBurst mode,傳輸速率1M,晶振頻率16M 0x02 //Channel = 2400MHz + RF_CH * 1.0MHz ,發送模式 }; //0:Tx 1:Rx //=========================================================== //===================發送單字節數據============================== void nRF2401_SendByte(unsigned char Data) { unsigned char i; nRF2401_DATA1_DDR = 1; for(i=0;i<8;i++) { if((Data&0x80)!=0) nRF2401_DATA1_PORT=1; else nRF2401_DATA1_PORT=0; delay_us(1); //最小500ns nRF2401_CLK1_PORT=1; delay_us(1);//最小500ns Data<<=1; nRF2401_CLK1_PORT=0; delay_us(1); } } //=========================================================== //==================從nRF2401A數據緩沖區讀取數據================== void nRF2401_GetData(unsigned char *DataBuffer) { unsigned char i=0,temp=0; nRF2401_DATA1_DDR = 0;//數據輸入 while(nRF2401_DR1_PIN) { for(i=0;i<8;i++) { temp<<=1; nRF2401_CLK1_PORT=1;delay_us(1); temp|=nRF2401_DATA1_PIN; nRF2401_CLK1_PORT=0;delay_us(1); } } *DataBuffer=temp; } //=====================nRF2401A發送/接收方式設置================= //Mode=0:發送方式 Mode=1:接收方式 void nRF2401_SetMode(unsigned char Mode) { nRF2401_PWR_PORT=1;nRF2401_CE_PORT=0;nRF2401_CS_PORT=1;//設置模式 nRF2401_DATA1_DDR = 1; delay_us(10); //最小5us進入配置模式 nRF2401_DATA1_PORT=Mode; nRF2401_CLK1_PORT=1;delay_us(1); nRF2401_CLK1_PORT=0;delay_us(1); //寫入最低配置位 nRF2401_PWR_PORT=1;nRF2401_CS_PORT=0;nRF2401_CE_PORT=1; //進入收發模式、 delay_us(300); } //=========================================================== //====================數據發送================================= void nRF2401_SendData(unsigned char *Address,unsigned char DataBuffer) { unsigned char i=4; nRF2401_PWR_PORT=1;nRF2401_CS_PORT=0;nRF2401_CE_PORT=1; //進入收發模式 delay_us(10); while(i--)nRF2401_SendByte(*Address++); //發送地址字節 nRF2401_SendByte(DataBuffer); //發送數據字節 nRF2401_CE_PORT=0; //發射數據 delay_us(300); //等待結束 } //=========================================================== //======================初始化=============================== void nRF2401_Init() { unsigned char i; nRF2401_CLK1_DDR=1; nRF2401_DATA1_DDR=1; nRF2401_CS_DDR = 1; nRF2401_CE_DDR = 1; nRF2401_PWR_DDR = 1; nRF2401_DR1_DDR = 0; nRF2401_DR1_PORT=0; nRF2401_CLK1_PORT=0; nRF2401_DATA1_PORT=0; nRF2401_CE_PORT=0; nRF2401_CS_PORT=0;//空閑模式,低功耗 nRF2401_PWR_PORT=1;//上電 delay_ms(5);//從上電到進入配置模式最大 3ms 的延時 nRF2401_CS_PORT=1;//進入配置模式 delay_us(10); //最小5us for(i=0;i<15;i++)nRF2401_SendByte(nRF2401_InitData[i]); delay_us(10); nRF2401_CS_PORT=0; //低功耗模式 delay_ms(6); } //=========================================================== 現將發送部分和接收部分的程序一并貼上 發送部分: //=======單片機:ATmega16,編譯器:CodeVision v1.24========== #include<mega16.h> #include<delay.h> #include "2401.h" unsigned char a=0; main() { nRF2401_Init(); nRF2401_SetMode(0);//發送模式 while(1) { nRF2401_SendData(Address,a++); delay_ms(100); } } 接收部分: //=======單片機:ATmega16,編譯器:CodeVision v1.24========== //==== 采用的是中斷接收方式================================= //Writen by ChenZhou #include<mega16.h> #include<delay.h> #include "2401.h" unsigned char a=0; main() { MCUCR=0X03;GICR=0X40;#asm("sei");//啟用外部中斷INT0,上升沿中斷 nRF2401_Init(); nRF2401_SetMode(1);//接收模式 while(1) { //=========在這里顯示變量a的數值即可,若為0到225則是正確的 delay_ms(10); } } interrupt [2] void int0(void) { nRF2401_GetData(&a); }