⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf2401_personal.h

📁 用Keil写的NRF2401接受程序,重要的模块文件是nRF2401_Personal.h,源码中的注释我写的已经非常清楚,非常适合新手学习
💻 H
字号:
#include "nRF2401.h"
#include "intrins.h"

extern void delayUS(uint t);	    //最终调试可能还会在延时时序上的调节

#define  TX_ADDR   	 0x78563412		//发送有效地址
#define  RX_ADDR     0x12345678     //自身接收有效地址,也用于由对方发送地址与次地址校验

#define  TX_ADDR_4   0              //这样由于设置TX_Addr为4个字节,所以最高位直接简化为0,
                                    //其实应该这样写 TX_Addr>>32
									//发送地址的第5字节
#define  TX_ADDR_3   TX_ADDR >> 24	             //发送地址的第4字节
#define  TX_ADDR_2   (TX_ADDR >> 16) & 0xff		 //发送地址的第3字节
#define  TX_ADDR_1   (TX_ADDR >> 8) & 0xff		 //发送地址的第2字节
#define  TX_ADDR_0   TX_ADDR & 0xff		         //发送地址的第1字节

#define  RX_ADDR_4   0		 //接收地址的第5字节,化简同TX_Addr4
#define  RX_ADDR_3   RX_ADDR >> 24         //接收地址的第4字节
#define  RX_ADDR_2   (RX_ADDR >> 16) & 0xff      //接收地址的第3字节
#define  RX_ADDR_1   (RX_ADDR >> 8) & 0xff		 //接收地址的第2字节
#define  RX_ADDR_0   RX_ADDR & 0xff		         //接收地址的第1字节

#define  RX_ADDR2    0                           //通道2地址为0

#define  SIZE       1	       //最大数据包字节数
#define  ADDRSIZE   4          //地址长度字节数,4个字节
#define  ADDR_W	    (ADDRSIZE<<5)		 // 地址位数
                                         // 4*2*2*2后,再左移2位,共移5位,节省CPU浮点运算时间
#define  DATA1_W    (SIZE<<3)			 // 通道1接收数据包长度(BITS),相当与SIZE*8
#define  DATA2_W    (SIZE<<3)			 // 通道2接收数据包长度(BITS),相当与SIZE*8

#define  CRC_16BIT     2				   //16位CRC
#define  CRC_8BIT      0                   //8位CRC
#define  CRC_EN        1                   //CRC使能
#define  CRC16_EN      3                   //CRC16位使能
#define  CRC8_EN       1                   //CRC8位使能

#define  RX2EN_YES       128               //第2通道接受使能  单个字节的位7上
#define  RX2EN_NO        0                 //第2通道接收关闭

#define  CM_SHOCK        64                //ShockBurst模式
#define  CM_DIRECT       0                 //Direct模式
#define  RFDR_250K       0                 //250KBPS数据速率
#define  RFDR_1M         32                //1MBPS数据速率
#define  XOF_4M          0                 //使用4M晶振
#define  XOF_8M          4                 //使用8M晶振
#define  XOF_12M         8                 //使用12M晶振
#define  XOF_16M         12                //使用16M晶振
#define  XOF_20M         16                //使用20M晶振
#define  RF_PWR_0        0                 //输出功率-20dbm
#define  RF_PWR_1        1                 //输出功率-10dbm
#define  RF_PWR_2        2                 //输出功率-5dbm
#define  RF_PWR_3        3                 //输出功率0dbm

#define  CH_NO           4                 //频道编号
                                           //发射工作频率=2400MHZ + CH_NO *	1MHZ
#define  RF_CH			(CH_NO<<1)		   //工作频率
#define  RXEN_MODE      1                  //接收模式
#define  TXEN_MODE      0                  //发射模式          



uchar xdata TxBuf[SIZE], RxBuf[SIZE];		 //发送和接收缓存

//----------------------------写1个字节---------------------------------//
//------MSB first  从高位开始,先输出数据,再产生满足最小时延的CLK1-----//
void nRF2401_WR(uchar val)
{
  uchar dat,i;
  CLK1_CLR();
  dat=val;
  for(i=0;i<8;i++)
  {
    if((dat&0x80)>0)
	  DATA_SET();
	else
	  DATA_CLR();
//	delayUS(1);    // Ts--min 500ns
	CLK1_SET();	   // CLK-UP
//	delayUS(1);    // 
    _nop_();	   // Th--min 500ns
	CLK1_CLR();	   // CLK-DOWN
	dat<<=1;
  }
}

//-------------------------读一个字节-----------------------------//
//----MSB first  从高位开始,先读数据,再产生满足最小时延的CLK1---//
uchar nRF2401_RD(void)
{
  uchar dat=0,i;
  CLK1_CLR();
  for(i=0;i<8;i++)
  { 
    dat<<=1;          //数据左移 , 共7次移位 ,第一次为空移 
    if(DATA)
	  dat|= 0x01;	  //8次从最低位写入
	CLK1_SET();		  //从循环判断到此,16M晶振肯定满足Td > 50ns
//	delayUS(1);		   // 
    _nop_();		   // RX  Th(min)=500ns
	CLK1_CLR();        //使下一个位最多在50ns后输出	
  }
  return(dat);
}


//------切换到接收模式------//
void nRF2401_RXMODE(void)
{
  nRF2401_CFG();	               //进入配置模式
//  nRF2401_WR(RF_CH|RXEN_MODE);	   //写RXEN = 1		//原先的写8位
//----------现修改成写一位-----------//
  CLK1_CLR();
  DATA_SET();         //DATA =1
  CLK1_SET();
//  delayUS(1);
  _nop_();
  CLK1_CLR();
//-----------------------------------//
  nRF2401_Run();				   //工作到收发模式
}

//------切换到发射模式------//
void nRF2401_TXMODE(void)
{
  nRF2401_CFG();				   //进入配置模式
//  nRF2401_WR(RF_CH);			   //写RXEN = 0			//原先的写8位
//----------现修改成写一位-----------//
  CLK1_CLR();
  DATA_CLR();         //DATA =0
  CLK1_SET();
//  delayUS(1);
  _nop_();
  CLK1_CLR();
//-----------------------------------//
  nRF2401_Run();				   //工作到收发模式
}

//------nRF2401的配置函数-----//
void nRF2401_Config(void)
{
  nRF2401_CFG();
  nRF2401_WR(DATA2_W);
  nRF2401_WR(DATA1_W);
  nRF2401_WR(RX_ADDR2);		      //  0		//通道2接收地址
  nRF2401_WR(RX_ADDR2);			  //  0
  nRF2401_WR(RX_ADDR2);			  //  0
  nRF2401_WR(RX_ADDR2);			  //  0
  nRF2401_WR(RX_ADDR2);			  //  0
  nRF2401_WR(RX_ADDR_4);		  //  通道1接收地址
  nRF2401_WR(RX_ADDR_3);
  nRF2401_WR(RX_ADDR_2);
  nRF2401_WR(RX_ADDR_1);
  nRF2401_WR(RX_ADDR_0);
  nRF2401_WR(ADDR_W|CRC16_EN);	  //地址宽度和CRC配置
  nRF2401_WR(RX2EN_NO|CM_SHOCK|RFDR_250K|XOF_16M|RF_PWR_0);		// 器件一般设置
  nRF2401_WR(RF_CH|RXEN_MODE);

  nRF2401_StandBy();       //写入配置字后,进入空闲模式
}

//----------------------nRF2401初始化函数---------------------//
void nRF2401_Inti(void)
{
            
  CLK1_CLR();             //CLK1 = 0
  DATA_CLR();             //DATA = 0
  nRF2401_StandBy();      //PWR_UP = 0
                          //CS = 0
                          //CE = 0

  nRF2401_Config();       //配置nRF2401
  nRF2401_RXMODE();		  //设置到接收模式
}

//----------------设置nRF2401对方接收的发射地址--------------//
void nRF2401_SetTXAddr(void)
{
  nRF2401_WR(TX_ADDR_3);     //这里假设对方接收地址宽度为4个字节
  nRF2401_WR(TX_ADDR_2);
  nRF2401_WR(TX_ADDR_1);
  nRF2401_WR(TX_ADDR_0);
}

//----------------设置nRF2401对方接收的发送数据--------------//
void nRF2401_SetTXData(void)
{
  uchar i;
  for(i=0;i<SIZE;i++)
    nRF2401_WR(TxBuf[i]);
}

//-----------------nRF2401发射数据---------------------------//
void nRF2401_SendData(void)
{
  nRF2401_TXMODE();          //进入或切换到发射模式
  CE_SET();                  // CE = 1
  _nop_();
  nRF2401_SetTXAddr();		 //写发送地址
  nRF2401_SetTXData();		 //写发送数据
  CE_CLR();                  //启动发射
  delayUS(1);				 //11us
  nRF2401_StandBy();         //进入空闲模式,节省功率
}

//--------------------MCU读数据-----------------------------//
void nRF2401_ReadData(void)
{
  uchar i;
  for(i=0;i<SIZE;i++)
    RxBuf[i]=nRF2401_RD();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -