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

📄 zlg500s_comm.c

📁 在ucos平台上实现飞利浦非接触ic卡rc522读写芯片的操作程序
💻 C
字号:
#define ZLG500S_COMM_GLOBALS
#include "config.h"
#include "Zlg500S.h"
#include "zlg500S_comm.h"

void __irq UART_Isr(void);

INT8U SetBaud()
{
	INT16U temp;
	INT8U SetCunt = 3;

	while(SetCunt)
	{
		U0THR = STX;
		while((U0LSR & 0x40) == 0);
		for(temp=600;temp>0;temp--);	//延时30us
		U0THR = STX;
		while((U0LSR & 0x40) == 0);

		WaitRespDly = ZLG500S_DELAY_10ms;
		while((U0LSR & 0x01) == 0 && WaitRespDly);	
		
		if(WaitRespDly == 0)
		{
			SetCunt--;
			continue;
		}
		else
		{
			temp = U0RBR;
			if(temp == ACK)
				return TRUE;
			else
			{
				SetCunt--;
				continue;
			}
		}
	}
	return FALSE;
}


void __irq UART0_Isr(void)
{
	INT8U i;
	
	switch(U0IIR & 0x0f)
	{
		case 0x02:	//发送缓冲区空
			
			if(SerBfrIdx < SerBfr[FRAMELEN])
			{
				for(i=0;i<16;i++)
				{
					U0THR = SerBfr[SerBfrIdx];
					SerBfrIdx++;
					if(SerBfrIdx == SerBfr[FRAMELEN])
						break;
				}
			}
			else
			{
				SerBfrIdx = 0;	//发送完毕
				U0IER = 0x01;	//禁止THRE中断,使能RBR中断
			}
			break;
			
		case 0x04:	//接收数据可用
		case 0x0c:	//接收超时
			while(U0LSR & 0x01)
			{
				SerBfr[SerBfrIdx] = U0RBR;
				if(SerBfrIdx == FRAMELEN)
				{
					if(SerBfr[FRAMELEN] < PRTCLEN || SerBfr[FRAMELEN] > MAXSERSIZE)
					{
						continue;
					}
				}
				SerBfrIdx++;
			}
			if(SerBfrIdx >= SerBfr[FRAMELEN])
			{
				SerDTvalid = TRUE;
				SerBfrIdx = 0;
			}
			break;
			
		default:
			break;		
	}
	
    VICVectAddr = 0;
}

void ZLG500S_COMM_Init()
{
	INT16U Fdiv;
	
	PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;	//设置管脚RXD,TXD功能
	U0LCR = 0x83;				//使能访问除数锁存寄存器
	Fdiv = (Fpclk/16)/BAUDRATE;
	U0DLM = Fdiv >> 8;
	U0DLL = Fdiv & 0x00ff;
	U0LCR = 0x03;				//8位数据,1位停止位,无校验
		
    SerDTvalid = FALSE;
    
	SetBaud();	

    U0FCR = 0x81;				//FIFO使能,Rx触发8字节
    
    VICIntSelect &= ~(1 << 6);	//设置UART中断通道为IRQ
	VICVectAddrZLG500SUART = (uint32)UART0_Isr;		//ZLG500S中断矢量地址初始化
	VICVectCntlZLG500SUART = 0x20 | 6;
	VICIntEnable = 1 << 6;
}


INT8U Ser_Rcv()
{
	INT8U i,BCC;
	INT8U Status = FALSE;

	if(SerDTvalid)
	{									//已接收一帧数据,进行数据校验
		if(SerBfr[SerBfr[FRAMELEN]-1] == ETX && SerBfr[FRAMELEN] == (SerBfr[LENGTH]+PRTCLEN))
		{			//且正确接收到ETX,及帧长度等于数据长度加协议长度,则数据有效
			BCC = 0;
			for(i=0; i<(SerBfr[FRAMELEN]-1); i++)
			{
				BCC ^= SerBfr[i];
			}
			if(BCC == 0xff)
				Status = TRUE;	//BCC校验通过
		}
		SerDTvalid = FALSE;
	}
	return Status;
}

INT8U Ser_Send()
{
    INT8U i,BCC;

	SerBfr[FRAMELEN] = SerBfr[LENGTH]+PRTCLEN;	//帧长度等于数据长度加协议长度
	BCC = 0;
	for(i=0; i<(SerBfr[FRAMELEN]-2); i++)
		BCC ^= SerBfr[i];
	SerBfr[SerBfr[FRAMELEN]-2] = ~BCC;
	SerBfr[SerBfr[FRAMELEN]-1] = ETX;
	
	SerBfrIdx = 0;
	
	for(i=0;i<16;i++)
	{
		U0THR = SerBfr[SerBfrIdx];
		SerBfrIdx++;
		if(SerBfrIdx == SerBfr[FRAMELEN])
			break;
	}
	
	U0IER = 0x02;	//使能THRE中断,禁止RBR中断

	return TRUE;
}

⌨️ 快捷键说明

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