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

📄 nrf905.c

📁 nrf905在magicARM实验箱上实现的代码 主函数包含了发送和接受的标准函数 驱动包在NRF905文件夹里
💻 C
字号:
/****************************************************************************
* 文 件 名:nRF905.c
* 功    能:nRF905的接收与发送
* 说    明:包含发送与接收的所有函数。
* 作    者:TANK  
* 邮    箱:tank3221@sina.com
* 完成时间:2007年5月25日
****************************************************************************/

#include  "config.h"
/*--------------------------------------------------
                 引脚连接预定义区
---------------------------------------------------*/ 

#define   PWR       1<<16       // P1.16  掉电控制
#define   EN	    1<<17       // P1.17  收发选择
#define   CE		1<<18		// P1.18  收发启动
#define   TEST1     1<<19       // P1.19  测试引脚1
#define   TEST2	    1<<20       // P1.20  测试引脚2

#define   CD        0<<23		// P0.23  载波检测
#define   AM		0<<25		// P0.25  地址匹配
#define   DR        0<<24       // P0.24  数据完毕
#define   RD        1<<24       // P0.24  ready信号。
  
#define   CSN	    1<<20       // P0.20  从机片选  


                  
/****************************************************************************
* 名    称:Delay()
* 功    能:短软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  Delay(uint32  dly)
{ 
    for(; dly>0; dly--);  
}

/****************************************************************************
* 名    称:nRF905_init()
* 功    能:905各控制、信号线引脚初始化
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  nRF905_init(void)
{ 
    PINSEL0 |= 0x00000005; // 设置I/O连接到UART0
	PINSEL1  = 0x00000000;
	IO0DIR =  CSN   |      // CSN <--> P0.20  片选输出线
	          CD    |      // CD  <--> P0.23 CD  信号线
	          AM    |      // AM  <--> P0.24 AM  信号线
	          DR    ;      // DR  <--> P0.25 DR  信号线
	          
    IO1DIR =  PWR   |      // PWR    控制线
              CE    |      // CE     控制线
              EN    |      // EN     控制线
              TEST1 |      // test1  测试线
              TEST2 ;      // test2  测试线

}
/*----------------------------------------------------------------------------
                              初始化函数
                         
                       包括 SpiInit() SPI接口初始化及连接设置
                            Init() LPC2200 引脚方向初始化
                            SendData() SPI发送接收数据函数
-----------------------------------------------------------------------------*/ 
/****************************************************************************
* 名    称:SpiInit()
* 功    能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
* 说    明:传输格式必须对照905的SPI总线传输方式设置
****************************************************************************/
void  SpiInit(void)
{  
	PINSEL0 |= 0x00005500;
	
    S0PCCR = 0x52;		            // 设置SPI时钟分频
 	S0PCR  = (0 << 3) |				// CPHA = 0, 数据在SCK 的第一个时钟沿采样
 			 (0 << 4) |				// CPOL = 1, SCK 为低有效
 			 (1 << 5) |				// MSTR = 1, SPI 处于主模式
 			 (0 << 6) |				// LSBF = 0, SPI 数据传输MSB (位7)在先
 			 (0 << 7);				// SPIE = 0, SPI 中断被禁止
    

}
/****************************************************************************
* 名    称:Magic905_Init(void)
* 功    能:SPI初始化、905各引脚初始化
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  Magic905_Init(void)
{  
	SpiInit();
    nRF905_init();
}

/****************************************************************************
* 名    称:SendData()
* 功    能:向SPI总线“发送”或“接收”数据,并接收从机发回的数据。
* 入口参数:data        待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/
uint8  SendData(uint8 data)
{  
    S0PDR = data;
    while( 0==(S0PSR&0x80) );		// 等待SPIF置位,即等待数据发送完毕
    return(S0PDR);
}	
/*----------------------------------------------------------------------------
                         nRF905状态改变函数
                         
                       包括 OFFMode  掉电模式
                            WaitMode 等待模式
                            TxMode   发送模式
                            RxMode   接收模式
-----------------------------------------------------------------------------*/ 
/****************************************************************************
* 名    称:OFFMode()  
* 功    能:关机/掉电模式 PWR=0 时,nRF905处于掉电模式
* 入    口:无
* 出    口:无
****************************************************************************/
void  OFFMode(void)
{ 
    IO1CLR = PWR ;                  // PWR = 0
    Delay(1);
}
/****************************************************************************
* 名    称:WaitMode()  空闲/等待模式 10X
* 功    能:空闲等待电模式 PWR=1,CE=0 时,nRF905处于空闲等待模式
* 入    口:无
* 出    口:无
****************************************************************************/
void  WaitMode(void)
{ 
    IO1SET = PWR ;                  // PWR = 1
    IO1CLR = CE  ;                  // CE = 0
    Delay(1);
}
/****************************************************************************
* 名    称:RxMode()   射频接收模式 110
* 功    能:接收模式 PWR=1,CE=1,EN=0 时,nRF905处于接收模式
* 入    口:无
* 出    口:无
****************************************************************************/
void  RxMode(void)
{ 
    IO1SET = ( PWR | CE );           // PWR=1  CE=1
    IO1CLR =  EN ;                   // EN=0
    Delay(1);
}
/****************************************************************************
* 名    称:TxMode()   射频发送模式 111
* 功    能:发送模式 PWR=1,CE=1,EN=1 时,nRF905处于发射模式
* 入    口:无
* 出    口:无
****************************************************************************/
void  TxMode(void)
{ 
    IO1SET = ( PWR | EN | CE );      // PWR=1,CE=1,EN=1
    Delay(1);
}
/****************************************************************************
* 名    称:nRFconfig() 射频配置函数 命令 00H
* 功    能:通过SPI总线对905进行射频配置字设置。
* 入口参数:rfcon 配置字数组
* 出口参数:无
****************************************************************************/
void  nRFconfig(uint8 * rfcon)
{   
    uint8 i;
    uint8 data;
    WaitMode();                      //  空闲模式 
    
    IO0CLR = CSN;                    //  使能从机
    
    data = SendData(0x00);           //  发送配置命令
    for(i=0;i<10;i++)                //  循环数为10,保证配置正确
    { 
       data = SendData(rfcon[i]);    //  写配置字  
    }

   IO0SET = CSN ;                    //  关闭使能 
}
/****************************************************************************
* 名    称:RDnRFconfig() 读射频配置函数 命令 10H
* 功    能:通过SPI总线从905读出射频配置字。
* 入口参数:tempbuf 配置字数组
* 出口参数:无
****************************************************************************/
void  RDnRFconfig(uint8 * tempbuf)
{   
    uint8 i;
    WaitMode();                       //  空闲模式 
    
    IO0CLR = CSN;                     //  使能从机
    
    tempbuf[0] = SendData(0x10);      //  发送读配置命令
    for(i=0;i<10;i++)                 //  循环数固定为10,保证配置正确
    { 
       tempbuf[i] = SendData(0xAA);   //  读配置字  
    }

   IO0SET = CSN ;                     //  关闭使能 
}
/****************************************************************************
* 名    称:WTxData() 写发送数据 命令 20H
* 功    能:通过SPI总线向905写入要发送的数据。
* 入口参数:txbuf 发送数据变量
            no    数据发送数(需根据配置字设置,不能随意更改)
* 出口参数:无
****************************************************************************/
void  WTxData(uint8 * txbuf,uint8 datno)
{   
    uint8 i;
    uint8 j;
    uint8 data;
    
    j = datno ;
    if( i<1 ) j = 1 ;                 //  发送字节数不能少于1个
    j &= 0x3f ;                       //  取发送字节数的后6位  
    if( i>32 ) j = 32;                //  保证发送字节数不多于32个
    
    IO0CLR = CSN ;                    //  从机使能
    
    data = SendData(0x20);            //  写发送数据命令字
    
    for(i=0;i<j;i++)
    {
       data = SendData(txbuf[i]);     //  读发送数据
    } 
 
    IO0SET = CSN ;                    //  关闭使能
    
}

/****************************************************************************
* 名    称:RTxData() 读发送数据 命令 21H
* 功    能:通过SPI总线从905读出发送的数据。
* 入口参数:no 读出的数据个数(需要结合配置字,不能随意更改)
* 出口参数:无
* 说    明:读出的数据写入 temp变量中
****************************************************************************/
void  RTxData(uint8 * tempbuf,uint8 datno)
{  
    uint8 i;
    uint8 data;
    uint8 j;
    
    j = datno ;
    if( i<1 ) j = 1 ;               //  发送字节数不能少于1个
    j &= 0x3f ;                     //  取发送字节数的后6位  
    if( i>32 ) j = 32;              //  保证发送字节数不多于32个
    
   IO0CLR = CSN ;                   //  使能从机
    
    data = SendData(0x21);          //  写读发送数据命令
    
    for(i=0;i<j;i++)
    {
       tempbuf[i] = SendData(0xAA);    //  写发送数据
    }  

   IO0SET = CSN ;                   //  关闭使能

}

/****************************************************************************
* 名    称:WTxAddr() 写发送地址 命令 22H
* 功    能:通过SPI总线向905写入要发送的地址。
* 入口参数:txaddr 地址变量
* 出口参数:无
****************************************************************************/
void  WTxAddr(uint8 * txaddr,uint8 adrno)
{  
    uint8 i;
    uint8 data;
    uint8 j;
    
    j = (adrno >> 4) & 0x0f ;       //  读取高4位( TX_AFW 发送地址宽度)
    if(j<1) j = 1 ;                 //  保证地址字节数大于等于1
    if(j>4) j = 4 ;                 //  保证地址字节数小于等于4
    
   IO0CLR = CSN ;                   //  使能从机
   
    data = SendData(0x22);          //  写发送地址命令
    
    for(i=0;i<j;i++)
    {
       data = SendData(txaddr[i]);  //  写发送地址
    }  
      
   IO0SET = CSN ;                   //  关闭使能
}

