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

📄 nrf2401a_pub.c

📁 nrf2401射频模块接受和发射代码
💻 C
字号:
/****************************************************************************
 **           
 **     ERC-RF2401无线收发模块驱动程序
 **     
 **     用户须知:
 **         该驱动程序为傻瓜版本,无需对模块过多了解,使用简单
 **         用户唯一需要的就是对实际的IO管脚重新定义
 **         原驱动开发使用CPU类型为 AVR ATmega48,IDE环境为IAR
 **         用户使用接口函数只有三个:
 **         nRF2401AInitializtion() nRF2401AScanf() nRF2401APrintf()
 **         模式切换全部由驱动内部软件处理
 **         更多代码实例参照RF2401-FE模块开发手册
 **         http://www.hzfeidi.com.cn
 **     
 **                         杭州ERC实验室 参上
 ***************************************************************************/

#include "nRF2401A_pub.h"


/******************************************基本函数********************************************/

/*8bit写入*/
void nRF2401AWrite8Bit(unsigned char byte)
{
  unsigned char temp;
  
  nRF2401A_WRITE_DATA();
  for(temp=8;temp>0;temp--)
  {  
    nRF2401A_DATA = (byte&0x80)>>7; 
    byte = byte<<1;
    nRF2401A_CLK1 = 0;
    nRF2401A_CLK1 = 0;
    nRF2401A_CLK1 = 0;
    nRF2401A_CLK1 = 1;
    nRF2401A_CLK1 = 1;
  }
  nRF2401A_CLK1 = 0;
}

/*1通道8bit读出*/
unsigned char nRF2401ARead8BitChannel_1(void)
{
  unsigned char temp;
  unsigned char byte = 0x00;
   
  nRF2401A_READ_DATA();
  for(temp=8;temp>0;temp--)
  {
    byte = byte<<1;
    nRF2401A_CLK1 = 1;
    nRF2401A_CLK1 = 1;
    nRF2401A_CLK1 = 1;
    nRF2401A_CLK1 = 1;
    byte = byte|(nRF2401A_DATA_PIN&0x01);
    nRF2401A_CLK1 = 0;
  }
  return(byte);
}

/****************************************扩展函数*******************************************/

/*配置寄存器*/
void nRF2401AConfigRegisters(unsigned char* p)
{
  unsigned char temp;
  
  nRF2401A_CONFIG_MODE();
  for(temp=0; temp<15; temp++)
  {
    nRF2401AWrite8Bit(p[temp]);
  }
  nRF2401A_STANDBY_MODE();
}

/*写通道1发送数据寄存器*/
void nRF2401AWriteTxPayload(unsigned char* p,unsigned char total)
{
  unsigned char temp;
  
  nRF2401A_ACTIVE_MODE();
  nRF2401AWrite8Bit(0xcc);//发送地址高8位默认设定为0xcc
  nRF2401AWrite8Bit(0xcc);//发送地址低8位默认设定为0xcc
  for(temp=0; temp<total; temp++)
  {
   nRF2401AWrite8Bit(p[temp]);
  }
  nRF2401A_STANDBY_MODE();
}

/*读通道1接收数据寄存器*/
void nRF2401AReadRxPayload(unsigned char* p,unsigned char total)
{
  unsigned char temp;
  
  nRF2401A_ACTIVE_MODE();
  for(temp=0; temp<total; temp++)
  {
    p[temp] = nRF2401ARead8BitChannel_1();
  }
}


/****************************************常用函数*******************************************/
/*初始化函数*/
void nRF2401AInitializtion()
{
  nRF2401A_IO_INITIALIZTION();
  nRF2401A_CONFIG_MODE();
  for(unsigned char time=0; time<50; time++)
  {
    for(unsigned char i=0; i<250; i++);
  }//延迟3毫秒,稳定时间
  nRF2401AWrite8Bit(nRF2401AConfig_Byte14);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte13);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte12);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte11);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte10);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte9);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte8);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte7);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte6);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte5);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte4);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte3);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte2);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte1);
  nRF2401AWrite8Bit(nRF2401AConfig_Byte0);
  nRF2401A_STANDBY_MODE();
  nRF2401A_ACTIVE_MODE();
}

/*接收通道1数据包(28字节)*/
unsigned char nRF2401AScanf(unsigned char* p)
{
  if (nRF2401A_DR1_PIN==0){
    return (0);}
  
  nRF2401AReadRxPayload(p,28);
  return(1);
}

/*发送通道1数据包(28字节)*/
void nRF2401APrintf(unsigned char* p)
{
  nRF2401A_CONFIG_1BIT(0);  //配置为发射
  nRF2401AWriteTxPayload(p,28);
  for(unsigned char time=0; time<10; time++)
  {
    for(unsigned char i=0; i<250; i++);
  }//延迟1280us         //适合250K的传输速率  Tsby2txSB+Toa(Tsby2txSB=195us Toa=1/datarate*(#databits+1)=1/250000*257=1028us)
  nRF2401A_CONFIG_1BIT(1);  //配置为接收
  nRF2401A_ACTIVE_MODE();
}

/**********************************************/

/*发送范例
unsigned char tx_buf[28];
unsigned char rx_buf[28];
void main()
{
  nRF2401AInitializtion();
  tx_buf[0] = 0;
  tx_buf[1] = 1;//在发送数组中写入所需信息
  while(1)
  {
    nRF2401APrintf(tx_buf);
    //用发送函数调用发送数组,将其打包发送
  }
}
*/

/*接收范例
unsigned char tx_buf[28];
unsigned char rx_buf[28];
void main()
{
  nRF2401AInitializtion();
  while(1)
  {
    while(nRF2401AScanf(rx_buf)!=1);
    //当没有接收到数据包时候无限循环,一旦接收到数据包则将其写入所指定的32字节接收数组rx_buf中
    PORTB = rx_buf[0];
    //将接收到的数据包的第一个字节从B口输出
  }
}
*/

/*转发包范例
unsigned char buf[28];
void main()
{
  nRF2401AInitializtion();
  while(1)
  {
    while(nRF2401AScanf(buf)!=1);//等待收到数据包
    nRF2401APrintf(buf);//将收到的数据包原样发送
    //注释:nRF2401APrintf() nRF2401AScanf() 两个函数调用顺序完全随意不用考虑两者间的内在影响
  }
}
*/

















⌨️ 快捷键说明

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