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

📄 t1_rfid.cpp

📁 RFID读标示例
💻 CPP
字号:
#include "T1_RFID.h"
#include <sys/ep7312/CLPS7312.H>
#include <sys/iuart.h>


void RF201Delay(int ntime)
{
	volatile int lvi;
	volatile int lvk;
	for(lvi = 0; lvi < ntime; lvi ++) 
		for(lvk = 0; lvk < 3; lvk ++);
}

char RF201BBC_Chk(char *buf, int len)
{
	char lvchr = 0;
	int lvi;
	for(lvi = 0; lvi < len; lvi ++)
		lvchr += *buf++;
	return lvchr;
}

//return real data len, drop len,cmd1,cmd2 and bbc chk
int RF201Chk_Dat(char *buf, int len)
{
	int lvi;
	char lvc = 0;
	if(!len) return -1;
	if(buf[0] > (len - 2)) return -1;
	if(!buf[0]) return 0;
	for(lvi = 0; lvi <= buf[0]; lvi++)
		lvc += buf[lvi];
	//lvi ++;
	if(buf[lvi] != lvc) return -2;
	return (int)(buf[0] - 2);
}

void BinToHex(char *BinDat, char *HexBuf, int len)
{
	//int lvpos = 0;
	int lvi;
	if(!len) goto exit_BinToHex;
	for(lvi = 0; lvi < len; lvi ++, BinDat ++){
		*HexBuf = (*BinDat >> 4) + 0x30;
		if(*HexBuf > 0x39) *HexBuf = *HexBuf + 7;
		HexBuf ++;
		*HexBuf = (*BinDat & 0xf) + 0x30;
		if(*HexBuf > 0x39) *HexBuf = *HexBuf + 7;
		HexBuf ++;
	}
exit_BinToHex:
	*HexBuf = 0;
	return;
}

void InitRF201(void)
{
	*(unsigned char*)(HwBaseAddress + HwDdrD) &= ~(RF_CLK | RF_OUTDAT);
	*(unsigned char*)(HwBaseAddress + HwDdrA) &= ~(RF_INDAT);
	RFPIN_CLK |= RF_CLK;
	RFPIN_OUTDAT |= RF_OUTDAT;
}

void RFSendChar(char chr)
{
	int lvi;
	for(lvi = 0; lvi < 8; lvi ++){
		RFPIN_CLK &= ~RF_CLK;
		RF201Delay(1);
		if(chr & 1) RFPIN_OUTDAT |= RF_OUTDAT;
		else RFPIN_OUTDAT &= ~RF_OUTDAT;
		RF201Delay(49);
		RFPIN_CLK |= RF_CLK;
		RF201Delay(50);
		chr = chr >> 1;
	}
	RFPIN_OUTDAT |= RF_OUTDAT;
}
int RFWaveCount(void)
{
	int lvret = 0;
	int lvtick = GetTick();
	char lvc;
	RF_SETCLKIN();
	lvc = RFPIN_CLK & RF_CLK;
	while(GetTick() - lvtick < 6){
		while(lvc == (RFPIN_CLK & RF_CLK)) if(GetTick() - lvtick > 5) return lvret;
		lvret ++;
		lvc = RFPIN_CLK & RF_CLK;
	}
	return lvret;
}

int RFReadChar(char *chr)
{
	char lvchr = 0;
	int lvtick;
	int lvi;
	for(lvi = 0; lvi < 8; lvi ++){
		lvtick = 0;
		while(RFPIN_CLK & RF_CLK) {
			if(lvtick > 70) return -1;
			else{ lvtick ++; RF201Delay(1);}
		}
		RF201Delay(1);
		lvtick = 0;
		while((RFPIN_CLK & RF_CLK) == 0) {
			if(lvtick > 70) return -1;
			else{ lvtick ++; RF201Delay(1);}
		}
		lvchr = lvchr >> 1;
		if(RFPIN_INDAT & RF_INDAT) lvchr |= 0x80;
	}
	*chr = lvchr;
	return 0;
}

int _RFSendData(char *buf, int len)
{
	int lvi;
	IrqLock();
	RF_SETCLKOUT();
	for(lvi = 0; lvi < len; lvi++) RFSendChar(*buf++);
	IrqUnLock();
	return 0;
}

int _RFReadData(char *buf, int len)
{
	char lvbuf[64];
	char *lvpbuf = lvbuf;
	int lvi;
	int lvtick = 0;
	if(len > 64) len = 64;
	if(len < 1) return 0;
	RF_SETCLKIN();
	IrqLock();
	while(RFPIN_CLK & RF_CLK){
		if(lvtick > 30000){
			lvi = 0;
			goto _RFReadData_Exit;
		} else {
			lvtick ++;
			RF201Delay(1);
		}
	}
	for(lvi = 0; lvi < len; lvi ++)
		if(RFReadChar(lvpbuf++)) break;
_RFReadData_Exit:
	IrqUnLock();
	lvi = RF201Chk_Dat(lvbuf, lvi);
	if(lvi < 1)	return 0;
	memcpy(buf, lvbuf + 3, lvi);
	//memcpy(buf, lvbuf, lvi);
	return lvi;
}

int RFReadSysInfo(char *buf)
{
	char lvcmd[4] = {0x02, 0x00, 0x20, 0x22};	//cmd to read system information without uid
	lvcmd[3] = RF201BBC_Chk(lvcmd, 3);
	_RFSendData(lvcmd, 4);
	return _RFReadData(buf, 19);
}

int RFReadSysInfoUID(char *UID, char *buf)
{
	char lvcmd[12];
	lvcmd[0] = 0x0a;
	lvcmd[1] = 0x08;
	lvcmd[2] = 0x20;
	memcpy(&lvcmd[3], UID, 8);
	lvcmd[11] = RF201BBC_Chk(lvcmd, 11);
	return _RFReadData(buf, 19);
}

int RFReadBlock(char *buf, int nBlk)
{
	char lvcmd[5] = {0x03, 0x10, 0x20, 0x0, 0x0};
	lvcmd[3] = (char)nBlk;
	lvcmd[4] = RF201BBC_Chk(lvcmd, 4);
	_RFSendData(lvcmd, 5);
	return _RFReadData(buf, 10);
}

void RFReadBlockUID()
{
}

int RFWriteBlock(char *buf, int nBlk)
{
	int lvlen;
	char lvcmd[12] = {0x07, 0x20, 0x20, 0x00};
	lvcmd[3] = (char)nBlk;
	memcpy(&lvcmd[4], buf, 4);
	lvcmd[8] = RF201BBC_Chk(lvcmd, 8);
	_RFSendData(lvcmd, 9);
	lvlen = _RFReadData(lvcmd, 10);
	return memcmp(buf, lvcmd + 2, 4);
}

void RFWriteBlockUID()
{
}

int RFWriteData(const void *dat, int len)
{
	char *pdat = (char*)dat;
	int lvblk;
	int lvi;
	int lvReTry;

	if(!len) return 0;
	if(len > 128) len = 128;
	lvblk = len >> 2;
	if(len & 3) lvblk ++;
	for(lvi = 0; lvi < lvblk; lvi ++, pdat += 4){
		lvReTry = 0;
		while(lvReTry < 2 && RFWriteBlock(pdat, lvi)) lvReTry ++;
		//RFWriteBlock(pdat, lvi);
		if(lvReTry >= 2) return lvi << 2;
	}
	return len;
}

int RFReadData(void *buf, int len)
{
	char *pbuf = (char*)buf;
	char lvbuf[10];
	int lvblk;
	int lvi;
	int lvReTry;

	if(!len) return 0;
	if(len > 128) len = 128;
	lvblk = len >> 2;
	if(len & 3) lvblk ++;
	for(lvi = 0; lvi < lvblk; lvi ++, pbuf += 4){
		lvReTry = 0;
		while(lvReTry < 2 && !RFReadBlock(lvbuf, lvi)) lvReTry ++;
		if(lvReTry >= 2) return lvi << 2;
		if(lvi == (lvblk - 1) && len & 3) memcpy(pbuf, lvbuf + 2, len & 3);
		else memcpy(pbuf, lvbuf + 2, 4);
	}
	return len;
}

⌨️ 快捷键说明

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