📄 mfslave.c
字号:
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 + -