📄 slrc500.c
字号:
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);
}
/////////////////////////////////////////////////////////////////////
//通过RC500和ISO14443卡通讯
//input: pi->MfCommand = RC500命令字
// 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); //清除Command寄存器
SetBitMask(RegControl,0x01); //清除FIFO指针
WriteRawRC(RegInterruptEn,irqEn|0x80);
for (i=0; i<pi->MfLength; i++)
{
WriteRawRC(RegFIFOData, pi->MfData[i]);//将数据写入FIFO
}
WriteRawRC(RegCommand, pi->MfCommand);//将指令写入Command寄存器
i = 0x3500;
do
{
n = ReadRawRC(RegInterruptRq);//当定时器TimerValue 寄存器值减为0 时置位
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) //从PICC读数据
{
n = ReadRawRC(RegFIFOLength);//指示保存在FIFO 缓冲区的字节数
//写入FIFOData寄存器增加,读减少FIFOLength
lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
if (lastBits)//显示最后接收字节的有效位个数如果为0 整个字节有效
{
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);//读出FIFO的数据
}
}
}
else if (ReadRawRC(RegErrorFlag)&0x01)//如果检测到一个位冲突该位置位该位在PrepareRx
//状态中接收器的启动阶段自动清零
{
status = MI_COLLERR;
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+1] = ReadRawRC(RegFIFOData);
}
}
pi->MfData[0]=ReadRawRC(0x0B);
}
}
else if (n & irqEn & 0x20)
{ status = MI_NOTAGERR; }
else if (!(ReadRawRC(RegErrorFlag)&0x17))
{ status = MI_ACCESSTIMEOUT; }
else
{ status = MI_COM_ERR; }
WriteRawRC(RegInterruptEn,0x7F);
WriteRawRC(RegInterruptRq,0x7F);
SetBitMask(RegControl,0x04); // stop timer now
WriteRawRC(RegCommand,PCD_IDLE);
}
return status;
}
/*
/////////////////////////////////////////////////////////////////////
//读RC500EEPROM
//input :startaddr=EEPROM地址(低位在前)
// length=读字节数
//output:readdata=读出的数据
/////////////////////////////////////////////////////////////////////
char PcdReadE2(unsigned int startaddr,unsigned char length,unsigned char *readdata)
{
char status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
MfComData.MfCommand = PCD_READE2;
MfComData.MfLength = 3;
MfComData.MfData[0] = startaddr&0xFF;
MfComData.MfData[1] = (startaddr >> 8) & 0xFF;
MfComData.MfData[2] = length;
status = PcdComTransceive(pi);
if (status == MI_OK)
{ memcpy(readdata, &MfComData.MfData[0], length); }
return status;
}
*/
/////////////////////////////////////////////////////////////////////
//写RC500EEPROM
//input :startaddr=EEPROM地址(低位在前)
// length=写字节数
// writedata=要写入的数据
/////////////////////////////////////////////////////////////////////
char PcdWriteE2(unsigned int startaddr,unsigned char length,unsigned char *writedata)
{
char status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
MfComData.MfCommand = PCD_WRITEE2;
MfComData.MfLength = length+2;
MfComData.MfData[0] = startaddr&0xFF;
MfComData.MfData[1] = (startaddr >> 8) & 0xFF;
memcpy(&MfComData.MfData[2], writedata, length);
status = PcdComTransceive(pi);
return status;
}
/////////////////////////////////////////////////////////////////////
//开启天线
//每次启动或关闭天险发射之间应至少有1ms的间隔
/////////////////////////////////////////////////////////////////////
char PcdAntennaOn()
{
unsigned char i;
i = ReadRawRC(RegTxControl);
if (i & 0x03)
{ return MI_OK; }
else
{
SetBitMask(RegTxControl, 0x03);
return MI_OK;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -