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

📄 nrf2401.c

📁 STM32+ov7670
💻 C
字号:
# include "Delay.h"
# include "nRF2401.h"
# include "USART.h"
//通过宏定义将 18 字节的寄存器参
//数按照各个功能分解,以便于参数	
//的调整						
static unsigned char nRF2401_Conf[18]=
{
	RFConfig_Bit0, RFConfig_Bit1, RFConfig_Bit2, RFConfig_Bit3,	RFConfig_Bit4,
	RFConfig_Bit5, RFConfig_Bit6, RFConfig_Bit7, RFConfig_Bit8, RFConfig_Bit9,
	RFConfig_Bit10, RFConfig_Bit11, RFConfig_Bit12, RFConfig_Bit13, 
	RFConfig_Bit14,	RFConfig_Bit15, RFConfig_Bit16, RFConfig_Bit17
}; 
//用于ByteRead和ByteWrite函数	
static unsigned char Data_Buffer; 


//数据在高电平时读取			
unsigned char ByteRead(void)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{
		Data_Buffer=Data_Buffer<<1;
		CLK1_SET();
		
		//NRF_DDR&=~(1<<DATA);			//设置为输入状态						
		//DATA_SET();
		NRF2401_DATA_IN;				//设置为输入状态
		if(DATA_STATE)
		{
			Data_Buffer|=BYTE_BIT0;
		}
		else
		{
			Data_Buffer&=~BYTE_BIT0;
		}
		CLK1_CLR();
	}
	return Data_Buffer;
}
//数据在上升沿时写入			
void ByteWrite(unsigned char send)
{
	unsigned char i;
	Data_Buffer=send;
	//NRF_DDR|=((1<<DATA)|(1<<CLK1));
	NRF2401_DATA_OUT;
	for (i=0;i<8;i++)
	{
		if (Data_Buffer&BIT(7))     	//总是发送最高位						
		{
			DATA_SET();
		}
		else
		{
			DATA_CLR();
		}
		CLK1_SET();
		Data_Buffer=Data_Buffer<<1;
		CLK1_CLR();
	}
}

//<2401 配置寄存器的写入方式>													
/*NOTE.																			
On the falling edge of CS, the nRF2401A updates the number of bits actually shi_
fted																			
in during the last configuration.												
Ex:																				
If the nRF2401A is to be configured for 2 channel RX in ShockBurst., a total of 
120																				
bits must be shifted in during the first configuration after VDD is applied.	
Once the wanted protocol, modus and RF channel are set, only one bit (RXEN) is	
shifted in to switch between RX and TX.											
注意  :2401 配置寄存器的数据写入通过一移位寄存器完成						  */

void Config2401(void)
{
	unsigned int i;
	unsigned char variablel;
	//CS=0;				
	//CE=0;				
	//PWR_UP=1; //上电	
	
	//NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP));	//端口电平初始化
	RCC-> APB2ENR |= BIT(2);
	NRF_DDR &= 0xff000000;						//PA0-5
	NRF_DDR |= 0x00333333;						//推挽输出
	NRF_PORT |= 0x003F;							//PA0-5
	
	CS_CLR();
	CE_CLR();
	PWR_UP_CLR();
	Delay_nMS(6);							//从上电到进入配置模式需要3ms 的延时
	CS_SET();								//CS=1;     //使RF2401 进入配置方式	
	for (i=0;i<18;i++)
	{
		variablel=nRF2401_Conf[i];
		ByteWrite(variablel);
	}
	Delay_nUS(600);
	CS_CLR();								//CS 置低使配置有效					
	Delay_nUS(600);
}

void SetTxMode(void)
{
	//NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP)|(1<<DATA)|(1<<CLK1));
	NRF_DDR &= 0xff000000;						//PA0-5
	NRF_DDR |= 0x00333333;						//推挽输出
	NRF_PORT |= 0x003F;					
	//设置为配置模式	
	//PWR_UP=1;			
	//CE=0;				
	//CS=1;				
	PWR_UP_SET();
	CE_CLR();
	CS_SET();
	Delay_nUS(600);
	//配置寄存器0 字节RXEN  设置为0:发送模式
	//DATA =0;								
	//CLK1=1;								
	//CLK1=0;								
	DATA_CLR();
	CLK1_SET();
	CLK1_CLR();
	//设置为Activemodes(Tx)					
	//CS=0;									
	//CE=1;									
	CS_CLR();
	CE_SET();
	Delay_nUS(600);
}

void SetRxMode(void)
{
	//NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP)|(1<<DATA)|(1<<CLK1));
	NRF_DDR &= 0xff000000;						//PA0-5
	NRF_DDR |= 0x00333333;						//推挽输出
	NRF_PORT |= 0x003F;					
	//设置为配置模式	
	//PWR_UP = 1;		
	//CE=0;				
	//CS=1;				
	PWR_UP_SET();
	CE_CLR();
	CS_SET();
	Delay_nUS(600);
	//配置寄存器0 字节RXEN 设置为 1:接收模式
	//DATA =1;								
	//CLK1=1;								
	//CLK1=0;								
	DATA_SET();
	CLK1_SET();
	CLK1_CLR();
	//设置为Activemodes(Rx)					
	//CS=0;									
	//CE=1;									
	CS_CLR();
	CE_SET()
	Delay_nUS(600);
	
	//NRF_DDR&=~(1<<DATA);
	NRF2401_DATA_IN;
}

//nRF2401 数据发送函数			
void nRF2401_TxPacket(unsigned char* p_TxBuf)
{
	unsigned char i = 0;
	static unsigned char TxAddress[]={0xcc,0xcc,0xcc,0xcc};//接收方通道硬件地址	
	unsigned char variable2;
	CE_SET();
	for (i=0;i< (ADDR_W/8);i++)				//写入接收地址(按字节对齐)			
	{
		variable2=TxAddress[i];
		ByteWrite(variable2);
	}
	for (i=0;i<(DATA1_W/8);i++)				//写入需要发送的数据(按字节对齐)	
	{
		variable2 = p_TxBuf[i];
		ByteWrite(variable2);
	}
	CE_CLR();								//CE=0; //CE 置低使发送有效			
	Delay_nUS(200);
}

//检测并接收数据函数			
//返回  0:没有数据接收			
//      1:接收到数据			
unsigned char nRF2401_RxPacket(unsigned char* p_RxBuf)
{
	unsigned char i = 0;
	//NRF_DDR &= ~(1<<DR1);
	//DR1_SET();
	NRF2401_DR1_IN;
	if(DR1_STATE)
	{
		for (i=0; i<DATA1_W/8; i++)
		{
			*p_RxBuf = ByteRead();
			p_RxBuf ++;
		}
		return 1;
	}
	return 0;
}
//新增函数,功能上与UART模块部分
//的Get_PC_Rate相同				
/*
long int Get_PC_2401_Rate(void)
{
	static unsigned char Temp_Array[30] = {0};
	unsigned char i =0;
	long int Temp = 0;
	static long int Temp_Rate = 0;
	if(nRF2401_RxPacket(Temp_Array))
	{
		if((Temp_Array[0] == 0xaa)&&(Temp_Array[8] == 0x55))
		{
			Temp_Rate = 0;
			for(i=3; i<7; i++)
			{
				Temp = Temp_Array[i];
				Temp_Rate |= Temp_Array[i]<<((6-i)<<3);//8*(6-i)					
			}
		}
	}
	return Temp_Rate;
}
*/
unsigned char Get_PC_2401_Rate(long int* p_Rate)
{
	static unsigned char Temp_Array[30] = {0};
	unsigned char i =0;
	long int Temp = 0;
	static long int Temp_Rate = 0;
	
	static unsigned char ch_CMD = 0;
	if(nRF2401_RxPacket(Temp_Array))
	{
		if((Temp_Array[0] == 0xaa)&&(Temp_Array[8] == 0x55))
		{
			Temp_Rate = 0;
			for(i=3; i<7; i++)
			{
				Temp = Temp_Array[i];
				Temp_Rate |= Temp_Array[i]<<((6-i)<<3);//8*(6-i)					
			}
			ch_CMD = Temp_Array[2];
		}
		*p_Rate = Temp_Rate;
	}
	return ch_CMD;
}

⌨️ 快捷键说明

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