📄 lll_msr.c
字号:
* *
****************************************************************************/
uchar mifs_read(uchar _Adr, uchar idata *_Data)
{
uchar i;
uchar _Status;
uchar _Retcode;
uchar idata _TempData[16];
uint delaytime;
TOGGLE_WD();
MCM_CS=0;
MCM_BCNTS = 16;
MCM_BCNTR = 128;
MCM_DATA = 0x30;
MCM_DATA = _Adr;
MCM_TOC = TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
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
{
INT1 = 0; //blue on
T1 =0; //beep on
for(delaytime =0;delaytime<25000;delaytime++)_nop_();
T1 =1;
INT1 =1;
_Retcode = OK;
}
}
MCM_CS=1;
return (_Retcode);
}
/****************************************************************************
* *
* Function: mifs_write *
* *
* Input: Adr, Data *
* Output: - *
* *
****************************************************************************/
uchar mifs_write(uchar _Adr, uchar idata *_Data)
{
uchar i;
uchar _Status;
uchar _Retcode;
TOGGLE_WD();
MCM_CS=0;
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xA0;
MCM_DATA = _Adr;
MCM_TOC = TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
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 = MEDIUM_TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
MCM_TOC = 0;
if (_Status & (_BE | _PE))
{
_Retcode = W_CODE;
}
else
{
MCM_TOC = LONG_TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
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;
}
}
}
}
}
MCM_CS=1;
return (_Retcode);
}
/****************************************************************************
* *
* Function: mifs_increment *
* *
* Input: Adr, Value *
* Output: - *
* *
****************************************************************************/
uchar mifs_increment(uchar _Adr, uchar idata *_Value)
{
uchar _Status;
uchar _Retcode;
TOGGLE_WD();
MCM_CS=0;
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xC1;
MCM_DATA = _Adr;
MCM_TOC = TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
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 = TIMEOUT;
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value);
while (!((_Status = MCM_STACON) & _DV));
MCM_TOC = 0;
if (!(_Status & _TE))
{
if ((MCM_DATA & 0x0F) == 0x04)
{
_Retcode = W_EMPTY;
}
else
{
_Retcode = W_INCR;
}
}
else
{
_Retcode = OK;
}
}
MCM_CS=1;
return (_Retcode);
}
/****************************************************************************
* *
* Function: mifs_decrement *
* *
* Input: Adr, Value *
* Output: - *
* *
****************************************************************************/
uchar mifs_decrement(uchar _Adr, uchar idata *_Value)
{
uchar _Status;
uchar _Retcode;
TOGGLE_WD();
MCM_CS=0;
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xC0;
MCM_DATA = _Adr;
MCM_TOC = TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
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 = TIMEOUT;
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value);
while (!((_Status = MCM_STACON) & _DV));
MCM_TOC = 0;
if (!(_Status & _TE))
{
if ((MCM_DATA & 0x0F) == 0x04)
{
_Retcode = W_EMPTY;
}
else
{
_Retcode = W_DECR;
}
}
else
{
_Retcode = OK;
}
}
MCM_CS=1;
return (_Retcode);
}
/****************************************************************************
* *
* Function: mifs_decrement_transfer *
* *
* Input: Adr, Value *
* Output: - *
* *
****************************************************************************/
uchar mifs_decrement_transfer(uchar _Adr, uchar idata *_Value)
{
uchar _Status;
uchar _Retcode;
TOGGLE_WD();
MCM_CS=0;
MCM_BCNTS = 16;
MCM_BCNTR = 4;
MCM_DATA = 0xC0;
MCM_DATA = _Adr;
MCM_TOC = TIMEOUT;
while (!((_Status = MCM_STACON) & _DV));
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 = LONG_TIMEOUT;
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value++);
MCM_DATA = *(_Value);
while (!((_Status = MCM_STACON) & _DV));
MCM_TOC = 0;
if (_Status & (_TE | _BE))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -