📄 slrc632.c
字号:
#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include "main.h"
#include <absacc.h>
#include "slrc632.h"
#define FSD 64
#define Gpbase 0x7F00 //感应模块地址 P2^7
#define outportb(addr,d) XBYTE[addr]=d //写入addr地址值D / 绝对地址
#define inportb(addr) XBYTE[addr] ///读出addr地址值
extern struct TranSciveBuffer{unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64];
};
unsigned char ReadRawRC(unsigned char Address)
{
return inportb(Gpbase+Address); }
void WriteRawRC(unsigned char Address, unsigned char value)
{
outportb(Gpbase+Address,value);
}
/////////////////////////////////////////////////////////////////////
//复位并初始化RC632
//注意:RC500上电后应延时500ms才能可靠初始化
/////////////////////////////////////////////////////////////////////
char PcdReset()
{
char status = MI_OK;
char n = 0xFF;
unsigned int i = 3000;
RC632_CE=0;
RC632_RST=0;
DelayMs(50);
RC632_RST=1;
DelayMs(5);
RC632_RST=0;
DelayMs(5);
while (i!=0 && n)
{
n = ReadRawRC(RegCommand);
i--;
}
if (i != 0)
{
WriteRawRC(RegPage,0x80);
n = 0x80;
while ( (i!=0) && (n&0x80) )
{
n = ReadRawRC(RegCommand);
i--;
}
if (i==0 || (n&0xFF))
{ status = MI_RESETERR; }
}
else
{ status = MI_RESETERR; }
if (status == MI_OK)
{ WriteRawRC(RegPage,0x0); }
return status;
}
//////////////////////////////////////////////////////////////////////
//设置RC632的工作方式
//////////////////////////////////////////////////////////////////////
char PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A
{
ClearBitMask(RegControl,0x08);
WriteRawRC(RegClockQControl,0x0);
WriteRawRC(RegClockQControl,0x40);
Delay_50us(2); // wait approximately 100 us - calibration in progress
ClearBitMask(RegClockQControl,0x40);
WriteRawRC(RegTxControl,0x5b);
WriteRawRC(RegCwConductance,0x0F);
WriteRawRC(RegModConductance,0x3F);
WriteRawRC(RegCoderControl,0x19);
WriteRawRC(RegModWidth,0x13);
WriteRawRC(RegModWidthSOF,0x00);
WriteRawRC(RegTypeBFraming,0x00);
WriteRawRC(RegRxControl1,0x73);
WriteRawRC(RegDecoderControl,0x08);
WriteRawRC(RegBitPhase,0xAD);
WriteRawRC(RegRxThreshold,0xAA);
WriteRawRC(RegBPSKDemControl,0);
WriteRawRC(RegRxControl2,0x41);
WriteRawRC(RegRxWait,0x06);
WriteRawRC(RegChannelRedundancy,0x0F);
WriteRawRC(RegCRCPresetLSB,0x63);
WriteRawRC(RegCRCPresetMSB,0x63);
WriteRawRC(RegTimeSlotPeriod,0x00);
WriteRawRC(RegMfOutSelect,0x00);
WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x3F);
WriteRawRC(RegTimerClock,0x07);
WriteRawRC(RegTimerReload,0x0A);
WriteRawRC(RegTimerControl,0x06);
WriteRawRC(RegIRqPinConfig,0x02);
WriteRawRC(RFU2E,0x00);
WriteRawRC(RFU2F,0x00);
PcdSetTmo(106);
DelayMs(1);
PcdAntennaOn();
}
else if (type == 'B')
{
ClearBitMask(RegControl,0x08);
WriteRawRC(RegClockQControl,0x0);
WriteRawRC(RegClockQControl,0x40);
Delay_50us(2);
ClearBitMask(RegClockQControl,0x40);
WriteRawRC(RegTxControl,0x4B);
WriteRawRC(RegCwConductance,0x17);
WriteRawRC(RegModConductance,0x06);
WriteRawRC(RegCoderControl,0x20);
WriteRawRC(RegModWidth,0x13);
WriteRawRC(RegModWidthSOF,0x3F);
WriteRawRC(RegTypeBFraming,0x3B);
WriteRawRC(RegRxControl1,0x73);
WriteRawRC(RegDecoderControl,0x19);
WriteRawRC(RegBitPhase,0xAD);
WriteRawRC(RegRxThreshold,0x88);
WriteRawRC(RegBPSKDemControl,0x7E);
WriteRawRC(RegRxControl2,0x01);
WriteRawRC(RegRxWait,0x06);
WriteRawRC(RegChannelRedundancy,0x2C);
WriteRawRC(RegCRCPresetLSB,0xFF);
WriteRawRC(RegCRCPresetMSB,0xFF);
WriteRawRC(RegTimeSlotPeriod,0x00);
WriteRawRC(RegMfOutSelect,0x00);
WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x3F);
WriteRawRC(RegTimerClock,0x07);
WriteRawRC(RegTimerReload,0x0A);
WriteRawRC(RegTimerControl,0x06);
WriteRawRC(RegIRqPinConfig,0x02);
WriteRawRC(RFU2E,0x00);
WriteRawRC(RFU2F,0x00);
PcdSetTmo(106);
DelayMs(1);
PcdAntennaOn();
}
else if (type == 'r')
{
ClearBitMask(RegControl,0x08);
WriteRawRC(RegClockQControl,0x0);
WriteRawRC(RegClockQControl,0x40);
Delay_50us(2);
ClearBitMask(RegClockQControl,0x40);
WriteRawRC(RegTxControl,0x4b);//8);//?0x4b
WriteRawRC(RegCwConductance,0x06);
WriteRawRC(RegModConductance,0x03);
WriteRawRC(RegCoderControl,0x20);
WriteRawRC(RegModWidth,0x13);
WriteRawRC(RegModWidthSOF,0x00);
WriteRawRC(RegTypeBFraming,0x3B);
WriteRawRC(RegRxControl1,0x73);
WriteRawRC(RegDecoderControl,0x19);
WriteRawRC(RegBitPhase,0xAD);
WriteRawRC(RegRxThreshold,0x88);
WriteRawRC(RegBPSKDemControl,0x3E);
WriteRawRC(RegRxControl2,0x01);
WriteRawRC(RegRxWait,0x06);
WriteRawRC(RegChannelRedundancy,0x2C);
WriteRawRC(RegCRCPresetLSB,0xFF);
WriteRawRC(RegCRCPresetMSB,0xFF);
WriteRawRC(RegTimeSlotPeriod,0x00);
WriteRawRC(RegMfOutSelect,0x00);
WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x1A);
WriteRawRC(RegTimerClock,0x07);
WriteRawRC(RegTimerReload,0x0A);
WriteRawRC(RegTimerControl,0x06);
WriteRawRC(RegIRqPinConfig,0x02);
WriteRawRC(RFU2E,0x00);
WriteRawRC(RFU2F,0x00);
PcdSetTmo(106);
DelayMs(1);
PcdAntennaOn();
}
else if (type == 's')
{
ClearBitMask(RegControl,0x08);
WriteRawRC(RegClockQControl,0x0);
WriteRawRC(RegClockQControl,0x40);
Delay_50us(2);
ClearBitMask(RegClockQControl,0x40);
WriteRawRC(RegTxControl,0x4b);
WriteRawRC(RegCwConductance,0x06);
WriteRawRC(RegModConductance,0x03);
WriteRawRC(RegCoderControl,0x20);
WriteRawRC(RegModWidth,0x13);
WriteRawRC(RegModWidthSOF,0x00);
WriteRawRC(RegTypeBFraming,0x18);
WriteRawRC(RegRxControl1,0x73);
WriteRawRC(RegDecoderControl,0x19);
WriteRawRC(RegBitPhase,0xAD);
WriteRawRC(RegRxThreshold,0x88);
WriteRawRC(RegBPSKDemControl,0x3E);
WriteRawRC(RegRxControl2,0x01);
// WriteRawRC(RegClockQControl,0x00);//?
WriteRawRC(RegRxWait,0x06);
WriteRawRC(RegChannelRedundancy,0x2C);
WriteRawRC(RegCRCPresetLSB,0xFF);
WriteRawRC(RegCRCPresetMSB,0xFF);
WriteRawRC(RegTimeSlotPeriod,0x00);
WriteRawRC(RegMfOutSelect,0x00);
WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x3F);
WriteRawRC(RegTimerClock,0x07);
WriteRawRC(RegTimerReload,0x0A);
WriteRawRC(RegTimerControl,0x06);
WriteRawRC(RegIRqPinConfig,0x02);
WriteRawRC(RFU2E,0x00);
WriteRawRC(RFU2F,0x00);
PcdSetTmo(106);
DelayMs(1);
PcdAntennaOn();
}
else if (type == '1')
{
ClearBitMask(RegControl,0x08);
WriteRawRC(RegTxControl,0x48);
WriteRawRC(RegCwConductance,0x3F);
WriteRawRC(RegModConductance,0x05); // must be measured for 15% Modulation Index
WriteRawRC(RegCoderControl,0x2F); // 52.97kHz, 1-256 coding
WriteRawRC(RegModWidth,0x3F); // Modulation width: 9.44us
WriteRawRC(RegModWidthSOF,0x3F); // Standard mode: 9.44us
WriteRawRC(RegTypeBFraming,0x00);
WriteRawRC(RegRxControl1,0x8b);
WriteRawRC(RegDecoderControl,0x34);
WriteRawRC(RegBitPhase,0xcd);
WriteRawRC(RegRxThreshold,0x88);
WriteRawRC(RegBPSKDemControl,0);
WriteRawRC(RegRxControl2,0x01);
WriteRawRC(RegClockQControl,0x00);
WriteRawRC(RegRxWait,0x08);
WriteRawRC(RegChannelRedundancy,0x2C); // Enable CRC TX/RX
WriteRawRC(RegCRCPresetLSB,0xFF);
WriteRawRC(RegCRCPresetMSB,0xFF);
WriteRawRC(RegTimeSlotPeriod,0x00);
WriteRawRC(RegMfOutSelect,0x00); // enable SIGOUT = envelope
WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x38);
WriteRawRC(RegTimerClock,0x0B);
WriteRawRC(RegTimerReload,0x00);
WriteRawRC(RegTimerControl,0x02); // TStopRxEnd=0,TStopRxBeg=1,
WriteRawRC(RFU2E,0x00);
WriteRawRC(RFU2F,0x00);
DelayMs(1);
PcdAntennaOn();
}
else{ return -1; }
return MI_OK;
}
/////////////////////////////////////////////////////////////////////
//置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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -