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

📄 nrf905.c

📁 无线收发程序
💻 C
字号:
#include <avr/io.h>
#include <util/delay.h>
#include "nRF905_Config.h"
#include "nRF905.h"

unsigned char ReceiveBuffer[BUF_SIZE];			// RF接收缓冲区
unsigned char SendBuffer[BUF_SIZE];			// RF发送缓冲区
unsigned char ReceiveCount;				// RF接收缓冲区接收个数
unsigned char SendCount;				// RF发送缓冲区发送个数

void SPI_Init(void)
{
	PORT_SPI |= (1<<MOSI)|(1<<MISO)|(1<<SCK)|(1<<SS);  // 设置MOSI和SCK、SS为输出,其他为输入
	DDR_SPI  |= (1<<MOSI)|(1<<SCK)|(1<<SS);
	SPCR   = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0);   // 主机模式,fck/16, SPI方式0
}

unsigned char SPI_ReadWrite(unsigned char cData)
{
	SPDR = cData;
	while(!(SPSR & (1<<SPIF) ))			// 等待SPI发送完毕
		;
	return SPDR;
}

void nRF905_Init(unsigned long nRF_rxaddr)
{
	unsigned char i;
	DDR_NRF905 |= ((1<<TX_EN)|(1<<TRX_CE)|(1<<PWR_UP)|(0<<DR)|(0<<AM)|(0<<CD));
	PORT_NRF905 |= ((0<<TX_EN)|(0<<TRX_CE)|(1<<PWR_UP)|(1<<DR)|(1<<AM)|(1<<CD));

	nRF905_SetConfig(nRF_rxaddr);				// 初始化nRF905,并设置接收地址
	nRF905_SetReceiveMode(); 				// 设置为接收模式

	/* 发送缓冲区,接收缓冲区清零 */
	for(i = 0; i < BUF_SIZE; ++i)
	{
		SendBuffer[i] = 0;
		ReceiveBuffer[i] = 0;
	}
}

unsigned char nRF905_ReadStatus(void)
{
	unsigned char val;

	CLR_SS();					// 打开SPI
	val = SPI_ReadWrite(RC);			// 读状态
	SET_SS();					// 关闭SPI

	return val;
}

void nRF905_SetSendMode(void)
{
	_delay_ms(1);
	SET_TX_EN();					// 设置为发送模式
	/*asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");*/
	_delay_ms(1);
	CLR_TRX_CE();					// 待机PORTD &= ~(1<<TRX_CE);
	_delay_ms(1);
}

void nRF905_SetReceiveMode(void)
{

	/*asm("nop");
	asm("nop");
	asm("nop");
	*/
	CLR_TX_EN();					// 设置为接收模式
	//asm("nop");
	_delay_ms(1);
	SET_TRX_CE();					// 使能接收
	/*asm("nop");
	asm("nop");
	asm("nop");
	*/
	_delay_ms(1);

}

void nRF905_SendStart(void)
{
	SET_TRX_CE();					// 开始发送
	_delay_ms(10);					// while(DR!=1);
	CLR_TRX_CE();					// 待机模式
}

void nRF905_SetConfig(unsigned long nRFAddr)		//配置nRF905
{
	CLR_TRX_CE();					//设置nRF905为待机方式
	asm("nop");

	CLR_SS();					//打开SPI
	// 配置字总共10个字节
	SPI_ReadWrite(WC);                		// Write config command
	SPI_ReadWrite(CH_NO_BYTE);                       // 中心频率低8位
	SPI_ReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); 	// 发射+10dBm,发射频率433MHz,中心频率第9位=0
	SPI_ReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE);     	// 接收地址宽度4字节,发送地址宽度4字节  0100 0100
	SPI_ReadWrite(RX_PW_32BYTE);                    	// 接收数据宽度32字节
	SPI_ReadWrite(TX_PW_32BYTE);                    	// 发送数据宽度32字节
	SPI_ReadWrite((nRFAddr >> 24));  		// 接收有效地址第1字节
	SPI_ReadWrite((nRFAddr >> 16) & 0xff);           // 接收有效地址第2字节
	SPI_ReadWrite((nRFAddr >> 8) & 0xff);            // 接收有效地址第3字节
	SPI_ReadWrite(nRFAddr & 0xff);                   // 接收有效地址第4字节  
	SPI_ReadWrite(CRC16_EN | XOF_16MHz);            	// CRC16模式使能,晶体振荡器频率16MHz
	SET_SS();					// 关闭SPI

	if ( PORT_NRF905 & (1 << TX_EN) )		//再回到原来的无线收发模式
	{
		CLR_TRX_CE();				//设置nRF905为待机方式
	}
	else
	{
		SET_TRX_CE();				//设置nRF905为工作方式
	}

}

void nRF905_ReceivePacket(void)
{
	unsigned char i;
	nRF905_SetReceiveMode();			// 设置接收模式
	// CD=1且AM=0,DR=0
	//if(   ( PIN_NRF905 & (1<<CD) )
	//		&& ((PIND & ((1<<AM)|(1<<DR)) ) == 0) 
	//  )
	{
		CLR_TRX_CE();				// 待机模式
		asm("nop");
		CLR_SS();
		SPI_ReadWrite(RRP);
		for(i = 0; i < 32; ++i)
		{
			ReceiveBuffer[i] = SPI_ReadWrite(0xff);
		}
		SET_SS();
		while(PIN_NRF905 & ((1<<AM)|(1<<DR)) );		// 等待
		ReceiveCount = 32;
		SET_TRX_CE();
//		LED_ON();
	}
}

/* 参数为接收端的地址,即:发送给谁? */
void nRF905_SendPacket(unsigned long nRF_rxaddr)
{
	unsigned char i;
	if( (PIN_NRF905 & ((1<<CD)|(1<<AM)|(1<<DR))) == 0 )	// 周边无射频信号
	{
		nRF905_SetSendMode();
		//LED_ON();

		asm("nop");
		asm("nop");
		asm("nop");
		_delay_ms(1);
		
		CLR_SS();
		SPI_ReadWrite(WTA);				// 写发送地址
		SPI_ReadWrite((nRF_rxaddr >> 24));  		// 接收有效地址第1字节
		SPI_ReadWrite((nRF_rxaddr >> 16) & 0xff);           // 接收有效地址第2字节
		SPI_ReadWrite((nRF_rxaddr >> 8) & 0xff);            // 接收有效地址第3字节
		SPI_ReadWrite(nRF_rxaddr & 0xff);                   // 接收有效地址第4字节  
		SET_SS();

		asm("nop");
		asm("nop");
		asm("nop");

		CLR_SS();
		SPI_ReadWrite(WTP);
		for( i = 0; i < 32; ++i )
		{
			SPI_ReadWrite(SendBuffer[i]);
		}
		SET_SS();

		SendCount = 32;
		nRF905_SendStart();					// 开始发送
		nRF905_SetReceiveMode();			// 发送完毕回到接收模式			

		//LED_OFF();
	}
}


⌨️ 快捷键说明

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