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

📄 m500auc.lst

📁 ISO14443协议的实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 1   


C51 COMPILER V6.02, COMPILATION OF MODULE M500AUC
OBJECT MODULE PLACED IN D:\资源文件\RFREADER\SOURCE\ICMF\M500AUC.OBJ
COMPILER INVOKED BY: C:\WAVE6000\cv602\C51.EXE D:\资源文件\RFREADER\SOURCE\ICMF\M500AUC.C OT(5) 

stmt level    source

   1          #pragma small DEBUG SYMBOLS OBJECTEXTEND CODE
   2          #include <string.h>
   3          #include <stdio.h>
   4          #include <absacc.h>
   5          #include <intrins.h>
   6          #include "Mfreg500.h"                                         //RC500寄存器
   7          #include "MfErrNo.h"                                          //错误标识
   8          #include "reg52.h"                                            //89C52寄存器
   9          #include "M500AuC.h"
  10          #define uchar unsigned char
  11          #define uint unsigned int
  12          #define GetRegPage(addr) (0x80 | (addr>>3))
  13          #define NO_TIMER2 1
  14          uchar   status;
  15          uchar	ID,command,NAD;
  16          uchar   LcLe,Rlen,sw1,sw2;
  17          uchar	cla,ins,pcb,pcb_r;
  18          uchar	block_num;
  19          uchar	timer0;
  20          uint    Len,ramlen,tt0;
  21          uchar   TC1,DD,WI;
  22          
  23          void delay_1ms(unsigned char _1ms);
  24          void delay_50us(unsigned char _50us);
  25          uchar M500PcdRfReset(unsigned char ms);
  26          uchar SetBitMask(unsigned char reg,unsigned char mask);
  27          void M500PcdSetTmo(unsigned char tmoLength);
  28          uchar M500PcdCmd(
  29                          volatile unsigned char data * rcv,
  30                          volatile MfCmdInfo idata *info);
  31          uchar ClearBitMask(unsigned char reg,unsigned char mask);
  32          void FlushFIFO(void);
  33          void toPpc(unsigned int Address,unsigned char value)         //向外存中写入数据
  34          {
  35   1              //XBYTE[0x8000+Address]=value;                //20030317 片选引脚改变
  36   1      	XBYTE[0xc000+Address]=value;
  37   1      }
  38          unsigned char fromPpc(unsigned int Address)                  //从外存中读出数据
  39          {
  40   1              //return XBYTE[0x8000+Address];                     //20030317 片选引脚改变
  41   1              return XBYTE[0xc000+Address];
  42   1      }
  43          
  44          void WriteRawIO(unsigned char Address,unsigned char value)   //向RC500寄存器中写数据
  45          {
  46   1              //XBYTE[0x6000+Address]=value;                       //20030317 片选引脚改变
  47   1      	XBYTE[0xa000+Address]=value;
  48   1      }
  49          unsigned char ReadRawIO(unsigned char Address)               //从RC500寄存器中读数据
  50          {
  51   1              //return XBYTE[0x6000+Address];                      //20030317 片选引脚改变
  52   1      	return XBYTE[0xa000+Address];
  53   1      }
  54          
  55          void WriteIO(unsigned char Address, unsigned char value)
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 2   

  56          {
  57   1         WriteRawIO(0x00,GetRegPage(Address));
  58   1         WriteRawIO(Address,value);
  59   1      }
  60          unsigned char ReadIO(unsigned char Address)
  61          {
  62   1         WriteRawIO(0x00,GetRegPage(Address));
  63   1         return ReadRawIO(Address);
  64   1      }
  65          
  66          
  67          void M500PcdSetTmo(unsigned char tmoLength)                //设置计时器
  68          {switch(tmoLength)
  69   1         {  // 时钟频率13.56MHz
  70   2            case 1:                       // short timeout (1,0 ms)
  71   2               WriteIO(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
  72   2               WriteIO(RegTimerReload,0x6a);// TReloadVal = 'h6a =106(dec)
  73   2               break;
  74   2            case 2:                       // medium timeout (1,5 ms)
  75   2               WriteIO(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
  76   2               WriteIO(RegTimerReload,0xa0);// TReloadVal = 'ha0 =160(dec)
  77   2               break;
  78   2            case 3:                       // medium timeout (6 ms)
  79   2               WriteIO(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
  80   2               WriteIO(RegTimerReload,0xa0);// TReloadVal = 'ha0 =160(dec)
  81   2               break;
  82   2            case 4:                       // long timeout (9.6 ms)
  83   2               WriteIO(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
  84   2               WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
  85   2               break;
  86   2            case 5:                       // long timeout (38.5 ms)
  87   2               WriteIO(RegTimerClock,0x0b); // TAutoRestart=0,TPrescale=16*128
  88   2               WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
  89   2               break;
  90   2            case 6:                       // long timeout (154 ms)
  91   2               WriteIO(RegTimerClock,0x0d); // TAutoRestart=0,TPrescale=64*128
  92   2               WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
  93   2               break;
  94   2            case 7:                       // long timeout (616.2 ms)
  95   2               WriteIO(RegTimerClock,0x0f); // TAutoRestart=0,TPrescale=256*128
  96   2               WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
  97   2               break;
  98   2            default:                       //
  99   2               WriteIO(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
 100   2               WriteIO(RegTimerReload,tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
 101   2               break;
 102   2         }
 103   1      }
 104          void t0int(void) interrupt 1 using 3
 105          {
 106   1      	timer0++;
 107   1      }
 108          
 109          
 110          
 111          
 112          //---------------------------------------------------------------------------------------
 113          
 114          void ES_int(void) interrupt 4 using 3  //从串口读出第一个字节
 115          {
 116   1              EA = 0;
 117   1              ES = 0;//ES int off
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 3   

 118   1              STATE_FLAG = 0;
 119   1              RI = 0;
 120   1              if(SBUF != 0xaa) {ES = EA = 1;return ;}//Head = 0xAA
 121   1              ESint = 1;
 122   1              EA = 1;
 123   1      }
 124          
 125          void SRCH232(void)                    //设置串行通讯端口
 126            {
 127   1              INH = 0;
 128   1      	TH1=TL1=254;//57600bps with 22.1184MHz
 129   1      	TR1=1;
 130   1      	delay_1ms(1);//1ms
 131   1      	XC1=XC2=1;
 132   1      	delay_1ms(1);//1ms
 133   1      	RI=0;
 134   1        }
 135          
 136          void SRCH_ICC(uchar C4052)//?/*建立与CPU_ICC.AT24c16.AT45d041通信关系*/
 137          {
 138   1              INH = 0;
 139   1      
 140   1                       TH1=TL1=BAUD_9600;
 141   1      
 142   1      
 143   1              TR1 = 1;
 144   1      	delay_1ms(1);//1ms
 145   1      	if(C4052==CPUtype)			//cpu card
 146   1      		{XC1=XC2=0;}
 147   1      	if(C4052==SAM1type)			//sam card
 148   1      		{XC1=1;XC2=0;}
 149   1      	if(C4052==AT24type)
 150   1      		{XC1=0;XC2=1;}//AT24C16
 151   1      	delay_1ms(1);//1ms
 152   1              tt0 = timer0 = 0;
 153   1              RI=0;
 154   1      }
 155          //---------------------------------------------------------------------------------------
 156          
 157          uchar recv_pc(void)                    //从PC接受一个字符
 158          	{
 159   1              ET0 = 0;
 160   1      	timer0 = 0;
 161   1      	STATE_FLAG=0;
 162   1              ET0 = 1;EA = 1;
 163   1      	while(!RI)	if(timer0 > 20000) break;//10
 164   1      	if(RI==0)
 165   1              {STATE_FLAG=1;return(0x84);}//time out
 166   1      	RI=0;
 167   1              ET0 = 0;
 168   1      	return(SBUF);
 169   1      	}
 170          
 171          uchar recvfrompc(void)                //从PC接受数据
 172          	{
 173   1      	uchar temp=0;
 174   1      	uint i;
 175   1              uint length;
 176   1              uchar Bcc = 0;
 177   1              Rlen = 0;
 178   1              led=0;
 179   1              SRCH232();
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 4   

 180   1              ES = 0;
 181   1              do
 182   1              {
 183   2                while(!RI)
 184   2                {
 185   3                   if(ICSW)
 186   3                     {
 187   4                      EX1 = 1;
 188   4                      led = 1;
 189   4                     }
 190   3                    else
 191   3                     {
 192   4                       EX1 = 0;
 193   4                       led = 0;
 194   4                     }
 195   3      
 196   3                 }
 197   2                RI=0;
 198   2              } while(SBUF != 0xaa); //Head = 0xAA
 199   1      
 200   1              temp=SBUF;
 201   1      	ID=recv_pc();                                  //device
 202   1      	if(STATE_FLAG) return(ID);
 203   1      
 204   1      	command=recv_pc();                             //command
 205   1              if(STATE_FLAG) return(command);
 206   1      
 207   1      	temp=recv_pc();                                //block addr/No.
 208   1      	if(STATE_FLAG) return(temp);
 209   1      
 210   1      	block_num=recv_pc();                           //block number
 211   1      	if(STATE_FLAG) return(block_num);
 212   1      
 213   1      	length=recv_pc();                              //length.L
 214   1      	if(STATE_FLAG) return((uchar)length);
 215   1      
 216   1      	temp=recv_pc();                                //length.H
 217   1      	if(STATE_FLAG) return(temp);
 218   1      	length|=((uint)temp)<<8;
 219   1      
 220   1        if(length!=0)
 221   1      	{
 222   2      	NAD=recv_pc();
 223   2      	if(STATE_FLAG) return(NAD);
 224   2              Bcc ^= NAD;
 225   2      
 226   2      	pcb=recv_pc();
 227   2      	if(STATE_FLAG) return(pcb);
 228   2              Bcc ^= pcb;
 229   2      
 230   2      	Rlen=recv_pc();
 231   2      	if(STATE_FLAG) return(Rlen);
 232   2              Bcc ^= Rlen;
 233   2      
 234   2              if(command == 0x52) return 0;
 235   2      
 236   2              Len=length-3;
 237   2      
 238   2      	for(i=0;i<length - 3;i++)
 239   2      		{
 240   3      		temp=recv_pc();
 241   3              	if(STATE_FLAG)
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 5   

 242   3                                    return(temp);
 243   3       		toPpc(i,temp);
 244   3                      Bcc ^= temp;
 245   3      		}
 246   2      
 247   2      
 248   2      	temp=recv_pc();
 249   2              if(Bcc != temp)
 250   2                     return -1;
 251   2      
 252   2      	cla=fromPpc(0);
 253   2      	ins=fromPpc(1);
 254   2      	LcLe=fromPpc(4);
 255   2              return 0;
 256   2      	}
 257   1      
 258   1      }
 259          
 260          
 261          void SEND_PC(uchar chr)          //向PC发送一个字节
 262          	{
 263   1      	TXD = 1;
 264   1      	while(!TXD);
 265   1      	ACC = chr;
 266   1      	TB8 = P;
 267   1      	SBUF = ACC;
 268   1      	while(!TI);
 269   1      	TI=0;
 270   1      	}
 271          
 272          
 273          
 274          void sendtopc(void)              //向PC发送数据
 275          	{
 276   1      	uint i;
 277   1      	uchar chr,Bcc;
 278   1      
 279   1      ET0 = 0;
 280   1      	SEND_PC(0x55);//send headle
 281   1              Bcc = 0x55;
 282   1              SEND_PC(ID);//send device
 283   1              Bcc ^= ID;
 284   1      	SEND_PC(command);//send command/ST
 285   1              Bcc ^= command;
 286   1      	SEND_PC(Len);//send lengthL
 287   1              Bcc ^= Len;
 288   1      	SEND_PC(0);//send lengthH
 289   1      
 290   1      	if(Len!=0)
 291   1      	{
 292   2      		//Bcc=0;//BCC
 293   2      		for(i = 0; i < Len; i++)
 294   2      			{
 295   3      			chr=fromPpc(i);
 296   3      			SEND_PC(chr);//send DATA
 297   3      			Bcc^=chr;
 298   3      			}
 299   2      	}
 300   1      	SEND_PC(Bcc);//send BCC
 301   1      	}
 302          //M500PcdCmd函数负责取得命令代码cmd,数据指针rcv,状态指针info,并向RC500发送命令,取得应答返回到数据指针
 303          uchar  M500PcdCmd(
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 6   

 304                         volatile unsigned char data *rcv,
 305                          MfCmdInfo idata *info)
 306          {
 307   1         char          idata status    = MI_OK;
 308   1         char          idata tmpStatus ;
 309   1         unsigned char idata lastBits;
 310   1         unsigned int idata timecnt=0;
 311   1         uint i;
 312   1         unsigned char idata irqEn     = 0x00;
 313   1         unsigned char idata waitFor   = 0x00;
 314   1         unsigned char idata timerCtl  = 0x00;
 315   1      
 316   1         WriteIO(RegInterruptEn,0x7F);
 317   1         WriteIO(RegInterruptRq,0x7F);
 318   1         WriteIO(RegCommand,PCD_IDLE);
 319   1      
 320   1         FlushFIFO();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -