www.pudn.com > lpc2146USB.rar > usart0.c


#include "lpc2136config.h" 
#include "type.h" 
#include "userDefine.h" 
 
 
enum command_type 
{ 
	//读写器控制类指令 
	CMD_SET_BAUT_RATE=0x01,			//	设置读写器串口波特率 
	CMD_GET_VERSION,				//	获得读写器版本号 
	CMD_SET_RELAY,					//	控制继电器 
	CMD_SET_OUTPUT_POWER,			//	设置读写器射频输出功率 
	CMD_SET_FREQUENCY,				//	设置读写器射频频率 
	CMD_READ_PARAMETER,				//	获得读写器工作参数 
	CMD_SET_MOD_DEEPTH,				//	设置读写器调制深度  
	CMD_GET_MOD_DEEPTH,				//	获得读写器调制深度 
	CMD_SET_OPERATION_PARAMETER,	//	设置读写器工作参数 
	CMD_SET_ANTENNA,				//	选择天线 
	CMD_GET_JAMMING,				//	获得外部射频干扰值 
    CMD_SET_DEFAULT_PARAMETER,		//	设置读写器出厂参数 
    CMD_COPY_DEFAULT_PARAMETER,		//	恢复读写器出厂参数 
    CMD_REBOOT,						//	复位读写器 
     
    CMD_SET_ANTENNA_NUM=0x85,		//	设置读写器天线数 
    CMD_SET_FREQUENCY_CH,			//	设置读写器频道数 
 
	//授权指令 
	CMD_WRITE_MAC=0x40,				//	写厂商授权码 
	CMD_READ_MAC,					//	获得厂商授权码 
	CMD_WRITE_UAC,					//	写用户授权码 
	CMD_READ_UAC,					//	获得用户授权码 
	CMD_AUTHORIZE_TAG,				//	授权标签 
	CMD_CHECK_AUTHORIZE_TAG,		//	验证标签授权状态 
    CMD_SET_AUTHORIZATION,			//	设置读写器授权功能 
    CMD_GET_AUTHORIZATION,			//	获得读写器授权功能 
 
	//读写EM公司标签指令 
	EM_GETLOCK=0xC9,				//	获得标签写保护状态 
	EM_SETLOCK,						//	设置标签写保护 
	EM_WRITEPAGEBLOCK,				//	写标签数据 
	EM_READPAGEBLOCK,				//	读标签数据 
	EM_LISTIDREPORT,				//	获得已读标签ID 
	EM_LISTID,						//	识别标签ID 
	//user defined; 
	USER_TEST=0xD1, 
 
	//读写EPC C1G2标签指令 
	EPC1G2_EASALARM=0xE4,			//	获得标签报警状态 
	EPC1G2_CHANGEEAS,				//	设置标签报警状态 
	EPC1G2_BLOCKLOCK,				//	设置标签数据块写保护 
	EPC1G2_WRITEEPC,				//	写标签EPC码 
	EPC1G2_KILLTAG,					//	毁灭标签 
	EPC1G2_NA, 
	EPC1G2_SETLOCK,					//	设置标签写保护 
	EPC1G2_WRITEDATA,				//	写标签数据 
	EPC1G2_READDATA,				//	读标签数据 
	EPC1G2_REPORTID,				//	获得已读标签ID 
	EPC1G2_LISTID,					//	识别标签ID 
 
	//读写ISO18000-6B标签指令 
	ISO6B_GETLOCK=0xF3,				//	获得标签写保护状态 
	ISO6B_SETLOCK,					//	设置标签写保护 
	ISO6B_WRITEDATA,				//	写标签数据 
	ISO6B_READDATA,					//	读标签数据 
	ISO6B_READSELECTID=0xFB,   		//	有条件识别标签ID 
	ISO6B_REPORTID=0xFD,			//	获得已读标签ID 
	ISO6B_LISTID=0XFE				//	无条件识别标签ID 
}; 
 
volatile uint8 command_buffer[48];	 
uint8 data_result[252];										//	长度为FF最多冲坏待发送区域 
volatile uint8 usart0_receive_num;             				//	串口0当前接收数据数目	新加 
volatile uint8 usart0_receive_len;             				//	串口0接收数据长度	新加 
volatile uint8 usart0_send_len;             				//	串口0发送数据长度 
volatile uint8 usart0_signal_flags;  						//	串口0的通讯标识 
 
volatile uint32 usart0_timer_base;  						//	串口0接收间隔计时	新加 
volatile uint32 usart0_timer_update;  						//	串口0 
 
#define usart0_timer_over_value	200							//	串口0超时参数10us*200=2ms	 
 
#define usart0_receiving_set	usart0_signal_flags|=0x01	//	串口0正在接收数据	 
#define usart0_receive_ok_set	usart0_signal_flags|=0x02	//	串口0接收完数据 
#define usart0_received_len_set	usart0_signal_flags|=0x04	//	串口0已收到数据包长度字节	没用 
#define usart0_r_timer_over_set	usart0_signal_flags|=0x08  	//	串口0接收超时	没用	 
#define usart0_sending_set		usart0_signal_flags|=0x10	//	串口0正在发送数据 
#define usart0_receive_boot_set	usart0_signal_flags|=0x20	//	串口0收到帧头	新加 
 
#define usart0_receive_boot		usart0_signal_flags&0x20	//	检查帧头 
#define usart0_receive_ok		usart0_signal_flags&0x02	//	检查收完数据 
#define usart0_receiving		usart0_signal_flags&0x01	//	检查正在接收数据	 
 
 
 
void __irq IRQ_UART0(void) 
{ 
	uint32 receivebuf,uartiir; 
	 
	usart0_timer_update=0x01;  			//	置位更新时间标志	 
	uartiir=U0IIR&0x0f;					//	取得中断标志 
	if (uartiir==0x04)					//	接收到数据标志 
	{ 
	   	receivebuf=U0RBR;				//	串口数据读到临时变量备用 
	   	if (usart0_receive_boot)		//	已经收到帧头 
	   	{ 
   			command_buffer[usart0_receive_num]=receivebuf; 
	   		if 	(usart0_receive_num==0)				//	接收的是长度 
	   			usart0_receive_len=receivebuf; 
	   		else									//	接收的是数据及校验 
	   		{ 
	   			if (usart0_receive_num==usart0_receive_len)	 
	   			{ 
	   				usart0_receive_ok_set;			//	接收数据完成 
	   				U0IER=0x00;						//	关闭接收中断,等发送完或出错再开 
	   			}	 
	   		} 
	   		++usart0_receive_num; 
	   	} 
	   	else										//	帧头还没收到 
	   	{ 
	   		if (receivebuf==RECEIVE_BOOT_CODE)		//	是帧头 
	   		{ 
	   			usart0_receive_boot_set;			//	置位帧头标志 
	   			usart0_receive_num=0;				//	初始化接收指针 
	   			usart0_receiving_set;				//	置位正在接收数据 
	   		}	 
	   	} 
	}   	 
	VICVectAddr = 0x00;								// 中断处理结束 
} 
 
__inline void usart0_send_process(uint8 *BufferPtr,uint32 Length) 
{ 
    while (Length!=0) 
    { 
		while ((U0LSR&0x20)==0x20)	//U0THR 为空;  
		{ 
			U0THR=*BufferPtr; 
			BufferPtr++; 
			Length--; 
		} 
    } 
	U0IER=0x01;						//	允许新的接收中断 
} 
		 
__inline uint32 analyse_receive_data(void)			//	原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回 
{ 
	uint32 loop,checksum,length; 
	length=*command_buffer; 
	checksum=0x40; 
	//for (loop=length;loop!=0xffffffff;loop--)		//	因为有效数据从地址0开始,故结束于0xffffffff 
	for (loop=0;loop0x000000bf)						//	读写类指令 
			checksum=loop&0x000000f0;				//	分类返回0xc0 0xe0 0xf0 
		if (loop<0x00000020)						//	控制类指令 
			checksum=0x000000000;					//	分类返回0x00 
	} 
	else 
		checksum=0x000000001; 
	return(checksum);								//	校验错就返回0x01,否则分类返回0x00 0xc0 0xe0 0xf0 
} 
 
__inline void Cmd_Get_Version(void) 
{ 
	uint32 loop,checksum; 
	data_result[0]=SEND_OK_BOOT_CODE; 
	data_result[1]=0x06; 
	data_result[2]=0x02; 
	data_result[3]=0X0f; 
	data_result[4]=0x02;			//	硬件版本号天线数目 
	data_result[5]=0x00;			//	软件版本号高字节 
	data_result[6]=0x00;			//	软件版本号低字节 
	checksum=SEND_OK_BOOT_CODE+0x06+0x02+0x0f;			 
	for (loop=4;loop<7;loop++) 
		checksum+=data_result[loop]; 
	data_result[7]=(0-checksum)& 0xff; 
	usart0_send_process(data_result,0x08);	 
} 
			 
