📄 mfrc500.c
字号:
for (i = 0; i < MInfo.nBytesReceived; i++)
{
dummyShift2 = RcvBuffer[i];
RcvBuffer[i] = (dummyShift1 >> (i+1)) | (RcvBuffer[i] << (7-i));
dummyShift1 = dummyShift2;
}
MInfo.nBitsReceived -= MInfo.nBytesReceived;
if ( MInfo.collPos )
MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
}
if ( status == MI_OK || status == MI_COLLERR) // no other occured
{
byteOffset = 0;
if( nbits != 0 )
{
Snr[nbytes - 1]|= RcvBuffer[0];
byteOffset = 1;
}
for ( i =0; i < (4 - nbytes); i++)
{
Snr[nbytes + i] = RcvBuffer[i + byteOffset];
}
if (status != MI_COLLERR )
{
snr_crc = Snr[0] ^Snr[1] ^Snr[2] ^Snr[3];
snr_check = RcvBuffer[MInfo.nBytesReceived - 1];
if (snr_crc != snr_check)
{
status = MI_SERNRERR;
}
else
{
complete = 1;
}
}
else
{
bcnt = bcnt + MInfo.collPos - nbits;
status = MI_OK;
}
}
}
ClearBitMask(RegDecoderControl,0x20);
return status;
}
uchar M500Select(uchar *Snr)
{
uchar idata status = MI_OK;
uchar idata size;
M500PcdSetTmo(2); // 1 050418
WriteIO(RegChannelRedundancy,0x0F);
ClearBitMask(RegControl,0x08);
ResetInfo(&MInfo);
SndBuffer[0] = 0x93;
SndBuffer[1] = 0x70;
memcpy(SndBuffer + 2,Snr,4);
SndBuffer[6] = SndBuffer[2]^SndBuffer[3]^SndBuffer[4]^SndBuffer[5];
MInfo.nBytesToSend = 7;
status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
if (status == MI_OK)
{
if (MInfo.nBitsReceived != 8)
{
status = MI_BITCOUNTERR;
}
else
{
size = RcvBuffer[0];
}
}
return status;
}
// cook key
void M500HostCodeKey(uchar *uncoded,uchar *coded)
{
uchar idata cnt = 0;
uchar idata ln = 0;
uchar idata hn = 0;
for (cnt = 0; cnt < 6; cnt++)
{
ln = uncoded[cnt] & 0x0F;
hn = uncoded[cnt] >> 4;
coded[cnt * 2 + 1] = (~ln << 4) | ln;
coded[cnt * 2 ] = (~hn << 4) | hn;
}
}
///////////////////////////////////////////////////////////////////////
// M I F A R E H A L T
///////////////////////////////////////////////////////////////////////
/*
char M500Halt(void)
{
char status = MI_CODEERR;
M500PcdSetTmo(3);//106);
// ************* Cmd Sequence **********************************
ResetInfo(&MInfo);
SndBuffer[0] = PICC_HALT ; // Halt command code
SndBuffer[1] = 0x00; // dummy address
MInfo.nBytesToSend = 2;
status = M500PcdCmd(PCD_TRANSCEIVE,
SndBuffer,
RcvBuffer,
&MInfo);
if (status)
{
// timeout error ==> no NAK received ==> OK
if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
status = MI_OK;
}
//reset command register - no response from tag
WriteIO(RegCommand,PCD_IDLE);
return status;
}
*/
uchar M500PiccAuthState(uchar AuthMode, uchar *snr, uchar Sector)
{
uchar idata status = MI_OK;
status = ReadIO(RegErrorFlag);
if (status != MI_OK)
{
if (status & 0x40)
status = MI_KEYERR;
else
status = MI_AUTHERR;
}
else
{
SndBuffer[0] = AuthMode;
SndBuffer[1] = Sector*4+3;
memcpy(SndBuffer + 2, snr, 4);
ResetInfo(&MInfo);
MInfo.nBytesToSend = 6;
M500PcdSetTmo(3); // 3
if ((status = M500PcdCmd(PCD_AUTHENT1, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
{
if (ReadIO(RegSecondaryStatus) & 0x07)
{
status = MI_BITCOUNTERR;
}
else
{
ResetInfo(&MInfo);
MInfo.nBytesToSend = 0;
if ((status = M500PcdCmd(PCD_AUTHENT2, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
{
if ( ReadIO(RegControl) & 0x08 )
{
status = MI_OK;
}
else
{
status = MI_AUTHERR;
}
}
}
}
}
return status;
}
uchar M500Auth(uchar Mode, uchar *snr, uchar *Keys, uchar Sector)
{
uchar idata status = MI_OK;
uchar idata keycoded[12];
uchar idata offset;
offset = (Mode == PICC_AUTHENT1A) ? 0 : 6;
M500HostCodeKey(Keys,keycoded);
FlushFIFO();
ResetInfo(&MInfo);
memcpy(SndBuffer,keycoded,12);
MInfo.nBytesToSend = 12;
if ((status = M500PcdCmd(PCD_LOADKEY, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
{
status = M500PiccAuthState(Mode, snr, Sector);
}
return status;
}
uchar M500Read(uchar Address,uchar *DataBuff)
{
uchar idata status = MI_OK;
uchar idata tmp = 0;
FlushFIFO();
M500PcdSetTmo(4); //3
WriteIO(RegChannelRedundancy,0x0F);
ResetInfo(&MInfo);
SndBuffer[0] = PICC_READ;
SndBuffer[1] = Address;
MInfo.nBytesToSend = 2;
status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
if (status != MI_OK)
{
if (status != MI_NOTAGERR )
{
if (MInfo.nBitsReceived == 4)
{
RcvBuffer[0] &= 0x0f;
if ((RcvBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR;
}
else
{
status = MI_CODEERR;
}
}
}
}
else
{
if (MInfo.nBytesReceived != 16)
{
status = MI_BYTECOUNTERR;
}
else
{
memcpy(DataBuff,RcvBuffer,16);
}
}
return status;
}
uchar M500Write(uchar Address,uchar *DataBuff)
{
uchar idata status = MI_OK;
ResetInfo(&MInfo);
SndBuffer[0] = PICC_WRITE;
SndBuffer[1] = Address;
MInfo.nBytesToSend = 2;
status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
if (status != MI_NOTAGERR)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
RcvBuffer[0] &= 0x0f;
if ((RcvBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR;
}
else
{
if (RcvBuffer[0] == 0x0a)
{
status = MI_OK;
}
else
{
status = MI_CODEERR;
}
}
}
}
if ( status == MI_OK)
{
M500PcdSetTmo(3);
ResetInfo(&MInfo);
memcpy(SndBuffer,DataBuff,16);
MInfo.nBytesToSend = 16;
status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
if (status != MI_NOTAGERR)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
RcvBuffer[0] &= 0x0f;
if ((RcvBuffer[0] & 0x0a) == 0)
{
status = MI_WRITEERR;
}
else
{
if (RcvBuffer[0] == 0x0a)
{
status = MI_OK;
}
else
{
status = MI_CODEERR;
}
}
}
}
}
return status;
}
uchar M500Increment(uchar addr, uchar *value, uchar bakaddr)
{
uchar i;
if((i=M500Value(PICC_INCREMENT, addr, value, addr)) != MI_OK)
return i;
if(addr != bakaddr)
return M500Copy(addr, bakaddr);
else
return MI_OK;
}
uchar M500Decrement(uchar addr, uchar *value, uchar bakaddr)
{
uchar i;
if((i=M500Value(PICC_DECREMENT, addr, value, addr)) != MI_OK)
return i;
if(addr != bakaddr)
return M500Copy(addr, bakaddr);
else
return MI_OK;
}
uchar M500Copy(uchar srcaddr, uchar desaddr)
{
uchar i;
if((i=M500Restore(srcaddr)) != MI_OK)
return i;
else
return M500Transfer(desaddr);
}
uchar M500Restore(uchar Address)
{
uchar status = MI_OK;
M500PcdSetTmo(1);
ResetInfo(&MInfo);
SndBuffer[0] = PICC_RESTORE;
SndBuffer[1] = Address;
MInfo.nBytesToSend = 2;
status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
if (status != MI_NOTAGERR)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
RcvBuffer[0] &= 0x0f;
switch(RcvBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x0a:
status = MI_OK;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
}
if ( status == MI_OK)
{
M500PcdSetTmo(3);
ResetInfo(&MInfo);
SndBuffer[0]=0;
SndBuffer[1]=0;
SndBuffer[2]=0;
SndBuffer[3]=0;
MInfo.nBytesToSend = 4;
status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
if (status == MI_OK)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
RcvBuffer[0] &= 0x0f;
switch(RcvBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
}
else
if (status == MI_NOTAGERR )
status = MI_OK;
}
return status;
}
uchar M500Transfer(uchar Address)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -