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

📄 test

📁 实现了uc/os下面的串口、nRF2401的控制
💻
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**








**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
extern uint8 UART0Getch();
	
uint8 	temp8;
uint8 	InitData[15];
uint8 	TXData[14];
uint8 	RXData[10];
uint8   Data1;

uint8 ByteCnt;
uint8 BitCnt;
uint32 i;
uint32 temp32;

//uint8    rcv_buf[8];		// UART0数据接收缓冲区
//volatile uint8 rcv_new;	    // 接收新数据标志
volatile uint8 rf_rcv_new;
uint8 rf_rcv_buf[9];




#define CLK1 	(1<<5)
#define	CS		(1<<11)
#define	Data	(1<<6)
#define	CE		(1<<9)
#define DR1     (1<<8)
#define	PWR_UP	(1<<10)

/*
#define	LED1	(1<<18)
#define	LED2	(1<<19)
#define	LED3	(1<<20)
#define	LED4	(1<<21)

#define	KEY1	(1<<16)
#define	KEY2	(1<<17)
#define	KEY3	(1<<18)
#define	KEY4	(1<<19)

const uint32 LEDS4 = (0xF<<18);
const uint32 LEDS8 = (0xFF<<18);
const uint32 KEYS4 = (0xF<<16);
*/


/*************************************BuildSPIWord START****************************/
void BuildInitWord()
{
	InitData[0]=0x50;		//RX receiver 2, Datalength 80bit(10 byte)
	InitData[1]=0x50;		//RX receiver 1, Datalength 80bit(10 byte)
	InitData[2]=0x00;
	InitData[3]=0xcc;
	InitData[4]=0xcc;
	InitData[5]=0xcc;
	InitData[6]=0xcc;
	InitData[7]=0x00;
	InitData[8]=0xcc; 		//RX receiver 1 address   High byte
	InitData[9]=0xcc;		//RX receiver 1 address   High byte
	InitData[10]=0xcc;		//RX receiver 1 address   Low byte
	InitData[11]=0xcc;		//RX receiver 1 address   Low byte
	//InitData[12]=0x82;	//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC disable(Bit0) for ES chip
	InitData[12]=0x83;		//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip	
	InitData[13]=0x4f;		//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	//InitData[13]=0x6f;	//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 1M, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[14]=0x05;		//Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}
/*************************************BuildSPIWord END******************************/

/*************************************InitnRF2401 START******************************/		
void InitnRF2401()
{
	IO0DIR = IO0DIR | Data;
	IO0CLR = CE;					//Disable CE
	IO0SET = CS;							//Enable CS--confige mode
	for (ByteCnt=0;ByteCnt<15;ByteCnt++)
		{
		temp8=InitData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
			{
				if ((temp8 & 0x80) == 0)	//Check if first bit is HIGH
					IO0CLR = Data;		//Set Data low
				else
					IO0SET = Data;		//Set Data high
				temp8 = temp8<<1;	//Left Shift to get next bit
				DoSPIClock();	//Call "DoClock" to generate a clock pulse
			}
		}
	IO0CLR = CS;						//Disable CS--standby mode	
	IO0CLR = Data;						//Set Data low
}
/*************************************InitnRF2401 END *******************************/


/*************************************DoSPIClock START******************************/
int DoSPIClock()
{
	IO0SET = CLK1;
    for(i=0;i<5;i++);
	IO0CLR = CLK1;
	return (0);
}	


/*************************************DoSPIClock END *******************************/
/*************************************CE_High   START ******************************/
void CE_High()
{
	IO0SET = CE;
}
/*************************************CE_High    END *******************************/
/*************************************TXEN_LOW  START ******************************/

void nRF2401_ON()
{
	IO0SET = PWR_UP;
}
/*************************************nRF2401_ON END *******************************/


/*************************************RXEN_HIGH START ******************************/
void RXEN_HIGH()
{
	IO0CLR = CE;				//Set CE LOW		
	IO0SET = CS;				//Set CS HIGH--confige mode
	IO0DIR = IO0DIR | Data;
	IO0SET = Data;				//Set Data HIGH
	DoSPIClock(); 		//Make one SPIClock cycle
	IO0CLR = CS;				//Set CS LOW		
	IO0SET = CE;				//Set CE HIGH--active mode
}
/*************************************RXEN_HIGH  END *******************************/
/*************************************TXEN_LOW  START ******************************/		
void TXEN_LOW()
{
	IO0CLR = CE;				//Set CE LOW			
	IO0SET = CS;
	IO0DIR = IO0DIR | Data;				//Set CS HIGH--confige mode
	IO0CLR = Data;				//Set Data LOW
	DoSPIClock();		//Make one SPIClock cycle
	IO0CLR = CS;				//Set CS LOW		
	IO0SET = CE;				//Set CE HIGH--active mode
}

/*************************************TXEN_LOW   END *******************************/

/*************************************delay10    END *******************************/

/*************************************delay100   START *****************************/	
void delay(uint32 dly)
{
	for(; dly>0; dly--)
		for(i=0; i<5000; i++);
	
}
/*************************************delay100   END *******************************/

/*************************************ShockBurst START *****************************/
void BuildShockWord()
{
	TXData[0]=0xcc;		//MSB    ;RX receiver 1 address   High byte
	TXData[1]=0xcc;		//MSB-1  ;RX receiver 1 address   High byte
	TXData[2]=0xcc;		//MSB-2  ;RX receiver 1 address   Low byte
	TXData[3]=0xcc;		//MSB-3  ;RX receiver 1 address   Low  byte
	TXData[4]=Data1;    //MSB-4  ;Data byte 9
	TXData[5]=0x02;		//MSB-5  ;Data byte 8
	TXData[6]=0x03;		//MSB-6  ;Data byte 7
	TXData[7]=0x04;		//MSB-7  ;Data byte 6
	TXData[8]=0x05;		//MSB-8  ;Data byte 5
	TXData[9]=0x06;		//MSB-9  ;Data byte 4
	TXData[10]=0x07;	//MSB-10 ;Data byte 3
	TXData[11]=0x08;	//MSB-11 ;Data byte 2
	TXData[12]=0x09;	//MSB-12 ;Data byte 1
	TXData[13]=0x10;	//MSB-13 ;Data byte 0   
}
/************************************* BuildShockWord END *******************************/



/************************************* ShockBurst   START *******************************/
void ShockBurst()
{
	IO0DIR = IO0DIR | Data;
	IO0CLR = CS;					//Pull CS low
	IO0SET = CE;					//Enable CE	active mode
	for (ByteCnt=0;ByteCnt<14;ByteCnt++)
	{
		temp8 = TXData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
		{
			if ((temp8 & 0x80) == 0)	//Check if first bit is HIGH
				IO0CLR = Data;		//Set Data low
			else
				IO0SET = Data;		//Set Data high
			temp8 = temp8<<1;	//Left Shift to get next bit
			DoSPIClock();	//SendData;	
		}
	}
	IO0CLR = CE;						//Disable CS--standby mode	
	IO0CLR = Data;
}
/************************************* ShockBurst END ***********************************/


/************************************* CheckButtons START *******************************/	
void RF_send()
{
//	temp32 = IO0PIN & KEYS4;			//read key value from port P0
//	temp8 = (temp32>>12);
//	if (rcv_new == 1)
//		{
//			IO1CLR = ((~temp32)&KEYS4)<<2; //Turn On the LED    
			Data1 = UART0Getch(); //put the button Data in dada package
			
			TXEN_LOW();		//set TX mode
			BuildShockWord();
			ShockBurst();
			delay(50);		//delay for LED light
			RXEN_HIGH();
//			IO1SET = LEDS4;		//close LED display
//			rcv_new = 0;
			
//		 }
}
/************************************* CheckButtons END *********************************/



/************************************* ReceiveShock START *******************************/
void ReceiveShock()
{

	temp8=0;
	for (ByteCnt=0;ByteCnt<10;ByteCnt++)
	{
		for(BitCnt=0;BitCnt<8;BitCnt++)
		{
			temp8 = temp8<<1;	//shift left to receive next bit
			IO0SET = CLK1;			//set clock high
			
			IO0DIR = IO0DIR | Data;   
			IO0SET = Data;
			IO0DIR = IO0DIR & (~Data);   
			
			if((IO0PIN & Data) != 0)		//check if Data=high		
				temp8 |= 0x01;	//yes - set bit high
			IO0CLR = CLK1;			//set clock low
			
			//_nop_();		//wait one clk cycle
		}
	
	//	_nop_();
		RXData[ByteCnt] = temp8;
		
		IO0DIR = IO0DIR | DR1;   
		IO0SET = DR1;
		IO0DIR = IO0DIR & (~DR1); 
		
/*		if((IO0PIN & DR1) == 0)			//check if DR1 is not still high
		{		
			//_nop_();
			IO1CLR = LED1;	//Turn On the LED
			delay(50);
  	    	IO1SET = LED1;		//close LED display
		}*/
	 }
	 
	 rf_rcv_new = 1;
}








int rf_r_s (void)
{

    
    
    PINSEL2 = PINSEL2 & (~0x08);         //设置P1连接GPIO
//	IO1DIR = LEDS8;          	  //设置LED控制口为输出
//	IO1SET = LEDS8;
	IO0DIR = CS|CE|CLK1|PWR_UP;
	
	nRF2401_ON();	// 设备上电
	BuildInitWord(); 	//接收模式配置字
	InitnRF2401();	//将配置数据写入2401
	CE_High();	//激活接收模式
	RXEN_HIGH();	
                  
	while(1)
	{
		RF_send(); //check if the button is pressed

		if((IO0PIN & DR1) != 0)		// Check if DR1 is high (any received from nRF2401)	
		{

			ReceiveShock();			
		}		
		UART0_SendBuf();
//		else
//			IO1SET = LEDS4;
	}		

    return 0;
    	
}


/************************************* ReceiveShock END *********************************/	
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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