📄 slrc500.c
字号:
#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include <absacc.h>
#include "main.h"
#include "slrc500.h"
#define Gpbase 0x7F00 //感应模块地址
#define outportb(addr,d) XBYTE[addr]=d
#define inportb(addr) XBYTE[addr]
#define FSD 64
extern struct TranSciveBuffer{unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64];
};
/////////////////////////////////////////////////////////////////////
//复位并初始化RC500
//
/////////////////////////////////////////////////////////////////////
char PcdReset()
{
char status = MI_OK;
char n = 0xFF;
unsigned int i = 3000;
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
RC500_CE =0;
RC500_RST=0;
DelayMs(50);
DelayMs(50);
RC500_RST=1; //高电平复位
DelayMs(5); //复位时间
DelayMs(50);
DelayMs(50);
DelayMs(50);
DelayMs(50);
DelayMs(50);
DelayMs(50);
RC500_RST=0;
DelayMs(5);
while (i!=0 && n)
{
n = ReadRawRC(RegCommand);//读取指令寄存器的值,不为0--初始化没完成,为0--初始化完成
i--; //初始化完成后RC500自动输入Idle 命令,结果Command 值变为00H
}
if (i != 0)
{
WriteRawRC(RegPage,0x80);//PageSelect位为1,则第三位的值选择寄存器页
n = 0x80;
while ( (i!=0) && (n&0x80) )
{
n = ReadRawRC(RegCommand);//接口检测是否成功完成,Command的第八位IfDetectBusy
i--;
}
if (i==0 || (n&0xFF)) //复位不成功,读取Command的值不为0
{ status = MI_RESETERR; }
}
else
{ status = MI_RESETERR; }
if (status == MI_OK)
{ WriteRawRC(RegPage,0x0); }//将0X00 写入页寄存器可激活线性地址模式
return status;
}
//////////////////////////////////////////////////////////////////////
//设置RC500的工作方式
//////////////////////////////////////////////////////////////////////
char PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A
{
ClearBitMask(RegControl,0x08); //Crypto1On 该位指示Crypto1 单元打开因此与卡的所有数据通信都被加密
WriteRawRC(RegClockQControl,0x0);//Q时钟复位
WriteRawRC(RegClockQControl,0x40);//Q时钟写入0x40,复位后或从卡接收数据后自动校准
Delay_50us(2); // wait approximately 100 us - calibration in progress
ClearBitMask(RegClockQControl,0x40);//清掉该位
WriteRawRC(RegBitPhase,0xAD); //写BitPhase寄存器
WriteRawRC(RegRxThreshold,0xFF); //选择位解码器的阀值
WriteRawRC(RegRxControl2,0x01); //RxControl2寄存器写入01H,曼切斯特内部解码器
WriteRawRC(RegTimerControl,0x02);//设置数据发送完成后停止定时器
WriteRawRC(RegIRqPinConfig,0x03);//配置IRQ管脚的输出状态,中端口输出低有效使能
M500PcdRfReset(1);
PcdSetTmo(106);
DelayMs(1);
PcdAntennaOn(); //开启天线
}
else{ return -1; }
return MI_OK;
}
///////////////////////////////////////////////////////////////////////
// Reset Rf Card
///////////////////////////////////////////////////////////////////////
char M500PcdRfReset(unsigned char ms)
{
char status = MI_OK;
if(ms)
{
ClearBitMask(RegTxControl,0x03); //TX2RFEn、TX1RFEn位清零,复位天线
DelayMs(2);
SetBitMask(RegTxControl,0x03);
}
else
{
ClearBitMask(RegTxControl,0x03);
}
return status;
}
/////////////////////////////////////////////////////////////////////
//读RC500寄存器位
//input:Address=寄存器地址
//ouput:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
//unsigned char pdata *pa;
// unsigned i;
// pa = Address;
// i = *pa;
// return(i);
return inportb(Gpbase+Address);
}
/////////////////////////////////////////////////////////////////////
//写RC500寄存器
//input:Address=寄存器地址
// value=要写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
// unsigned char pdata *pa;
// pa = Address;
// *pa = value;
outportb(Gpbase+Address,value);
}
/////////////////////////////////////////////////////////////////////
//置RC500寄存器位
//input:reg=寄存器地址
// mask=置位值
/////////////////////////////////////////////////////////////////////
void SetBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg,tmp | mask); // set bit mask
}
/////////////////////////////////////////////////////////////////////
//清RC500寄存器位
//input:reg=寄存器地址
// mask=清位值
/////////////////////////////////////////////////////////////////////
void ClearBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg, tmp & ~mask); // clear bit mask
}
/////////////////////////////////////////////////////////////////////
//设置RC500定时器
//input:tmolength=设置值
/////////////////////////////////////////////////////////////////////
void PcdSetTmo(unsigned char tmoLength)
{
switch(tmoLength)//TAutoRestart 如果设置为1 定时器从TReloadValue 处自动重新开始向下计数而不是向下计数到零,如果设置为0 定时器减少到零并且TimerIRq 置位
{
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -