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

📄 main.c

📁 使用周立功的LPC2131开发板调试通过的无线模块RF905的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#define	JUDGE_RF905_CD	(IO0PIN & RF905_CD)

#define INRF905_AM	IO0DIR = IO0DIR & ~ RF905_AM
#define	JUDGE_RF905_AM	(IO0PIN & RF905_AM)












void ChangeMode(uint8 num)
{
	if(num==PowerDown)
	{
		RF905_PWRL;		/* 配置为掉电模式 */
		_delay_loop_(1);
		RF905_TX_ENL;
		_delay_loop_(1);
		RF905_TRX_ENL;
		_delay_loop_(1);
	}
	if(num==Standby)
  	{
        	RF905_TRX_ENL;
        	_delay_loop_(1);
  		RF905_TX_ENL;
  		_delay_loop_(1);
		RF905_PWRH;
		_delay_loop_(1);
	}
	if(num==RXMode)
	{

		RF905_TX_ENL;
		_delay_loop_(1);
		RF905_PWRH;
		_delay_loop_(1);
		Delayus(2);
        	RF905_TRX_ENH;
        	_delay_loop_(1);
	}
	if(num==TXMode)
	{
        	RF905_TX_ENH;
        	_delay_loop_(1);
		RF905_PWRH;
		_delay_loop_(1);
		RF905_TRX_ENL;
		_delay_loop_(1);
	}
	if(num==TXData)
	{
		RF905_TRX_ENH;		//Set TRX_CE high,start Tx data transmission
		_delay_loop_(1);
		Delayus(10);	
		RF905_TRX_ENL;		/* ??  Make a 20us Pulse as nRF905 Datasheet */
		_delay_loop_(1);
	}
}






void  RFSpiWrite(unsigned char Out_data)
{
	unsigned  char i;			
	for(i = 0;i<8;i++)
	{				
	  	if((Out_data << i) & 0x80)
	  	{
	   		RF905_DOUTH;
	  	}
	  	else
	  	{
	   		RF905_DOUTL;
	  	}
	  	RF905_SCLKH;
	  	Delayus(1);	  		 		
		RF905_SCLKL;					
	} 
					
}


unsigned char RFSpiRead(void)
{
	unsigned char i;	
	unsigned char dd;	
	dd=0;	
	for(i=0;i<8;i++)
	{
		dd<<=1;		
		RF905_SCLKH;						
		if(JUDGE_RF905_DIN)
		{
			dd|=0x00000001;
		}
		else
		{
			dd&=0xFFFFFFFE;
		}		
		RF905_SCLKL;
		
	}	
	return(dd);
}


void Config905(void) 		//配置nRF905
{
	RF905_CSNL;		//Spi enable for write a spi command 
	RFSpiWrite(WC);		// Write config command 
	RFSpiWrite(CH_NO_BYTE);                      //中心频率低8位
	RFSpiWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
	RFSpiWrite(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节
	RFSpiWrite(RX_PW_32BYTE);                    //接收数据宽度16字节
	RFSpiWrite(TX_PW_32BYTE);                    //发送数据宽度16字节
	RFSpiWrite(RX_ADDRESSB_0);                    //接收有效地址第1字节
	RFSpiWrite(RX_ADDRESSB_1);                    //接收有效地址第2字节
	RFSpiWrite(RX_ADDRESSB_2);                    //接收有效地址第3字节
	RFSpiWrite(RX_ADDRESSB_3);                    //接收有效地址第4字节
	RFSpiWrite(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz
	RF905_CSNH;                        // Disable Spi
}




void RF905_Read(uint8 RFcmd,uint8 *RFdata)
{
	uint8 i,len;
	if(RFcmd==WTA|RFcmd==RTA) len=4;
	else if(RFcmd==WC|RFcmd==RC) len=10;
	else if(RFcmd==WTP|RFcmd==RTP|RFcmd==RRP) len=32;
	else len=0;

	RF905_CSNL;		// Spi enable for write a spi command 
	RFSpiWrite(RFcmd);
	for(i=0;i<len;i++) RFdata[i]=RFSpiRead();
	RF905_CSNH; 
}



void RF905_Write(uint8 RFcmd,uint8 *RFdata)
{		
	uint8 i,len;
	if(RFcmd==WTA|RFcmd==RTA) len=4;
	else if(RFcmd==WC|RFcmd==RC) len=10;
	else if(RFcmd==WTP|RFcmd==RTP|RFcmd==RRP) len=32;
	else len=0;

	RF905_CSNL;					// Spi enable for write a spi command 
	RFSpiWrite(RFcmd);
	for(i=0;i<len;i++) RFSpiWrite(RFdata[i]);	// len Bytes Data 
	RF905_CSNH;                         		// Disable Spi
}


void TxPacket(void)
{
	
	ChangeMode(TXMode);
	RF905_Write(WTP,Databuf);		// Spi disable
	Delayus(1);
	RF905_Write(WTA,TX_ADDRESS);				// Spi disable
	
	ChangeMode(TXData);
	
	RF905_PWRH;	// Set TRX_CE low
	
	ChangeMode(RXMode);
}



void RxPacket(void)
{ //uint i;

	RF905_TRX_ENL;	
	_delay_loop_(1);							// Set nRF905 in standby mode
	RF905_Read(RRP,Databuf);
	RF905_TRX_ENH;	
	_delay_loop_(1);
}






/////////////////////////////////////////////////////////////////////////////
void RFSpi_init(void)
{
	OUTRF905_ACSN;
	OUTRF905_ADOUT;
	OUTRF905_ASCLK;
	OUTRF905_ATX_EN;
	OUTRF905_APWR;
	
	INRF905_ADRDY;
	INRF905_ADIN;
	
	RF905_ACSNH;//RFCSN = 1;
	RF905_ASCLKL;//RFSCK = 0;
	//RFMOSI = 1;
	RF905_ADOUTH;//RFMISO = 1;	
	
	OUTRF905_CSN;
	OUTRF905_DOUT;
	OUTRF905_SCLK;
	OUTRF905_TX_EN;
	OUTRF905_PWR;
	
	INRF905_DRDY;
	INRF905_DIN;
	
	RF905_CSNH;//RFCSN = 1;
	RF905_SCLKL;//RFSCK = 0;
	//RFMOSI = 1;
	RF905_DOUTH;//RFMISO = 1;					
}




////////////////////////////////////////////////////////////
typedef struct 
{
	uint8 datab;		// 字长度,5/6/7/8可选
	uint8 stopb;		// 停止位,1/2可选
	uint8 parity;		// 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}COMMMODE;




void __irq IRQ_UART0 (void);
int8 UART0_Init (uint32 baud, COMMMODE set)
{
	uint32 bak;
	
	
	// 设置I/O连接到UART0
	PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;    /* 选择管脚为UART0 */
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;			// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;			// 设置奇偶校验
	
	U0LCR = bak;
			
	U0IER = 0x03;                               /* 允许接收和发送中断 */
    	U0FCR = 0x07;                               /* 禁止FIFO */
    	
    	VICVectCntl2 = 0x20 | 6;		// 分配Timer0中断到向量中断0
   	VICVectAddr2 = (uint32)IRQ_UART0; 	// 设置中断服务程序地址
   	VICIntEnable = (1 << 6);

	
	return (1);
}

void __irq IRQ_UART0 (void)
{
				
	VICVectAddr = 0x00;			// 中断处理结束
}

void InitTCom(void)
{
	
	COMMMODE set;
	
	set.datab  = 8;	//8位数据位
	set.stopb  = 1;	//1位停止位
	set.parity = 0;	//无奇偶校验
				
	UART0_Init(9600,set);					
	
}


void UART0_SendByte (uint8 dat)
{
	U0THR = dat;
	while ((U0LSR & 0x40) == 0);		// 等待数据发送完毕
}
void Uart0_Printf (char *str)
{
	while (1)
	{
		if (*str == '\0')
		{
			break;			// 遇到结束符,退出
		}	
		UART0_SendByte(*str++);	// 发送数据
	}
}



//////////////////////////////////////////////////////////////








///////////////////////////////////////////////////////////////


int  main(void)
{
	uint8  TxCount;

    
    	uint16 i,len;
	RFSpi_init();
	InitTCom();
	
	
	Uart0_Printf( "       通过串口0测试RF905\r\n" ) ;			
	//发送端初始化
	ChangeModeA(Standby);	// nRF905进入待机SPI通讯模式
	Delayus(1000);
	Config905A();			//配置nRF905   	   	  	   	   	   	   	   	
	Delayus(1000);
	memset(Databuf,0,sizeof(Databuf));
	RF905_ReadA(RC,Databuf);
	//接收断初始化
	ChangeMode(Standby);	// nRF905进入待机SPI通讯模式
	Delayus(1000);
	Config905();			//配置nRF905   	   	  	   	   	   	   	   	
	Delayus(1000);
	memset(Databuf,0,sizeof(Databuf));
	RF905_Read(RC,Databuf);
	ChangeMode(RXMode);	//启动接受模式									
	TxCount = 0;
	while(1)
	
	{	
		Delayus(1000);
		Delayus(65000);
		Delayus(65000);
		Delayus(65000);
		memset(Databuf,0,sizeof(Databuf));
		len = sizeof(Databuf);
		for(i=0; i<len; i++)
		{
			Databuf[i] =i +TxCount+'A';
		}
		//发送数据
		ChangeModeA(RXMode);	//启动接受模式
    		for(i=0;i<0x1000;i++)
    		{
    			if(JUDGE_RF905_ACD)		//判断CD信号,有数据接收不能发送
    	      		{
    	       			
    	      		}
    	      		else
    	      		{
    	      			TxPacketA();		  //发送数据/
    	      			
    	      			TxCount++;
    	      			if(TxCount > 10 )
    	      			{
    	      				TxCount = 0;
    	      			}
    	      			//memset(Databuf,0,sizeof(Databuf));
    	      			
    	      			//读取发送有效数据
    	      			memset(Databuf,0,sizeof(Databuf));
				RF905_ReadA(RTP,Databuf);
				
				//读取发送的接收方地址
				memset(Databuf,0,sizeof(Databuf));
				RF905_ReadA(RTA,Databuf);
				memset(Databuf,0,sizeof(Databuf));
				
    	       			break;
    	      		}
    		}	
		Delayus(25000);
		//接收数据
		ChangeMode(RXMode);	//启动接受模式
	 	//数据包发送出去,进行接收
            	if(i!=0x1000)
            	{
                  	for(i=0;i<0x1000;i++)
    	        	{ 
                        	if(JUDGE_RF905_DRDY)      //数据准备就绪 表示接收完成或发送完成
    	  	     		{
    	  	     			memset(Databuf,0,sizeof(Databuf));
                             	 	RxPacket();                             	 														                             	 	
                             	 	Uart0_Printf("RF905收到下面字符:    ");
                             	 	Uart0_Printf((char *)Databuf);
                             	 	Uart0_Printf("\r\n\r\n");
    	  	          		break;
    	  	     		}	//等待接受数据    	  	   
    	        	}
            	}
            	_delay_loop_(65000);
		_delay_loop_(10000);
		
            	
            
           } 
          
	
		   	   	   		   			   	
   	return(0);
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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