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

📄 m500auc.lst

📁 ISO14443协议的实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
 978   3                              if(kk == 1) TC1 = temp;//TC1
 979   3                              if(kk == 2) wi0 = temp;//TC2
 980   3      			toPpc(Len,temp);/*TCi*/
 981   3      			Bcc^=temp;
 982   3      			Len++;}
 983   2      		if((TD&0x80)==0x80)
 984   2      			{
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 17  

 985   3                              TD=RECVbyte0();
 986   3      			if(STATE_FLAG)
 987   3                                               return(TD);
 988   3      			Bcc^=TD;
 989   3      			toPpc(Len,TD);
 990   3      
 991   3      			if((TD&0x0f)==0x00) T0_T1_FLAG=0;
 992   3      			if((TD&0x0f)==0x01) T0_T1_FLAG=1;
 993   3      
 994   3      			Len++;
 995   3      			if((TD&0xf0)==0x00) break;
 996   3      			}
 997   2      		else	break;
 998   2      		}
 999   1      
1000   1      		/*recv TK */
1001   1      	for(i=Len;i<(Len+length);i++)
1002   1      		{
1003   2      		temp=RECVbyte0();
1004   2      		if(STATE_FLAG)
1005   2                                       return(temp);
1006   2      		Bcc^=temp;
1007   2      		toPpc(i,temp);
1008   2      		}
1009   1      
1010   1      	CPU_block_num=0;//can't delete--2000.10.15
1011   1      	if(ID==CPUtype)//cpu card
1012   1      		{
1013   2      		IC_REST_FLAG=1;
1014   2      		CPU_T0_T1=T0_T1_FLAG;
1015   2      		CPU_block=0;
1016   2      		}
1017   1      	else if(ID==SAM1type)		//sam card
1018   1      		{
1019   2      		SAM_REST_FLAG=1;
1020   2      		SAM_T0_T1=T0_T1_FLAG;
1021   2      		SAM_block=0;
1022   2      		}
1023   1      
1024   1      	Len+=length;
1025   1              DD = dd0;WI = wi0;
1026   1              delay_1ms(10);
1027   1      	return 0;
1028   1      	}
1029          //======================================================================================
1030          uchar trans_t0(void)//CPU_ICC:T=0
1031          	{
1032   1      	uchar i,tempch;
1033   1      	uchar casef;//Rlen;
1034   1      
1035   1      
1036   1      //ET0 = 0;
1037   1      	led = 0;
1038   1      	LcLe=fromPpc(4);
1039   1      
1040   1      	if((Len==4)|(Len==5)) {casef=0x12;}
1041   1      	else casef=0x34;
1042   1      
1043   1      	if(Len==4) toPpc(4,0);
1044   1      
1045   1        for (i=0;i<5;i++)
1046   1      	{
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 18  

1047   2              tempch = fromPpc(i);
1048   2      	status=SENDbyte0(tempch);
1049   2      	if (STATE_FLAG) return status;
1050   2      	}
1051   1      
1052   1        if(!TR2)
1053   1           if(forPowerdown)
1054   1                 TR2 = 1;
1055   1        while(1)
1056   1        {
1057   2        sw1=RECVbyte0();
1058   2        if(STATE_FLAG)
1059   2        		{
1060   3      		sw1=RECVbyte0();
1061   3      		if(STATE_FLAG)	return(sw1);
1062   3      		}
1063   2      	if(sw1!=0x60) break;
1064   2      	}
1065   1      
1066   1      Rlen=0;
1067   1      ins=fromPpc(1);
1068   1      
1069   1      if(sw1==ins)
1070   1      	{
1071   2      	if(casef==0x34)
1072   2      		{
1073   3      		for (i=5;i<5+LcLe;i++)
1074   3      			{
1075   4                              tempch = fromPpc(i);
1076   4      			status=SENDbyte0(tempch);
1077   4      			if (STATE_FLAG)
1078   4                              	 return(status);
1079   4      			}
1080   3      //		sw1=RECVbyte0();
1081   3      //		if(STATE_FLAG)
1082   3      //                 return(sw1);
1083   3      		}
1084   2      	else if(casef==0x12)
1085   2      			{
1086   3      			for(i=0;i<LcLe;i++)
1087   3      				{
1088   4      				tempch=RECVbyte0();
1089   4      				if(STATE_FLAG)
1090   4                                       return(tempch);
1091   4      				toPpc(Rlen,tempch);
1092   4      				Rlen++;
1093   4      				}
1094   3      //			sw1=RECVbyte0();
1095   3      //			if(STATE_FLAG)
1096   3      //                         return(sw1);
1097   3      			}
1098   2      		sw1=RECVbyte0();
1099   2      		if(STATE_FLAG)
1100   2                       return(sw1);
1101   2      		}
1102   1      
1103   1        while(1)
1104   1      	{
1105   2      	while(sw1 == 0x60)
1106   2              	sw1=RECVbyte0();
1107   2      	ins=fromPpc(1);
1108   2      	if(sw1==ins)
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 19  

1109   2      		{
1110   3      		for(i=0;i<LcLe;i++)
1111   3      			{
1112   4      			tempch=RECVbyte0();
1113   4      			if(STATE_FLAG)
1114   4                               return(tempch);
1115   4      			toPpc(Rlen,tempch);
1116   4      			Rlen++;
1117   4      			}
1118   3      		sw1=RECVbyte0();
1119   3      		if(STATE_FLAG)
1120   3                       return(sw1);
1121   3      		continue;
1122   3      		}
1123   2      	sw2=RECVbyte0();
1124   2      	if(STATE_FLAG)
1125   2               return(sw2);
1126   2      
1127   2      ////
1128   2      /*
1129   2      if((sw1==0x61)||(sw1==0x6c))
1130   2      		{
1131   2      		if(sw1==0x61)
1132   2      			{
1133   2      			toPpc(0,0);
1134   2      			toPpc(1,0xc0);
1135   2      			toPpc(2,0);
1136   2      			toPpc(3,0);
1137   2      			}
1138   2      		toPpc(4,sw2);
1139   2      		LcLe=sw2;
1140   2                      tt0 = timer0 = 0;
1141   2      		for(i=0;i<5;i++)
1142   2      			{
1143   2      			status=SENDbyte0(fromPpc(i));
1144   2      			if(STATE_FLAG) return(status);
1145   2      			}
1146   2      		sw1=RECVbyte0();
1147   2      		if(STATE_FLAG) return(sw1);
1148   2      		continue;
1149   2      		}
1150   2      */
1151   2      ////
1152   2      //	if(((sw1&0xf0)!=0x90)&&((sw1&0xf0)!=0x60))
1153   2      //		{STATE_FLAG=1;return(0x88);}/*sw1!=9x.6x---error*/
1154   2      //	else
1155   2      //		{
1156   2                      toPpc(Rlen,sw1);Rlen++;toPpc(Rlen,sw2);Rlen++;
1157   2                      break;
1158   2      //                }/*sw1=9x.6x but !=61.6c*/
1159   2      	}
1160   1              ET0 = 0;
1161   1        Len=Rlen;return 0;
1162   1        }
1163          
1164          
1165          
1166          //==================================================================================
1167          /*T=1通信协议*/
1168          uchar trans_t1(void)
1169          	{
1170   1      	uchar Bcc,temp,i;
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 20  

1171   1      	led = 0;
1172   1      	Bcc=NAD;/*BCC*/
1173   1      	status=SENDbyte0(NAD);/*send NAD*/
1174   1      	if(STATE_FLAG==0)
1175   1      		{
1176   2      		if((pcb&0x80)==0)//I_block
1177   2      			{
1178   3      			if(CPU_block_num) {pcb|=0x40;}
1179   3      			else	pcb&=0xbf;
1180   3      			}
1181   2      		Bcc^=pcb;
1182   2      		//CPU_block_num^=1;
1183   2      		CPU_block_num = ~CPU_block_num;
1184   2      
1185   2      		status=SENDbyte0(pcb);/*send PCB*/
1186   2      		}
1187   1      
1188   1      	if(!STATE_FLAG)
1189   1      		{
1190   2      			Bcc^=Len;
1191   2      			status=SENDbyte0(Len);/*send Len*/
1192   2      		}
1193   1      
1194   1      	if(STATE_FLAG) return(status);
1195   1      
1196   1      	for(i=0;i<Len;i++)
1197   1      			{
1198   2      			temp=fromPpc(i);
1199   2      			status=SENDbyte0(temp);/*send INF*/
1200   2      			if(STATE_FLAG==1) return(status);
1201   2      			Bcc^=temp;
1202   2      			}
1203   1      
1204   1      	status=SENDbyte0(Bcc);/*send BCC*/
1205   1      		if(STATE_FLAG==1) return(status);
1206   1      
1207   1      
1208   1      
1209   1      /*接收响应*/
1210   1      	NAD=RECVbyte0();/*recv NAD*/
1211   1      		if(STATE_FLAG==1) return(NAD);
1212   1      		//if(status!=(swapchar(ct1))) {STATE_FLAG=1;return(0x88);}/*NAD error*/
1213   1      
1214   1      	Bcc=NAD;/*BCC*/
1215   1      
1216   1      	pcb=RECVbyte0();/*recv PCB*/
1217   1      		if(STATE_FLAG==1) return(pcb);
1218   1      	Bcc^=pcb;
1219   1      
1220   1      	Len=RECVbyte0();/*recv Len*/
1221   1      		if(STATE_FLAG==1) return(Len);
1222   1      	Bcc^=Len;
1223   1      
1224   1      	temp=0;
1225   1      	if(pcb&0x80!=0)//is R_block or S_block(not I_block) --  save NAD.PCB.Len
1226   1      		{
1227   2      		toPpc(0,NAD);//save 0
1228   2      		toPpc(1,pcb);//save PCB
1229   2      		toPpc(2,Len);//save Len
1230   2      		temp=3;
1231   2      		command=SNotIblock;//retrun not I_block
1232   2      		}
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 21  

1233   1      
1234   1      	Len+=temp;//adjust
1235   1      
1236   1      	for(i=0;i<Len-temp;i++)//RECV INF
1237   1      		{
1238   2      		status=RECVbyte0();
1239   2      			if(STATE_FLAG==1) return(status);
1240   2      		Bcc^=status;
1241   2      		toPpc(temp+i,status);//save INF
1242   2      		}
1243   1      
1244   1      	status=RECVbyte0();//recv Bcc
1245   1      		if(STATE_FLAG==1) return(status);
1246   1      
1247   1      	toPpc(Len,status);//save Bcc
1248   1      
1249   1      	//if(status!=Bcc) {STATE_FLAG=1;return(status);}
1250   1      
1251   1              ET0 = 0;
1252   1      	return 0;
1253   1      
1254   1      	}
1255          //==================================================================================
1256          
1257          #pragma noaregs
1258          
1259          
1260          
1261          void delay_50us(unsigned char _50us)
1262          {
1263   1      	while(_50us--)
1264   1      	{
1265   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1266   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1267   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1268   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1269   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1270   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1271   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1272   2      	  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1273   2      
1274   2      	 }
1275   1      }
1276          void delay_1ms(uchar _1ms)
1277          {
1278   1      
1279   1      #ifndef NO_TIMER2
              
                RCAP2LH = RCAP2_1ms;
                T2LH    = RCAP2_1ms;
              
                TR2 = TRUE;
                while (_1ms--)
                {
              	while (!TF2);
              	TF2 = FALSE;
                }
                TR2 = FALSE;
              
              #else
1293   1      
1294   1        while (_1ms--)
C51 COMPILER V6.02  M500AUC                                                                11/20/2007 16:53:51 PAGE 22  

1295   1        {
1296   2      	delay_50us(20);
1297   2        }
1298   1      
1299   1      #endif
1300   1      }
1301          
1302          /*"int1(IC_SW)中断服务函

⌨️ 快捷键说明

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