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

📄 usart0.c.bak

📁 LPC2146 的USB 开发
💻 BAK
字号:
#include "lpc2136config.h"
#include "type.h"

#define SEND_OK_BOOT_CODE		0xF0  	//	读写器执行成功包帧头
#define SEND_FAIL_BOOT_CODE		0xF4	//	读写器执行失败包帧头

#define INVALID_COMMAND 		0x1e	//	无效命令	

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

	//读写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	//	检查正在接收数据	


#define RECEIVE_BOOT_CODE		0x40	//	上位机指令包帧头
#define SEND_OK_BOOT_CODE		0xF0  	//	读写器执行成功包帧头
#define SEND_FAIL_BOOT_CODE		0xF4	//	读写器执行失败包帧头



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=*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
		checksum+=*(command_buffer+loop);
	if ((checksum&0x000000ff)==0x00000000)			//	校验通过
	{
		loop=*(command_buffer+1);					//	借用loop做临时变量
		if (loop>0x000000bf)						//	读写类指令
			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 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_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 0xc0:
				em_ReadWrite();
				break;
			case 0xe0:
				epcc1g2_ReadWrite();
				break;
			case 0xf0:
				iso6b_ReadWrite();
				break;
			default:							//	校验错
				U0IER=0x01;						//	允许新的接收中断
				break;	
		}
	}	
}

⌨️ 快捷键说明

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