⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slrc632.c

📁 读ISO14443 CPU卡源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -