📄 fk4428.c
字号:
}
else
{
_Retcode = OK;
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_authentication_2 *
****************************************************************************/
BYTE mifs_authentication_2(BYTE _Mode, BYTE _KeyNr, BYTE _Address)
{
BYTE _Fkt;
BYTE _Status;
BYTE _Retcode;
TOGGLE_WD();
if (_Mode & KEYB)
{
_Fkt = 0x61;
_KeyNr |= _KEYB;
}
else
{
_Fkt = 0x60;
_KeyNr |= _KEYA;
}
MCM_TOC = 10;//TIMEOUT;
MCM_BCNTS = 16;
MCM_KEYSTACON = _AUTH | (_Mode & 0x03);
MCM_KEYADR = _AUTH | _KeyNr;
MCM_DATA = _Fkt;
MCM_DATA = _Address;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _AE | _PE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
if (_Status & _AE)
{
_Retcode = W_AUTH;
}
else
{
if (_Status & _PE)
{
_Retcode = W_PARITY;
}
else
{
delay_50us(10);
if ((MCM_DATA & 0x0A) == 0x00)
{
_Retcode = W_AUTH;
}
else
{
_Retcode = W_BITCNT;
}
}
}
}
}
else
{
_Retcode = OK;
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_halt *
****************************************************************************/
BYTE mifs_halt(void)
{
BYTE _Status;
BYTE _Retcode;
TOGGLE_WD();
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0x50;
MCM_DATA = 0;
MCM_TOC = 10;//TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & _TE)
{
_Retcode = OK;
}
else
{
_Retcode = W_CODE;
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_read *
****************************************************************************/
BYTE mifs_read(BYTE _Adr, BYTE idata *_Data)
{
BYTE i;
BYTE _Status;
BYTE _Retcode;
BYTE idata _TempData[16];
TOGGLE_WD();
MCM_BCNTS = 16;
MCM_BCNTR = 128;
MCM_DATA = 0x30;
MCM_DATA = _Adr;
MCM_TOC = 10;//TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE | _PE | _CE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
if (_Status & _BE)
{
delay_50us(31); // min. 1.5 ms
i = MCM_DATA;
if (!(MCM_STACON & _DV))
{
if ((i & 0x0B) == 0x00)
{
_Retcode = W_NOTAUTH;
}
else
{
_Retcode = W_READ;
}
}
else
{
_Retcode = W_READ;
}
}
else
{
if (_Status & _PE)
{
_Retcode = W_PARITY;
}
else
{
_Retcode = W_CRC;
}
}
}
}
else
{
for (i = 0; i < 16; i++)
{
_Data[i] = MCM_DATA;
}
for (i = 0; i < 16; i++)
{
_TempData[i] = MCM_DATA;
}
if (memcmp(_Data, _TempData, 16))
{
_Retcode = W_BYTECNT;
}
else
{
_Retcode = OK;
}
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_write *
****************************************************************************/
BYTE mifs_write(BYTE _Adr, BYTE idata *_Data)
{
BYTE i;
BYTE _Status;
BYTE _Retcode;
TOGGLE_WD();
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xA0;
MCM_DATA = _Adr;
MCM_TOC = 10;//TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
_Retcode = W_BITCNT;
}
}
else
{
switch (MCM_DATA & 0x0B)
{
case 0x00:
_Retcode = W_NOTAUTH;
break;
case 0x01:
_Retcode = W_WRITE;
break;
case 0x0A:
_Retcode = OK;
break;
default:
_Retcode = W_CODE;
break;
}
if (_Retcode == OK)
{
MCM_BCNTS = 128;
MCM_BCNTR = 4;
for (i = 0; i < 16; i++)
{
MCM_DATA = _Data[i];
}
MCM_TOC = 16;//MEDIUM_TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_BE | _PE))
{
_Retcode = W_CODE;
}
else
{
MCM_TOC = 95;//LONG_TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
_Retcode = W_BITCNT;
}
}
else
{
switch (MCM_DATA & 0x0F)
{
case 0x0A:
_Retcode = OK;
break;
case 0x04:
case 0x05:
_Retcode = W_WRITE;
break;
default:
_Retcode = W_CODE;
break;
}
}
}
}
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_increment *
****************************************************************************/
BYTE mifs_increment(BYTE _Adr, BYTE idata *_Value)
{
BYTE _Status;
BYTE _Retcode;
TOGGLE_WD();
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xC1;
MCM_DATA = _Adr;
MCM_TOC = 10;//TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
_Retcode = W_BITCNT;
}
}
else
{
switch (MCM_DATA & 0x0B)
{
case 0x00:
_Retcode = W_NOTAUTH;
break;
case 0x0A:
_Retcode = OK;
break;
default:
_Retcode = W_INCR;
break;
}
}
if (_Retcode == OK)
{
MCM_BCNTS = 32;
MCM_BCNTR = 4;
MCM_TOC = 10;//TIMEOUT;
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value);
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (!(_Status & _TE))
{
if ((MCM_DATA & 0x0F) == 0x04)
{
_Retcode = W_EMPTY;
}
else
{
_Retcode = W_INCR;
}
}
else
{
_Retcode = OK;
}
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_decrement *
****************************************************************************/
BYTE mifs_decrement(BYTE _Adr, BYTE idata *_Value)
{
BYTE _Status;
BYTE _Retcode;
TOGGLE_WD();
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xC0;
MCM_DATA = _Adr;
MCM_TOC = 10;//TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
_Retcode = W_BITCNT;
}
}
else
{
switch (MCM_DATA & 0x0B)
{
case 0x00:
_Retcode = W_NOTAUTH;
break;
case 0x0A:
_Retcode = OK;
break;
default:
_Retcode = W_DECR;
break;
}
}
if (_Retcode == OK)
{
MCM_BCNTS = 32;
MCM_BCNTR = 4;
MCM_TOC = 10;//TIMEOUT;
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value);
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (!(_Status & _TE))
{
if ((MCM_DATA & 0x0F) == 0x04)
{
_Retcode = W_EMPTY;
}
else
{
_Retcode = W_DECR;
}
}
else
{
_Retcode = OK;
}
}
return (_Retcode);
}
/****************************************************************************
* Function: mifs_decrement_transfer *
****************************************************************************/
BYTE mifs_decrement_transfer(BYTE _Adr, BYTE idata *_Value)
{
BYTE _Status;
BYTE _Retcode;
TOGGLE_WD();
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xC0;
MCM_DATA = _Adr;
MCM_TOC = 10;//TIMEOUT;
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
_Retcode = W_BITCNT;
}
}
else
{
switch (MCM_DATA & 0x0B)
{
case 0x00:
_Retcode = W_NOTAUTH;
break;
case 0x0A:
_Retcode = OK;
break;
default:
_Retcode = W_DECR;
break;
}
}
if (_Retcode == OK)
{
MCM_BCNTS = 32;
MCM_BCNTR = 4;
MCM_TOC = 95;//LONG_TIMEOUT;
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value);
while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
if (_Status & _TE)
{
_Retcode = W_NOTAG;
}
else
{
_Retcode = W_BITCNT;
}
}
else
{
switch (MCM_DATA & 0x0F)
{
case 0x0A:
_Retcode = OK;
break;
case 0x04:
_Retcode = W_EMPTY;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -