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

📄 main.c.bak

📁 LPC2146 的USB 开发
💻 BAK
字号:
#include "lpc2136config.h"
#include "type.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

	//读写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 rcv_buf[40];		// UART0数据接收缓冲区
//volatile uint8 rcv_new;			// 接收新数据标志
//volatile uint32 rcv_num;

volatile uint8 command_buffer[48];	
volatile 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接收间隔计时	新加

#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 usart0_receiving_clr	usart0_signal_flags&=0xfe	//	复位串口0正在接收数据
#define usart0_receive_ok_clr	usart0_signal_flags&=0xfd	//	复位串口0接收完数据
#define usart0_received_len_clr	usart0_signal_flags&=0xfb	//	复位串口0已收到数据包长度字节
#define usart0_r_timer_over_clr	usart0_signal_flags&=0xf7   //	复位串口0接收超时
#define usart0_sending_clr		usart0_signal_flags&=0xef 	//	复位串口0正在发送数据
*/

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



uint32 sendbit[20];
uint32 viewtemp;
volatile uint32 powerdown;

void SendDataTest(void);
void CapDataTest(void);
void DAC_Test(void);
uint32 ADC_Test(void);
uint32 analyse_receive_data(void);


void __irq IRQ_UART0(void)
{
	uint32 receivebuf,uartiir;
	
	usart0_timer_base=T1TC;				//	每次中断重新送时间基值
	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;			//	接收数据完成
	   		}
	   		++usart0_receive_num;
	   	}
	   	else										//	帧头还没收到
	   	{
	   		if (receivebuf==RECEIVE_BOOT_CODE)		//	是帧头
	   		{
	   			usart0_receive_boot_set;			//	置位帧头标志
	   			usart0_receive_num=0;				//	初始化接收指针
	   			usart0_receiving_set;				//	置位正在接收数据
	   		}	
	   	}
	}   	
	VICVectAddr = 0x00;								// 中断处理结束
}

__inline void interrupt_config(void)
{
	IRQEnable();						//	使能IRQ中断
	VICIntSelect=0x00000000;			//	设置所有的通道为IRQ中断
	VICVectCntl0=0x20|06;				//	UART0分配到IRQ slot0,即最高优先级
	VICVectAddr0=(uint32)IRQ_UART0;		//	设置UART0向量地址
	VICIntEnable=1<<06;					//	使能UART0
}	

__inline void usart0_config(void)
{
    uint32 Fdiv;
    U0LCR=0x83;               			/* 8 bits, no Parity, 1 Stop bit    */
    Fdiv=(Fpclk/16)/115200 ;			/*baud rate */
    U0DLM=Fdiv/256;							
    U0DLL=Fdiv%256;	
    U0LCR=0x03;               			/* DLAB = 0                         */
    U0FCR=0x07;							/* Enable and reset */
	U0IER = 0x01;						//	允许RBR中断,即接收中断
	usart0_signal_flags=0;				//	清空标志
}

void UARTSend(uint8 *BufferPtr, uint32 Length )
{
    while (Length!=0)
    {
		while ((U0LSR&0x20)==0x20)	
		{
			U0THR=*BufferPtr;
			BufferPtr++;
			Length--;
		}
    }
}

__inline void  EnableIRQ(void)
{  
	int  tmp;
	__asm
   	{
   		MRS	tmp, CPSR
      	BIC   tmp, tmp, #0x80
      	MSR   CPSR_c, tmp 
   	}
}

__inline void pwm_config(void)
{
	PWMTCR=0x00000002;			/* Counter Reset */ 
	PWMPR=27;					/* count frequency:Fpclk */
    PWMMCR=0x00;				 	//不使用中断
    PWMMR0=1000;				/* set PWM cycle */
    PWMMR5=350;
    PWMLER=0x20;
    PWMPCR=0x2000;
    PWMTCR=0x00000009;			/* counter enable, PWM enable */
}

