微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > nRF2401无线通信模块调试

nRF2401无线通信模块调试

时间:08-18 来源:互联网 点击:

最近有人过来问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]={    //设配置字          //test8,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,晶振频率16M0x02                       //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;i8;i++){if((Data0x80)!=0)nRF2401_DATA1_PORT=1;else  nRF2401_DATA1_PORT=0;delay_us(1);  //最小500ns   nRF2401_CLK1_PORT=1;delay_us(1);//最小500nsData=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;i8;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;i15;i++)nRF2401_SendByte(nRF2401_InitData[i]);delay_us(10);nRF2401_CS_PORT=0;            //低功耗模式    delay_ms(6);}//===========================================================现将发送部分和接收部分的程序一并贴上发送部分://=======单片机:ATmega16,编译器:CodeVision v1.24==========#includemega16.h>#includedelay.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#includemega16.h>#includedelay.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);} 

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

网站地图

Top