nRF2401无线通信模块调试 2
时间:11-29
来源:互联网
点击:
最近有人过来问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;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);//最小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;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#include #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 #include #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);}
nRF2401无线通信模块调 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)