📄 main.#3
字号:
MInfo.nBytesToSend = 4;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status == MI_OK) // no timeout occured
{
if (MInfo.nBitsReceived != 4) // bits are necessary
{
status = MI_BITCOUNTERR;
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
switch(MRcvBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
status = MI_OK; ///////////////////////////////////////add
}
}
else if(status == MI_NOTAGERR){
status = MI_OK; // no response after 4 byte value -
// transfer command has to follow
// SendData("time out add value?");
}
// else { return status;}
}
/////3///////////////////////////////////////////////////////////
if ( status == MI_OK)
{
// SendData("how to run this"); //I see
// PcdSetTmo(2); /////////////////////////////////////////////
ResetInfo();
MSndBuffer[0] = PICC_TRANSFER; // transfer command code
MSndBuffer[1] = trans_addr;
MInfo.nBytesToSend = 2;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status != MI_NOTAGERR) // timeout occured
{
if (MInfo.nBitsReceived != 4) // 4 bits are necessary
{
status = MI_BITCOUNTERR;
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
// switch(MRcvBuffer[0])
// {
// case 0x00:
// status = MI_NOTAUTHERR;
// break;
// case 0x0a:
status = MI_OK;
// break;
// case 0x01:
// status = MI_VALERR;
// break;
// default:
// status = MI_CODEERR;
// break;
// }
}
}
PcdSetTmo(2); ////////////////////////////////////////////short timeout
}
////////////////////////////////////////////////////////////
return status;
}
/*
///////////////////////////////////////////////////////////////////////
// V A L U E MANIPULATION W I T H BACKUP
///////////////////////////////////////////////////////////////////////
char Mf500PiccValueDebit(unsigned char dd_mode,
unsigned char addr,
unsigned char *value)
{
char status = MI_OK;
PcdSetTmo(2);
ResetInfo();
MSndBuffer[0] = dd_mode; // Inc,Dec command code
MSndBuffer[1] = addr;
MInfo.nBytesToSend = 2;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status != MI_NOTAGERR) // no timeout error
{
if (MInfo.nBitsReceived != 4) // 4 bits are necessary
{
status = MI_BITCOUNTERR;
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
switch(MRcvBuffer[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)
{
PcdSetTmo(4); // long timeout
ResetInfo();
memcpy(MSndBuffer,value,4);
MInfo.nBytesToSend = 4;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status == MI_OK) // no timeout occured
{
if (MInfo.nBitsReceived != 4) // 4 bits are necessary
{
status = MI_BITCOUNTERR;
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
switch(MRcvBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x0a:
status = MI_OK;
break;
case 0x05:
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
}
}
return status;
}
*/
/****************************************************************************
* *
* Function: Mf500PiccHalt *
* *
* Input: - *
* Output: - *
* *
****************************************************************************/
char Mf500PiccHalt(void)
{
char status = MI_CODEERR;
PcdSetTmo(2);
ResetInfo();
MSndBuffer[0] = PICC_HALT ; // Halt command code
MSndBuffer[1] = 0x00; // dummy address
MInfo.nBytesToSend = 2;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
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
WriteRC(RegCommand,PCD_IDLE);
return status;
}
void SetBitMask(unsigned int reg,unsigned char mask)
{
unsigned int idata reg1;
unsigned char mask1;
reg1=reg;
mask1=mask;
XBYTE[reg1] |= mask1; // clear bit mask
}
void ClearBitMask(unsigned int reg,unsigned char mask)
{
unsigned char mask1;
mask1=mask;
XBYTE[reg] &= ~mask1; // clear bit mask
}
void FlushFIFO(void)
{
SetBitMask(RegControl,0x01);
}
void WriteRC(unsigned int Address, unsigned char value)
{
XBYTE[Address]=value; // write value at the specified
}
unsigned char ReadRC(unsigned int Address)
{
Returnval=XBYTE[Address]; // read value at the specified
return(Returnval); // address
}
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void PcdSetTmo(unsigned char tmoLength)
{
switch(tmoLength)
{ // timer clock frequency 13,56 MHz
case 1: // short timeout (1,0 ms)
WriteRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128选择定时器的分频值 如果TAutoRestart设置为1,定时器从
//TReloadValue处自动重新开始向下计数,而不是向下计数到零
WriteRC(RegTimerReload,0x6a);// TReloadVal = 'h6a =106(dec)
break;
case 2: // medium timeout (1,5 ms)
WriteRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
WriteRC(RegTimerReload,0xa0);// TReloadVal = 'ha0 =160(dec)
break;
case 3: // long timeout (6 ms)
WriteRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
WriteRC(RegTimerReload,0xa0);// TReloadVal = 'ha0 =160(dec)
break;
case 4: // long timeout (9.6 ms)
WriteRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
WriteRC(RegTimerReload,0xff);// TReloadVal = 'ff =255(dec)
break;
case 5:
WriteRC(RegTimerClock,0x01); // TAutoRestart=0,TPrescale=4*128
WriteRC(RegTimerReload,0xff);// TReloadVal = 'ff =255(dec)
default: // short timeout (1,0 ms)
WriteRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
WriteRC(RegTimerReload,tmoLength);// TReloadVal = tmoLength
break;
}
}
char PcdRfReset(unsigned int nms)
{
char status = MI_OK;
ClearBitMask(RegTxControl,0x03); // Tx2RF-En, Tx1RF-En disablen
if (nms > 0)
{
nms=1000*nms;
Delay(nms);
SetBitMask(RegTxControl,0x03);
}
return status;
}
void ResetInfo(void)
{
MInfo.cmd = 0;
MInfo.status = MI_OK;
MInfo.irqSource = 0;
MInfo.nBytesSent = 0;
MInfo.nBytesToSend = 0;
MInfo.nBytesReceived = 0;
MInfo.nBitsReceived = 0;
MInfo.collPos = 0;
}
char PcdSingleResponseCmd(unsigned char cmd)
{
int i;
char status = MI_OK;
char tmpStatus ;
unsigned char lastBits;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char timerCtl = 0x00;
WriteRC(RegInterruptEn,0x7F); // disable all interrupts
WriteRC(RegInterruptRq,0x7F); // reset interrupt requests
WriteRC(RegCommand,PCD_IDLE); // terminate probably running command
FlushFIFO(); // flush FIFO buffer
// save info structures to module pointers
/* MInfo.cmd=MInfo.cmd;
MInfo.status=MInfo.status;
MInfo.irqSource=MInfo.irqSource;
MInfo.nBytesSent=MInfo.nBytesSent;
MInfo.nBytesToSend=MInfo.nBytesToSend;
MInfo.nBytesReceived=MInfo.nBytesReceived;
MInfo.nBitsReceived=MInfo.nBitsReceived;
MInfo.collPos=MInfo.collPos; */
haveset=1;
// initialising the ISR-Function pointer for mifare
// protocol - do this after initialising the MpXXXX variables
MInfo.irqSource = 0x0; // reset interrupt flags
// depending on the command code, appropriate interrupts are enabled (irqEn)
// and the commit interrupt is choosen (waitFor).
switch(cmd)
{
case PCD_IDLE: // nothing else required
irqEn = 0x00;
waitFor = 0x00;
break;
case PCD_WRITEE2: // LoAlert and TxIRq
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_READE2: // HiAlert, LoAlert and IdleIRq
irqEn = 0x07;
waitFor = 0x04;
break;
case PCD_LOADCONFIG: // IdleIRq and LoAlert
case PCD_LOADKEYE2:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -