📄 src632.c
字号:
#include <REGX52.H>
#include <main.h>
#include <iso14443b.h>
#include <src632.h>
#include <string.h>
#include <intrins.h>
#define FSD 64
extern struct TranSciveBuffer{unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64];
};
/////////////////////////////////////////////////////////////////////
//写RC632寄存器
//input:Address=寄存器地址
// value=要写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char xdata *pa;
pa=Base_addr;
RC632_CE = 0;
*pa=Address>>3;
pa=Address+Base_addr;
*pa=value;
RC632_CE = 1;
}
/////////////////////////////////////////////////////////////////////
//置RC632寄存器位
//input:reg=寄存器地址
// mask=置位值
/////////////////////////////////////////////////////////////////////
void SetBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg,tmp | mask); // set bit mask
}
/////////////////////////////////////////////////////////////////////
//清RC632寄存器位
//input:reg=寄存器地址
// mask=清位值
/////////////////////////////////////////////////////////////////////
void ClearBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg, tmp & ~mask);
}
/////////////////////////////////////////////////////////////////////
//读RC632寄存器位
//input:Address=寄存器地址
//ouput:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
static unsigned char xdata *pa;
static unsigned char temp;
pa=Base_addr;
RC632_CE = 0;
*pa=Address>>3;
pa=Address+Base_addr;
temp = *pa;
RC632_CE = 1;
return(temp);
}
/////////////////////////////////////////////////////////////////////
//设置RC632定时器
//input:tmolength=设置值
/////////////////////////////////////////////////////////////////////
void PcdSetTmo(unsigned char tmoLength)
{
switch(tmoLength)
{
case 0: // (0.302 ms) FWI=0
WriteRawRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
WriteRawRC(RegTimerReload,0x21);// TReloadVal = 'h21 =33(dec)
break;
case 1: // (0.604 ms) FWI=1
WriteRawRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
break;
case 2: // (1.208 ms) FWI=2
WriteRawRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
break;
case 3: // (2.416 ms) FWI=3
WriteRawRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
break;
case 4: // (4.833 ms) FWI=4
WriteRawRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
break;
case 5: // (9.666 ms) FWI=5
WriteRawRC(RegTimerClock,0x0B); // TAutoRestart=0,TPrescale=16*128
WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
break;
case 6: // (19.33 ms) FWI=6
WriteRawRC(RegTimerClock,0x0B); // TAutoRestart=0,TPrescale=16*128
WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
break;
case 7: // (38.66 ms) FWI=7
WriteRawRC(RegTimerClock,0x0D); // TAutoRestart=0,TPrescale=64*128
WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
break;
case 8: // (77.32 ms) FWI=8
WriteRawRC(RegTimerClock,0x0D); // TAutoRestart=0,TPrescale=64*128
WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
break;
case 9: // (154.6 ms) FWI=9
WriteRawRC(RegTimerClock,0x0F); // TAutoRestart=0,TPrescale=256*128
WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
break;
case 10: // (309.3 ms) FWI=10
WriteRawRC(RegTimerClock,0x0F); // TAutoRestart=0,TPrescale=256*128
WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
break;
case 11: // (618.6 ms) FWI=11
WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
WriteRawRC(RegTimerReload,0x11);// TReloadVal = 'h21 =17(dec)
break;
case 12: // (1.2371 s) FWI=12
WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
WriteRawRC(RegTimerReload,0x21);// TReloadVal = 'h41 =33(dec)
break;
case 13: // (2.4742 s) FWI=13
WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h81 =65(dec)
break;
case 14: // (4.9485 s) FWI=14
WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
break;
case 15: // (4.9485 s) FWI=14
WriteRawRC(RegTimerClock,0x9); // TAutoRestart=0,TPrescale=4096*128
WriteRawRC(RegTimerReload,0x0ff);// TReloadVal = 'h81 =129(dec)
break;
default: //
WriteRawRC(RegTimerClock,0x19); // TAutoRestart=0,TPrescale=128
WriteRawRC(RegTimerReload,tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
break;
}
WriteRawRC(RegTimerControl,0X06);
}
/////////////////////////////////////////////////////////////////////
//通过RC632和ISO14443卡通讯
//input: pi->MfCommand = RC632命令字
// pi->MfLength = 发送的数据长度
// pi->MfData[] = 发送数据
//output:status = 错误字
// pi->MfLength = 接收的数据BIT长度
// pi->MfData[] = 接收数据
/////////////////////////////////////////////////////////////////////
char PcdComTransceive(struct TranSciveBuffer *pi)
{
bit recebyte = 0;
char status;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (pi->MfCommand)
{
case PCD_IDLE:
irqEn = 0x00;
waitFor = 0x00;
break;
case PCD_WRITEE2:
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_READE2:
irqEn = 0x07;
waitFor = 0x04;
recebyte=1;
break;
case PCD_LOADCONFIG:
case PCD_LOADKEYE2:
case PCD_AUTHENT1:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_CALCCRC:
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_AUTHENT2:
irqEn = 0x04;
waitFor = 0x04;
break;
case PCD_RECEIVE:
irqEn = 0x06;
waitFor = 0x04;
recebyte=1;
break;
case PCD_LOADKEY:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_TRANSMIT:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_TRANSCEIVE:
irqEn = 0x3D;
waitFor = 0x04;
recebyte=1;
break;
default:
pi->MfCommand = MI_UNKNOWN_COMMAND;
break;
}
if (pi->MfCommand != MI_UNKNOWN_COMMAND)
{
WriteRawRC(RegPage,0x00);
WriteRawRC(RegInterruptEn,0x7F);
WriteRawRC(RegInterruptRq,0x7F);
WriteRawRC(RegCommand,PCD_IDLE);
SetBitMask(RegControl,0x01);
WriteRawRC(RegInterruptEn,irqEn|0x80);
for (i=0; i<pi->MfLength; i++)
{
WriteRawRC(RegFIFOData, pi->MfData[i]);
}
WriteRawRC(RegCommand, pi->MfCommand);
i = 0x3500;
do
{
n = ReadRawRC(RegInterruptRq);
i--;
}
while ((i!=0) && !(n&irqEn&0x20) && !(n&waitFor));
status = MI_COM_ERR;
if ((i!=0) && !(n&irqEn&0x20))
{
if (!(ReadRawRC(RegErrorFlag)&0x17))
{
status = MI_OK;
if (recebyte)
{
n = ReadRawRC(RegFIFOLength);
lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
if (lastBits)
{
pi->MfLength = (n-1)*8 + lastBits;
}
else
{
pi->MfLength = n*8;
}
if (n == 0)
{
n = 1;
}
for (i=0; i<n; i++)
{
pi->MfData[i] = ReadRawRC(RegFIFOData);
}
}
}
else if (ReadRawRC(RegErrorFlag)&0x01)
{
status = MI_COLLERR;
if (recebyte)
{
n = ReadRawRC(RegFIFOLength);
lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
if (lastBits)
{
pi->MfLength = (n-1)*8 + lastBits;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -