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

📄 mfslave.c

📁 MIFARE读卡器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	else
	{
   	if((ReadBuf[5]==Request_ALL)||(ReadBuf[5]==Request_IDLE))
   	{
		ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
		   	
   		WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
		WriteIO(RegBitFraming,0x07);        // set TxLastBits to 7 
		SetBitMask(RegTxControl,0x03);    // Tx2RF-En, Tx1RF-En enable
		
		status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+5,ReadBuf[0],ReadBuf+7,ReadBuf);
		if (ReadBuf[0]!= 2) // 2 bytes expected
               status = MI_BITCOUNTERR;
	}

   	if((ReadBuf[0]<7)&&(ReadBuf[5]==PICC_ANTICOLL1))
   	{
		ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
		   		
//		WriteIO(RegChannelRedundancy,0x03); //RxCRC and TxCRC disable, parity enable
		WriteIO(RegDecoderControl,0x28); // ZeroAfterColl aktivieren

		ReadBuf[1]=0;
		ReadBuf[2]=ReadBuf[6];	//snbt
		ReadBuf[17]=0;			//clear coll sign
		
		while (!ReadBuf[1] && (status == MI_OK) )
		{
      		ResetInfo(MInfo);           
      		WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable		
			ReadBuf[3] = ReadBuf[2] % 8;   // remaining number of bits
			WriteIO(RegBitFraming,ReadBuf[3] << 4 | ReadBuf[3]); // TxLastBits/RxAlign auf nb_bi
			
			if(ReadBuf[3])
         		ReadBuf[0] = ReadBuf[2] / 8 + 1;   //Send Bytes
         		// number of bytes known
			else
         		ReadBuf[0] = ReadBuf[2] / 8;   //Send Bytes			

      		ReadBuf[6] = 0x20 + ((ReadBuf[2]/8) << 4) + ReadBuf[3]; //number of bytes send
			
			if(ReadBuf[3]==7)
				WriteIO(RegBitFraming,ReadBuf[3]); // TxLastBits/RxAlign auf nb_bi

			MInfo.nBytesToSend   = ReadBuf[0]+2;
			
			status = M500PcdCmd(PCD_TRANSCEIVE,
								ReadBuf+5,
                         		ReadBuf+12,
                         		&MInfo);

			if ( status == MI_OK || status == MI_COLLERR||((ReadBuf[3]==7)&&status == MI_PARITYERR))    // no other occured
			{
         	// R e s p o n s e   P r o c e s s i n g 
         		if(ReadBuf[3]==7)
         		{
         			ReadBuf[7+ReadBuf[0]-1]=(ReadBuf[7+ReadBuf[0]-1]&0x7f)|(ReadBuf[12]<<7);
         			ReadBuf[2]+=1;
         			status = MI_OK;
         			continue;
         		}
         	  
				if ( MInfo.nBitsReceived != (40 - ReadBuf[2]+ReadBuf[3]) ) // not 5 bytes answered
         		{
            		status = MI_BITCOUNTERR; // Exit with error
         		} 
         		else 
         		{
             		if( ReadBuf[3] != 0 ) // last byte was not complete
            		{
                		ReadBuf[7+ReadBuf[0] - 1] = ReadBuf[7+ReadBuf[0] - 1] | ReadBuf[12];
                		for ( ReadBuf[4] =0; ReadBuf[4] < (5 - ReadBuf[0]); ReadBuf[4]++)     
            			{
               				ReadBuf[7+ReadBuf[0] + ReadBuf[4]] = ReadBuf[12+ReadBuf[4] + 1];
            			}
            		}
            		else
            		{
            			for ( ReadBuf[4] =0; ReadBuf[4] < (5 - ReadBuf[0]); ReadBuf[4]++)     
            			{
               				ReadBuf[7+ReadBuf[0] + ReadBuf[4]] = ReadBuf[12+ReadBuf[4]];
            			}
            		}

            		if (status != MI_COLLERR ) // no error and no collision
            		{
               		// SerCh check
               			ReadBuf[4] = ReadBuf[7] ^ ReadBuf[8] ^ ReadBuf[9] ^ ReadBuf[10];
               			if (ReadBuf[4] != ReadBuf[11])
               			{
                  			status = MI_SERNRERR;
               			} 
               			else   
               			{
                  			ReadBuf[1] = 1;
                  			ReadBuf[0] = 5;
                  			ReadBuf[11]= ReadBuf[17];	//move COLL sign
               			}
            		}
            		else                   // collision occured
            		{
            			ReadBuf[17]=1;		//set coll sign
               			ReadBuf[2] = ReadBuf[2] + MInfo.collPos - ReadBuf[3];
               			status = MI_OK;
            		}
         		}
      		}
		}
	}

   	if((ReadBuf[0]==7)&&(ReadBuf[5]==PICC_ANTICOLL1))
   	{
		ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
		   	
		status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+5,ReadBuf[0],ReadBuf+7,ReadBuf);   	
   	}

    if((ReadBuf[5]==PICC_AUTHENT1A)||(ReadBuf[5]==PICC_AUTHENT1B))
    {
    	if(ReadBuf[4]&2)
    	{
    		ReadBuf[0]=2;
			status=M500PiccExchangeBlock(PCD_LOADKEYE2,ReadBuf+11,ReadBuf[0],ReadBuf+11,ReadBuf);
    	}
    	else
    	{
    		ReadBuf[0]=12;
			status=M500PiccExchangeBlock(PCD_LOADKEY,ReadBuf+11,ReadBuf[0],ReadBuf+11,ReadBuf);    		
    	}
    	
    	if (status == MI_OK)
    	{
    		ReadBuf[0]=6;
    		status=M500PiccExchangeBlock(PCD_AUTHENT1,ReadBuf+5,ReadBuf[0],ReadBuf+7,ReadBuf);
    		if(status == MI_OK)
    		{
				if (ReadIO(RegSecondaryStatus) & 0x07) // Check RxLastBits for error
         		{
            		status = MI_BITCOUNTERR;
         		}
         		else
         		{ 
         			status=M500PiccExchangeBlock(PCD_AUTHENT2,ReadBuf+5,0,ReadBuf+7,ReadBuf);
         			if(status == MI_OK)
         			{
						if ( ReadIO(RegControl) & 0x08 ) // Crypto1 activated
               			{
                   			status = MI_OK;
               			}
               			else
               			{
                   			status = MI_AUTHERR;
               			}         			
         			}
         		}
         	}
    	}
    } 

   	if(ReadBuf[5]==PICC_READ)
   	{
		status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+5,ReadBuf[0],ReadBuf+7,ReadBuf);   	
   	}
    
    if(ReadBuf[5]==PICC_WRITE)
    {
		status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+5,2,ReadBuf+1,ReadBuf);
		
		if (status != MI_NOTAGERR)   // no timeout error
		{
			if (ReadBuf[0] != 1)
				status = MI_BITCOUNTERR;
			else
				{
					if(ReadBuf[1]!=0x0a)
						{
							status = MI_CODEERR;
							if(ReadBuf[1]&0xf0 != 0)
								status = MI_BITCOUNTERR;
							if(!ReadBuf[1])
								status = MI_NOTAUTHERR;
						}
					else
						{
							status = MI_OK;
							ReadBuf[0]=16;
							status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+7,ReadBuf[0],ReadBuf+7,ReadBuf);
							
							if (status & 0x80)    // timeout occured
        					{
           						status = MI_NOTAGERR;
        					}
        					else
        					{
        						if (ReadBuf[0] != 1)	status = MI_BITCOUNTERR;
        						else
        						{
        							if(ReadBuf[1]!=0x0a)
        							{
        								status = MI_CODEERR;
										if(ReadBuf[1]&0xf0 != 0)
											status = MI_BITCOUNTERR;
										if(!ReadBuf[1])
											status = MI_WRITEERR;
        							}
        							else	
        							{
        								status = MI_OK;
        								ReadBuf[0] = 0;
        							}
        						}
        					}
						}
				}
		}
	}

    if(ReadBuf[5]==PICC_DECREMENT||ReadBuf[5]==PICC_INCREMENT||ReadBuf[5]==PICC_RESTORE)
    {
		status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+5,2,ReadBuf+1,ReadBuf);
		
		if (status != MI_NOTAGERR)   // no timeout error
		{
			if (ReadBuf[0] != 1)
				status = MI_BITCOUNTERR;
			else
				{
					if(ReadBuf[1]!=0x0a)
						{
							status = MI_CODEERR;
							if(ReadBuf[1]&0xf0 != 0)
								status = MI_BITCOUNTERR;
							if(!ReadBuf[1])
								status = MI_NOTAUTHERR;
							if(ReadBuf[1]==1)
								status = MI_VALERR;	
						}
					else
						{
							status = MI_OK;
							ReadBuf[0]=4;
							status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+7,4,ReadBuf+1,ReadBuf);
						}
				}
		}
		
		if (status == MI_OK)   // no timeout error
		{
			if (ReadBuf[0] != 1)
				status = MI_BITCOUNTERR;
			else
				{
					status = MI_CODEERR;
					if(ReadBuf[1]&0xf0 != 0)
						status = MI_BITCOUNTERR;
					if(!ReadBuf[1])
						status = MI_NOTAUTHERR;
					if(ReadBuf[1]==1)
						status = MI_VALERR;				
				}			
		}
		else
		{
         	if (status == MI_NOTAGERR )
            	status = MI_OK;  // no response after 4 byte value - 
                             // transfer command has to follow		
		}
		
		if ( status == MI_OK)
		{
			ReadBuf[10]=PICC_TRANSFER;
			status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+10,2,ReadBuf+7,ReadBuf);

			if (status != MI_NOTAGERR)   // no timeout error
			{
				if (ReadBuf[0] != 1)
					status = MI_BITCOUNTERR;
				else
					{
						status = MI_CODEERR;
						if(ReadBuf[7]&0xf0 != 0)
							status = MI_BITCOUNTERR;
						if(!ReadBuf[7])
							status = MI_NOTAUTHERR;
						if(ReadBuf[7]==1)
							status = MI_VALERR;
						if(ReadBuf[7]==0x0a)
						{
							status = MI_OK;
							ReadBuf[0]=0;	
						}
					}
			}			
		}
    }    
  
    if(ReadBuf[5]==PICC_HALT)
    {
		status=M500PiccExchangeBlock(PCD_TRANSCEIVE,ReadBuf+5,2,ReadBuf+7,ReadBuf);
		if (status)
		{
     		// timeout error ==> no NAK received ==> OK
     		if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
     		{
        		status = MI_OK;
        		ReadBuf[0]=0;
        	}
   		}		    
    }
    }  
    PrepareTransmitUpBlock(status);	
}		

⌨️ 快捷键说明

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