📄 t1_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 + -