最近有人过来问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); //等候完毕}