📄 fm1715_test.c
字号:
}
//********************************************************************
//name:Clear_FIFO
//function: Clear the data in FIFO
//input:N/A
//output: TRUE, FIFO has been cleared
// FALSE, FIFO hasn't beend cleared
//********************************************************************
uchar Clear_FIFO(void)
{
uchar temp;
uint i;
temp=Control; //Clear FIFO
temp=(temp|0x01);
Control=temp;
for(i=0;i<RF_TimeOut;i++) //检查FIFO是否为空
{
temp=FIFO_Length;
if(temp==0)
{
return TRUE;
}
}
return FALSE;
}
//******************************************************************
//name: Write_FIFO
//function: write n bytes to FM1715's FIFO
//input: count , the data's length
// buff, point to the data that to be writen
//output: N/A
//******************************************************************
void Write_FIFO(uchar count,uchar idata *buff)
{
uchar i;
for(i=0;i<count;i++)
{
FIFO=*(buff+i);
}
}
//*****************************************************************
//name: Read_FIFO
//function: read data from FM1715's FIFO
//input: buff, 指向读出数据的指针
//output: N/A
//*****************************************************************
uchar Read_FIFO(uchar idata *buff)
{
uchar temp;
uchar i;
temp=FIFO_Length;
if(temp==0)
{
return 0;
}
if(temp>=24) //temp=255,会进入死循环,因此增加FIFO_length越界判断
{
temp=24;
}
for(i=0;i<temp;i++)
{
*(buff+i)=FIFO;
}
return temp;
}
//*****************************************************************
//name: MIF_Halt
//function: halt the mifare card
//input: N/A
//output: FM1715_OK : ack succeed
// FM1715_PARITYERR: parity verify error
// FM1715_CRCERR: CRC verify error
// FM1715_NOTAGERR: na card
//*****************************************************************
uchar MIF_Halt(void)
{
uchar temp;
CRCPresetLSB=0x63;
CWCondundancy=0x03;
ChannelRedundancy=0x03;
*buffer=RF_CMD_HALT;
*(buffer+1)=0x00;
temp=Command_Send(2,buffer,Transceive);
if(temp == FALSE)
{
return FM1715_OK;
}
else
{
temp = ErrorFlag;
if((temp&0x02)==0x02)
{
return(FM1715_PARITYERR);
}
if((temp&0x04)==0x04)
{
return(FM1715_FRAMINGERR);
}
return(FM1715_NOTAGERR);
}
}
//********************************************************************
//name: Load_key_CPY
//function: save E2's password to FM1715's keybuffer
//input: keybuffer: save key to this buffer
//output: TRUE: load key succeed
// FLASE: load key fail
//********************************************************************
uchar Load_key_CPY(void)
{
uchar temp,i;
uchar ln=0;
uchar hn=0;
for(i=0;i<6;i++) //change the key to RC531 format
{
ln=keybuffer[i]&0x0f; //low four bit
hn=keybuffer[i]>>4; //high four bit
buffer[i*2+1]=(~ln<<4)|ln;
buffer[i*2]=(~hn<<4)|hn;
}
temp=Command_Send(12,buffer,LoadKey);
temp=ErrorFlag&0x40;
if(temp==0x40)
{
return FALSE;
}
return TRUE;
}
//***********************************************************************
//name: Request
//function: response the card's request in FM1715's control range
//input: mode: ALL(monitor card in FM1715 control range)
// STD:(monitor the halt card in FM1715's control range)
//output: FM1715_NOTAGERR: no card
// FM1715_OK: ack succeed
// FM1715_REQERR: ack error
//************************************************************************
uchar Request(uchar mode)
{
uchar temp;
TxControl=0x58;
delay(1);
TxControl=0x5b;
CRCPresetLSB=0x63;
CWConductance=0x3f;
buffer[0]=mode; //select Request mode
Bit_Fram=0x07; //send 7 bit
ChannelRedundancy=0x03; //closed CRC
TxControl=0x5b;
Control=0x01; //mask CRYPT01 bit
temp=Command_Send(1,buffer,Transceive);
if(temp==FALSE)
{
return FM1715_NOTAGERR;
}
Read_FIFO(buffer); //read ack information from FIFO
tagtype[0]=buffer[0];
tagtype[1]=buffer[1];
return FM1715_OK;
}
//**************************************************************************
//name: AntiColl(void)
//function: anticollision for the card in FM1715's control range
//input: N/A
//output: FM1715_NOTAGERR: no card
// FM1715_BYTECOUNTERR: receive byte error
// FM1715_SERNRERR: card's serial ack error
// FM1715_OK: card ack succeed
//**************************************************************************
uchar AntiColl(void)
{
uchar temp;
uchar i;
uchar row,col;
uchar pre_row;
row=0;
col=0;
pre_row=0;
CRCPresetLSB=0x63;
CWConductance=0x3f;
ModConductance=0x3f;
buffer[0]=RF_CMD_ANTICOL;
buffer[1]=0x20;
ChannelRedundancy=0x03; //closed CRC,start parity
temp=Command_Send(2,buffer,Transceive);
while(1)
{
if(temp==0)
{
return FM1715_BYTECOUNTERR;
} ??????????????????????????
Read_FIFO(buffer);
Save_UID(row,col,temp); //save UID to UID array
Show_UID(); //show UID
temp=ErrorFlag; //
temp=temp&0x01;
if(temp==0x00)
{
temp=Check_UID();
if(temp==FALSE)
{
return(FM1715_SERNRERR);
}
return(FM1715_OK);
}
else
{
temp=CollPos; //read collision register
row=temp/8;
col=temp%8;
buffer[0]=RF_CMD_ANTICOL; //set the count that the data to be sent
pre_row=pre_row+row;
for(i=0;i<pre_row+1;i++)
{
buffer[i+2]=UID[i];
}
if(col!=0x00)
{
row=pre_row+1;
}
else
{
row=pre_row;
}
temp=Command_Send(row+2,buffer,Transceive);
}
}
}
//********************************************************************
//name: Select_Card
//function: Select the card in FM1715 control range
//input: N/A
//output: FM1715_NOTAGERR:no card
// FM1715_PARITYERR:parity error
// FM1715_CRCERR: CRC verify error
// FM1715_BTECOUNTERR: Receive byte error
// FM1715_OK: ack succeed
// FM1715_SELERR: select error
//*********************************************************************
uchar Select_Card(void)
{
uchar temp,i;
CRCPresetLSB=0x63;
CWConductanc=0x3f;
buffer[0]=RF_CMD_SELECT;
buffer[1]=0x70;
for(i=0;i<5;i++)
{
buffer[i+2]=UID[i];
}
ChannelRedundancy=0x0f;
temp=Command_Send(7,buffer,Transceive);
if(temp==FALSE)
{
return(FM1715_NOTAGERR):
}
else
{
temp=ErrorFlag;
if((temp&0x02)==0x02)
return(FM1715_PARITYERR);
if((temp&0x04)==0x04)
return(FM1715_FRAMINGERR);
if((temp&0x08)==0x08)
return(FM1715_CRCERR);
temp=FIFO_Length;
if(temp!=1)
return(FM1715_BYTECOUTNERR);
Read_FIFO(buffer); //Read FIFO information
temp=*buffer;
if((temp!=0) //check ack signal
return(FM1715_OK);
else
return(FM1715_SELERR);
}
}
//*************************************************************************
//name:Authentication
//function: password autherntication
//input: UID: card serial address
// SecNR: sector number
// mode: mode
//output: FM1715_NOTAGERR: no card
// FM1715_PARITYERR:parity error
// FM1715_CRCERR: CRC error
// FM1715_OK: ack succeed
// FM1715_AUTHERR: authentication error
//**************************************************************************
uchar Authenticatoin(uchar idata *UID,uchar SecNR, uchar mode)
{
uchar idata i;
uchar idata temp,temp1;
CRCPresetLSB=0x63;
CWCondunctance=0x3f;
ModConductance=0x3f;
temp1=Control
temp1=temp1&0xf7;
Control=temp1;
if(mode==1) //authentication
buffer[0]=RF_CMD_AUTH_LB;
else
buffer[0]=RF_CMD_AUTH_LA;
buffer[1]=SecNR*4 +3;
for(i=0;i<4;i++)
{
buffer[2+i]=UID[i];
}
ChannelRedundancy=0x0f; //start crc,parity verify
temp=Command_Send(6,buffer,Authent1);
if(temp==FALSE)
{
return FM1715_NOTAGERR;
}
temp=ErrorFlag;
if((temp&0x02)==0x02)
return FM1715_PARITY;
if((temp&0x04)==0x04)
return FM1715_FRAMINGERR;
if((temp&0x08)==0x08)
return FM17115_CRCERR;
temp=Command_Send(0,buffer,Authent2); //Authent2
if(temp==FALSE)
{
return FM1715_NOTAGERR;
}
temp=ErrorFlag;
if((temp&0x02)==0x02)
return FM1715_PARITYERR;
if((temp&0x04)==0x04)
return FM1715_FRAMINGERR;
if((temp&0x08)==0x08)
return FM1715_CRCERR;
temp1=Control;
temp1=temp1&0x08;
if(temp1==0x08)
{
return FMf1715_OK;
}
return FM1715_AUTHERR;
}
//*********************************************************************
//name:MIF_Read
//fucntion: read Mifare card block value
//input:buff: buffer headaddress
// Block_Adr: Block address
//output: FM1715_NOTAGERR: no card
// FM1715_PARITYERR: parity error
// FM1715_CRCERR: CRC verify error
// FM1715_BYTECOUNTERR: receive error
// FM1715_OK: Ack succeed
//**********************************************************************
uchar MIF_READ(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
CRCPresetLSB=0x63;
CWConductance=0x3f;
ModConductance=0x3f;
ChannelRedundancy=0x0f;
//Int_Req=0x7f;
buff[0]=RF_CMD_READ;
buff[1]=Block_Adr;
temp=Command_Send(2,buff,Transceive)(;
if(temp==0)
{
return FM1715_NOTAGERR;
}
temp=ErrorFlag;
if((temp&0x02)==0x02) return FM1715_PARITYERR;
if((temp&0x04)==0x04) return FM1715_FRAMINGERR;
if((temp&0x08==0x08) return FM1715_CRCERR;
temp=FIFO_Length;
if(temp==0x10) //8k card read data length is 16
{
Read_FIFO(buff);
return FM1715_OK;
}
else if(temp==0x04) //Token card read data length is 16
{
Read_FIFO(buff);
return FM1715_OK;
}
else
{
return FM1715_BYTECOUNTERR;
}
}
//***********************************************************************
//name: MIF_Write
//function: write data to Mifare card's block
//input: buff: buffer headaddress
// Block_Adr:Block address
//output: FM1715_NOTAGERR: no card
// FM1715_BYTECOUNTERR: receive byte error
// FM1715_NOTAUTHERR: not authentication
// FM1715_EMPTY: data overflow error
// FM1715_CRCERR: CRC verify error
// FM1715_PARITYERR: parity verify erro
// FM1715_WRITEERR: write block error
// FM1715_OK: ack succeed
//*************************************************************************
uchar
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -