×
单片机 > 单片机程序设计 > 详情

nRF2401无线通信模块调试

发布时间:2020-06-23 发布时间:
|

最近有人过来问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
#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  无线通信  模块调试 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八