__inline void Cmd_Invalid(void) 
{ 
	uint32 temp,checksum; 
	temp=*(command_buffer+1); 
	data_result[0]=SEND_FAIL_BOOT_CODE; 
	data_result[1]=0x03; 
	data_result[2]=INVALID_COMMAND; 
	data_result[3]=temp; 
	checksum=SEND_FAIL_BOOT_CODE+0x03+INVALID_COMMAND+temp;			 
	data_result[4]=(0-checksum)& 0xff; 
	usart0_send_process(data_result,0x05);	 
} 
 
__inline void control_ReadWrite(void) 
{ 
	uint32 usart0_current_command; 
	usart0_current_command=*(command_buffer+1); 
	switch(usart0_current_command)			//	处理工作参数 
	{ 
		case CMD_SET_BAUT_RATE:				//	设置读写器串口波特率 
			Cmd_Invalid(); 
			break; 
		case CMD_GET_VERSION:				//	获得读写器版本号 
			Cmd_Get_Version(); 
			break; 
		case USER_TEST:						//	测我试 
			Cmd_Get_User(); 
			break; 
		case CMD_SET_OUTPUT_POWER:			//	设置读写器射频输出功率 
			Cmd_Invalid(); 
			break; 
		case CMD_SET_FREQUENCY:				//	设置读写器射频频率 
			Cmd_Invalid(); 
			break; 
		case CMD_READ_PARAMETER:			//	获得读写器工作参数 
			Cmd_Invalid(); 
			break; 
		case CMD_SET_MOD_DEEPTH:			//	设置读写器调制深度  
			Cmd_Invalid(); 
			break; 
		case CMD_GET_MOD_DEEPTH:			//	获得读写器调制深度 
			Cmd_Invalid(); 
			break; 
		case CMD_SET_OPERATION_PARAMETER:	//	设置读写器工作参数 
			Cmd_Invalid(); 
			break; 
		case CMD_GET_JAMMING:				//	获得外部射频干扰值 
			Cmd_Invalid(); 
			break; 
		case CMD_SET_DEFAULT_PARAMETER:		//	设置读写器出厂参数 
			Cmd_Invalid(); 
			break; 
		case CMD_COPY_DEFAULT_PARAMETER:	//	恢复读写器出厂参数 
			Cmd_Invalid(); 
			break; 
		case CMD_SET_ANTENNA_NUM:			//	设置读写器天线数 
			Cmd_Invalid(); 
			break; 
		case CMD_SET_FREQUENCY_CH:			//	设置读写器频道数 
			Cmd_Invalid(); 
			break; 
		case CMD_REBOOT:					//	复位读写器 
			Cmd_Invalid(); 
			break; 
		default: 
			Cmd_Invalid(); 
			break; 
	} 
}		 
 
void em_ReadWrite(void) 
{ 
	Cmd_Invalid(); 
} 
 
void epcc1g2_ReadWrite(void) 
{ 
	Cmd_Invalid(); 
} 
 
void iso6b_ReadWrite(void) 
{ 
	Cmd_Invalid(); 
} 
 
void usart0_receive_timer_over_check(void) 
{ 
    uint32 timetemp; 
    if (usart0_receiving)						//	处于接收过程中 
    { 
		timetemp=T1TC; 
		if (usart0_timer_update!=0)				//	有更新时间标志,说明串口进过新数据 
		{ 
			usart0_timer_update=0; 
			usart0_timer_base=timetemp;				//	取得新时间 
		} 
		if (timetemp-usart0_timer_base>usart0_timer_over_value)		//	串口0接收超时 
		{ 
			U0IER=0x01;											//	超时错,允许新的接收中断 
			usart0_signal_flags=0;								//	复位串口0标志 
		} 
	} 
} 
		 
void usart0_receive_process(void)					//	usart0.c 
{ 
	uint32 checksum; 
	if (usart0_receive_ok) 
	{ 
		//原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回区分各类命令 
		//省掉全局变量sumcheck_ok  					 
		usart0_signal_flags=0;									//	复位串口0标志 
		checksum=analyse_receive_data(); 
		switch (checksum)					 
		{ 
			case 0x00:						 
				control_ReadWrite(); 
			 
				IOPIN=IOPIN^0x00800000;			//调试观察 
	 
				break; 
			case 0xD0:							//USER DEFINED COMMAND;					 
				control_ReadWrite(); 
			 
				IOPIN=IOPIN^0x00800000;			//Led 控制; 
	 
				break;				 
			case 0xc0: 
				em_ReadWrite(); 
				break; 
			case 0xe0: 
				epcc1g2_ReadWrite(); 
				break; 
			case 0xf0: 
				iso6b_ReadWrite(); 
				break; 
			default:							//	校验错 
				U0IER=0x01;						//	允许新的接收中断 
				break;	 
		} 
	}	 
}