__inline void port_config(void)
{
	IODIR=0x00B00C04;		//	0000 0000  
							//	1011 0000  		P022 P020 P019	输出
							//	0000 1100		P011 P010		输出
							//	0000 0100 		P002			输出
	
	IO1DIR=0x00000000;		//	目前全做输入
	
	PINSEL0=0x80001505;		//	1000 0000	EINT2=P015	
							//	0000 0000
							//	0001 0101	SPI0=P006 P005 P004
							//	0000 0101	RxD0=P001 TxD0=P002  
    
    PINSEL1=0x120804aa;		//	0001 0010	AD03=P030 CAP02=P028
    						//	0000 1000	DAC=P025
    						//	0000 0100	PWM5=P021
    						//	1010 1010	SPI1=P019 P018 P017 MAT02=P016
    
    PINSEL2=0x00000004;		//	P131--P126做调试口
}

__inline void timer_config()
{
    T0CTCR=0X00000000;		//	定时器模式
    T0PR=0x00000000;		//	不再分频
    T0TCR=0x00000001;		//	使能定时器0
    
    T1CTCR=0X00000000;		//	定时器模式
    T1PR=0x00000229;		//	11.0592*5=55.296MHz,10us时基
    T1TCR=0x00000001;		//	使能定时器1
}    
    
__inline void config_system(void)
{	
	port_config();
	interrupt_config();		//	中断初始化
	usart0_config();		//	串口初始化
	pwm_config();			//	PWM初始化
	timer_config();			//	定时器初始化
}	
		
__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)						//	读写类指令
			return(loop&0x000000f0);				//	分类返回0xc0 0xe0 0xf0
		if (loop<0x00000020)						//	控制类指令
			return(0x000000000);					//	分类返回0x00
	}
	else
		return(0x000000001);						//	校验错就返回0x01,否则分类返回0x00 0xc0 0xe0 0xf0
}

void control_ReadWrite(void)
{
	uint32 usart0_current_command;
	usart0_current_command=*(command_buffer+1);
	switch(usart0_current_command)			//	处理工作参数
	{
		case CMD_SET_BAUT_RATE:				//	设置读写器串口波特率
			break;
		case CMD_GET_VERSION:				//	获得读写器版本号
			IOPIN=IOPIN^0x00800000;
			break;
		case CMD_SET_OUTPUT_POWER:			//	设置读写器射频输出功率
			break;
		case CMD_SET_FREQUENCY:				//	设置读写器射频频率
			break;
		case CMD_READ_PARAMETER:			//	获得读写器工作参数
			break;
		case CMD_SET_MOD_DEEPTH:			//	设置读写器调制深度 
			break;
		case CMD_GET_MOD_DEEPTH:			//	获得读写器调制深度
			break;
		case CMD_SET_OPERATION_PARAMETER:	//	设置读写器工作参数
			break;
		case CMD_GET_JAMMING:				//	获得外部射频干扰值
			break;
		case CMD_SET_DEFAULT_PARAMETER:		//	设置读写器出厂参数
			break;
		case CMD_COPY_DEFAULT_PARAMETER:	//	恢复读写器出厂参数
			break;
		case CMD_SET_ANTENNA_NUM:			//	设置读写器天线数
			break;
		case CMD_SET_FREQUENCY_CH:			//	设置读写器频道数
			break;
		case CMD_REBOOT:					//	复位读写器
			break;
		default:
			break;
	}
}		

void em_ReadWrite(void)
{
}

void epcc1g2_ReadWrite(void)
{
}

void iso6b_ReadWrite(void)
{
}

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();
				break;
			case 0xc0:
				em_ReadWrite();
				break;
			case 0xe0:
				epcc1g2_ReadWrite();
				break;
			case 0xf0:
				iso6b_ReadWrite();
				break;
			default:					//	校验错
				break;	
		}
	}	
}

int main (void)
{	
	uint32 timerdelay;
	
	config_system();
	
	timerdelay=T1TC;
	while(1)
    {
	    if (usart0_receiving)
	    {
			if (T1TC-usart0_timer_base>usart0_timer_over_value)		//	串口0接收超时
				usart0_signal_flags=0;								//	复位串口0标志
		}
		usart0_receive_process();
		//IOPIN=IOPIN^0x00800000;
    }
}		
				

⌨️ 快捷键说明

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