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

📄 slrc500.c

📁 RC500可用的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -