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

📄 nrf905._c

📁 基于m16的nrf905接收发送程序
💻 _C
字号:
#define _nrf905_c_
#include "nrf905.h"
#include "LCD.h"

//延时--------------------------------------------------
void DelayMs( uchar ms )
{
 	 char i;
	 
	 for( i = 0; i < ms; i++ )
     {
	  	 DelayUs( 1000 );
	 }
	 
     return;
}

void DelayUs(uint us)
{ 
  uint i;
  for( i = 0; i < us; i++ )
  { NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); }
}
//-----------------------------------------------------------------

//配置nRF905
void nrf905_Config(void)
{
  CLR( PORT_SPI, CSN );                                // Spi 片选开
  nrf905_SpiRW(WC);                              // Write config command
  nrf905_SpiRW(CH_NO_BYTE);                      //中心频率低8位
  nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
  nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节
  nrf905_SpiRW(RX_PW_1BYTE);                     //接收数据宽度32字节
  nrf905_SpiRW(TX_PW_1BYTE);                     //发送数据宽度32字节
  nrf905_SpiRW(RX_ADDRESS_0);                    //接收有效地址第1字节
  nrf905_SpiRW(RX_ADDRESS_1);                    //接收有效地址第2字节
  nrf905_SpiRW(RX_ADDRESS_2);                    //接收有效地址第3字节
  nrf905_SpiRW(RX_ADDRESS_3);                    //接收有效地址第4字节
  nrf905_SpiRW(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz
  SET( PORT_SPI, CSN );                 // Disable Spi
}

//spi寄存器以及端口初始化
void SPI_Init(void)
{
	DDR_SPI |= ( 1 << MOSI ) | ( 1 << MISO ) | ( 1 << SCK ) | ( 1 << CSN );  // 设置MOSI和SCK、SS为输出,其他为输入
	PORT_SPI  |= ( 1 << MOSI ) | ( 1 << SCK ) | ( 1 << CSN );
	SPCR   |= ( 1 << SPE ) | ( 1 << MSTR ) | ( 0 << CPOL ) | ( 0 << SPR0);   // 主机模式,fck/16, SPI方式0
}

//nRF端口初始化
void nrfport_init( void )
{
    DDR_NRF |= ( 1 << TX_EN ) | ( 1 << TRXCE ) | ( 0 << DR ) | ( 1 << PWR );
	PORT_NRF |= ( 1 << TX_EN ) | ( 1 << TRXCE ) | ( 1 << DR ) | ( 1 << PWR );
}

//spi读写函数 	
uchar nrf905_SpiRW( uchar val )                   
{
    SPDR = val;
	while ( ( SPSR & ( 1 << SPIF ) ) == 0 );
	return SPDR;
}

//Standby 和SPI 编程模式, 一般在初始化写配置信息时用到。
void nrf905_StandBy( void )
{
   SET( PORT_NRF, PWR );          //PWR_UP = 1   上电      
   CLR( PORT_NRF, TRXCE );        //TRX_CE = 0   关闭发送或接收
   CLR( PORT_NRF, TX_EN );        //TX_EN  = X   任意值, 当TRX_CE = 1时起作用
}

//掉电和SPI 编程
void nrf905_Off( void )
{
  CLR( PORT_NRF, PWR );
}

//发送模式
void nrf905_TxOn( void )
{
  SET( PORT_NRF, PWR );          //注意顺序
  SET( PORT_NRF, TX_EN );        //使能发送
  CLR( PORT_NRF, TRXCE );        //在这里还没有启动发送 
}

//启动发送
void nrf905_TxSend( void )    
{
  SET( PORT_NRF, TRXCE );
  DelayUs(20);                      //>10us
  CLR( PORT_NRF, TRXCE );           //只发送一次
}

//接收模式
void nrf905_RxOn( void )
{
  SET( PORT_NRF, PWR );            //注意顺序
  CLR( PORT_NRF, TX_EN );          //maybe first
  SET( PORT_NRF, TRXCE );          //
}

//初始化nrf905
void nrf905_Init( void )
{
   nrfport_init();         //配置nrf端口
   
   nrf905_StandBy();       //掉电与spi编程模式
   
   DelayMs(10);            //!!!must >3ms
   
   nrf905_Config();        //配置nrf 
   
   nrf905_RxOn();          //初始化为接收模式
}


//写Tx地址
void nrf905_SetTxAddr( void )
{
  CLR( PORT_SPI, CSN );             //启动spi   
  nrf905_SpiRW( WTA );              //写Tx地址  写TX 地址1-4 字节写操作全部从字节0 开始 
  nrf905_SpiRW( TX_ADDRESS_0 );
  nrf905_SpiRW( TX_ADDRESS_1 );
  nrf905_SpiRW( TX_ADDRESS_2 );
  nrf905_SpiRW( TX_ADDRESS_3 );
  SET( PORT_SPI, CSN );  
}

//写数据
void nrf905_SetData( uchar set_data )
{
  CLR( PORT_SPI, CSN );                //启动spi 
  nrf905_SpiRW( WTP );                 //写TxPayload 向发送数据寄存器写特征字
  nrf905_SpiRW( set_data );            //写数据
  SET( PORT_SPI, CSN) ;                //关闭spi
}

//等待发送结束
void nrf905_WaitSended( void )
{
   while ( ( PIN_NRF &( 1 << DR ) ) == 0 );
}

//发送数据
void nrf905_SendData( uchar tx_data )
{
   nrf905_TxOn();            //切换到发送模式
   nrf905_SetTxAddr();       //写发送地址
   nrf905_SetData( tx_data );//写数据
   nrf905_TxSend();          //启动发送
   nrf905_WaitSended();      //等待发送结束 
   //nrf905_Off(); 
}

//读出接收到的数据
uchar nrf905_ReadData( void )
{
  uchar i;
  uchar rx_tmp;                //定义读出的数据,暂存值
  
  CLR( PORT_SPI, CSN );                   
  nrf905_SpiRW( RRP );         //读RxPayload,RRP, 读数据寄存器特征字, 说明的是从字节0开始读32个字节的数据  
  rx_tmp = nrf905_SpiRW( 0 );
  SET( PORT_SPI, CSN );
  
  return rx_tmp;               //返回接收到的数据  
}

//接收过程
//
//
//
//
//
//
//

⌨️ 快捷键说明

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