/****************************************************************************
* 名    称:RTxAddr() 读发送地址 命令 23H
* 功    能:通过SPI总线从905读出发送地址。
* 入口参数:tempbuf 一般数据缓冲区变量
* 出口参数:无
* 说    明:读出的发送地址写到 temp变量中
****************************************************************************/
void  RTxAddr(uint8 * tempbuf,uint8 adrno)
{  
    uint8 i;
    uint8 data;
    uint8 j;
    
    j = (adrno >> 4) & 0x0f ;        //  读取高4位( TX_AFW 发送地址宽度)
    
    if(j<1) j = 1 ;                  //  保证地址字节数大于等于1
    if(j>4) j = 4 ;                  //  保证地址字节数小于等于4
    
   IO0CLR = CSN ;                    //  从机使能
   
    data = SendData(0x23);           //  写读发送地址命令
    
    for(i=0;i<j;i++)
    {
       tempbuf[i] = SendData(0xAA);  //  读发送地址
    }  
    
   IO0SET = CSN ;                    //  关闭使能
    
}

/****************************************************************************
* 名    称:RRxData() 读接收数据 命令 24H
* 功    能:通过SPI总线从905读出接收到的数据。
* 入口参数:no 读出的数据数(需要结合配置字不能随意更改)
            tempbuf 数据读出位置
* 出口参数:无
****************************************************************************/
void  RRxData(uint8 * tempbuf,uint8 datno)
{  
    uint8 i;
    uint8 data;
    uint8 j;
    
    j = datno ;
    if( i<1 ) j = 1 ;                //  发送字节数不能少于1个
    j &= 0x3f ;                      //  取发送字节数的后6位  
    if( i>32 ) j = 32;               //  保证发送字节数不多于32个
    
    IO0CLR = CSN ;                   //  从机使能
  
    data = SendData(0x24);           //  写读接收数据命令

    for(i=0;i<j;i++)
    {
       tempbuf[i] = SendData(0xAA);    //  读接收数据
    }  
    
    IO0SET = CSN ;                   //  关闭使能
}
/****************************************************************************
* 名    称:TxPacket()
* 功    能:发送数据包据。
* 入口参数:txaddr  发送地址变量
            txbuf   发送数据缓冲区
* 出口参数:无
****************************************************************************/
void  TxPacket(uint8 * txaddr,uint8 adrno,uint8 * txbuf,uint8 datno)
{  
    WaitMode();                 //  进入等待模式,准备配置。
    
    WTxAddr(txaddr,adrno);            //  写 发送地址 
    Delay(1);                   //  延时
    
    WTxData(txbuf,datno);  //  写发送数据 发送个数为配置字[4]字节,即发送数据长度
    Delay(1);
       
    TxMode();                   //  发射模式设置,启动发射
    
    while(0==(IO0PIN&RD));      //  等待RD(ready)发送完信号
    
    WaitMode();                 //  数据发送完毕,进入等待模式。
}

/****************************************************************************
* 名    称:RxPacket()
* 功    能:接收数据包。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  RxPacket(uint8 * rxbuf,uint8 datno)
{  
    RxMode();
    
    while(0==(IO0PIN&RD));     // 等待接受 到 数据信号
    
    WaitMode();                // 等待模式
    
    RRxData(rxbuf,datno);       // 接收数据 接收字节数为接收配置[3]字节
      
    while(0!=(IO0PIN&RD));     // 等待接收 完 数据信号 必要时再加
    
    
}

⌨️ 快捷键说明

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