📄 rc531.c
字号:
/* SecNR: 扇区号 */
/* mode: 模式 */
/*输出: */
/* FM222_NOTAGERR: 无卡 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_OK: 应答正确 */
/* FM222_AUTHERR: 权威认证有错 */
/********************************************************************************************************/
uchar Authentication(uchar idata *UID,uchar SecNR,uchar mode)
{
uchar idata i;
uchar idata temp,temp1;
temp1=Control;
temp1=temp1 & 0xf7;
Control=temp1;
if (mode==1) //AUTHENT1
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; //开启CRC,奇偶校验校验
temp=Command_Send(6,buffer,Authent1);
if (temp==FALSE)
return(FM222_NOTAGERR);
temp=ErrorFlag;
if ((temp & 0x02)==0x02)
return(FM222_PARITYERR);
if((temp & 0x04)==0x04)
return(FM222_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(FM222_CRCERR);
temp=Command_Send(0,buffer,Authent2); //AUTHENT2
if(temp==FALSE)
return(FM222_NOTAGERR);
temp=ErrorFlag;
if ((temp & 0x02)==0x02)
return(FM222_PARITYERR);
if((temp & 0x04)==0x04)
return(FM222_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(FM222_CRCERR);
temp1=Control;
temp1=temp1 & 0x08; //Crypto1on=1,验证通过
if (temp1==0x08)
return(FM222_OK);
else
return(FM222_AUTHERR);
}
/********************************************************************************************************/
/*名称: MIF_Read */
/*功能: 该函数实现读MIFARE卡块的数值 */
/* */
/*输入: */
/* buff: 缓冲区首地址 */
/* Block_Adr: 块地址 */
/*输出: */
/* FM222_NOTAGERR: 无卡 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_BYTECOUNTERR: 接收字节错误 */
/* FM222_OK: 应答正确 */
/********************************************************************************************************/
uchar MIF_READ(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
ChannelRedundancy=0x0f;
//Int_Req=0x7f;
buff[0]=RF_CMD_READ;
buff[1]=Block_Adr;
temp=Command_Send(2,buff,Transceive);
if (temp==0)
return(FM222_NOTAGERR);
temp=ErrorFlag;
if ((temp & 0x02)==0x02)
return(FM222_PARITYERR);
if((temp & 0x04)==0x04)
return(FM222_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(FM222_CRCERR);
temp=FIFO_Length;
if (temp!=0x10)
return(FM222_BYTECOUNTERR);
Read_FIFO(buff);
return(FM222_OK);
}
/********************************************************************************************************/
/*名称: MIF_Write */
/*功能: 该函数实现写MIFARE卡块的数值 */
/* */
/*输入: */
/* buff: 缓冲区首地址 */
/* Block_Adr: 块地址 */
/*输出: */
/* FM222_NOTAGERR: 无卡 */
/* FM222_BYTECOUNTERR: 接收字节错误 */
/* FM222_NOTAUTHERR: 未经权威认证 */
/* FM222_EMPTY: 数据溢出错误 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_WRITEERR: 写卡块数据出错 */
/* FM222_OK: 应答正确 */
/********************************************************************************************************/
uchar MIF_Write(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
uchar idata *F_buff;
F_buff=buff+0x10;
ChannelRedundancy=0x0f;
*F_buff=RF_CMD_WRITE;
*(F_buff+1)=Block_Adr;
temp=Command_Send(2,F_buff,Transceive);
if (temp==FALSE)
return(FM222_NOTAGERR);
temp=FIFO_Length;
if (temp==0)
return(FM222_BYTECOUNTERR);
Read_FIFO(F_buff);
temp=*F_buff;
switch(temp)
{
case 0x00 :
return(FM222_NOTAUTHERR);
case 0x04:
return(FM222_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM222_CRCERR);
case 0x05:
return(FM222_PARITYERR);
default:
return(FM222_WRITEERR);
}
temp=Command_Send(16,buff,Transceive);
if (temp==TRUE)
return(FM222_OK);
else
{
temp=ErrorFlag;
if ((temp & 0x02)==0x02)
return(FM222_PARITYERR);
else if((temp & 0x04)==0x04)
return(FM222_FRAMINGERR);
else if ((temp & 0x08)==0x08)
return(FM222_CRCERR);
else
return(FM222_WRITEERR);
}
}
/********************************************************************************************************/
/*名称: MIF_Halt */
/*功能: 该函数实现暂停MIFARE卡 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* FM222_OK: 应答正确 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_NOTAGERR: 无卡 */
/********************************************************************************************************/
uchar MIF_Halt(void)
{
uchar temp;
ChannelRedundancy=0x03;
*buffer=RF_CMD_HALT;
*(buffer+1)=0x00;
temp=Command_Send(2,buffer,Transmit);
if (temp==TRUE)
return(FM222_OK);
else
{
temp=ErrorFlag;
if ((temp & 0x02)==0x02)
return(FM222_PARITYERR);
if ((temp & 0x04)==0x04)
return(FM222_FRAMINGERR);
return(FM222_NOTAGERR);
}
}
/********************************************************************************************************/
/*名称: MIF_Initival */
/*功能: 该函数实现MIFARE卡初始化值操作 */
/* */
/*输入: */
/* buff: 四个字节初始化数值起始地址 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* FM222_NOTAGERR: 无卡 */
/* FM222_BYTECOUNTERR: 接收字节错误 */
/* FM222_NOTAUTHERR: 未经权威认证 */
/* FM222_EMPTY: 数据溢出错误 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_WRITEERR: 写卡块数据出错 */
/* FM222_OK: 应答正确 */
/********************************************************************************************************/
uchar MIF_Initival(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
uchar i;
for (i=0;i<4;i++)
*(buff+4+i)=~(*(buff+i));
for (i=0;i<4;i++)
*(buff+8+i)=*(buff+i);
*(buff+12)=Block_Adr;
*(buff+13)=~Block_Adr;
*(buff+14)=Block_Adr;
*(buff+15)=~Block_Adr;
temp=MIF_Write(buff,Block_Adr);
return(temp);
}
/********************************************************************************************************/
/*名称: MIF_Increment */
/*功能: 该函数实现MIFARE卡自动增值操作 */
/* */
/*输入: */
/* buff: 四个字节数值起始地址 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* FM222_NOTAGERR: 无卡 */
/* FM222_BYTECOUNTERR: 接收字节错误 */
/* FM222_NOTAUTHERR: 未经权威认证 */
/* FM222_EMPTY: 数据溢出错误 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_INCRERR: 卡片增款操作失败 */
/* FM222_OK: 应答正确 */
/********************************************************************************************************/
uchar MIF_Increment(uchar idata *buff,uchar Block_Adr)
{
uchar temp;
uchar idata *F_buff;
F_buff=buff+4;
*F_buff=RF_CMD_INC;
*(F_buff+1)=Block_Adr;
ChannelRedundancy=0x0f;
temp=Command_Send(2,F_buff,Transceive);
if (temp==FALSE)
return(FM222_NOTAGERR);
temp=FIFO_Length;
if (temp==0)
return(FM222_BYTECOUNTERR);
Read_FIFO(F_buff);
temp=*F_buff;
switch(temp)
{
case 0x00 :
return(FM222_NOTAUTHERR);
case 0x04:
return(FM222_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM222_CRCERR);
case 0x05:
return(FM222_PARITYERR);
default:
return(FM222_INCRERR);
}
temp=Command_Send(4,buff,Transmit);
if (temp==FALSE)
return(FM222_INCRERR);
return(FM222_OK);
}
/********************************************************************************************************/
/*名称: MIF_Decrement */
/*功能: 该函数实现MIFARE卡自动减值操作 */
/* */
/*输入: */
/* buff: 四个字节数值起始地址 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* FM222_NOTAGERR: 无卡 */
/* FM222_BYTECOUNTERR: 接收字节错误 */
/* FM222_NOTAUTHERR: 未经权威认证 */
/* FM222_EMPTY: 数据溢出错误 */
/* FM222_CRCERR: CRC校验错 */
/* FM222_PARITYERR: 奇偶校验错 */
/* FM222_DECRERR: 卡片扣款操作失败 */
/* FM222_OK: 应答正确 */
/********************************************************************************************************/
uchar MIF_Decrement(uchar idata *buff,uchar Block_Adr)
{
uchar temp;
uchar idata *F_buff;
F_buff=buff+4;
*F_buff=RF_CMD_DEC;
*(F_buff+1)=Block_Adr;
ChannelRedundancy=0x0f;
temp=Command_Send(2,F_buff,Transceive);
if (temp==FALSE)
return(FM222_NOTAGERR);
temp=FIFO_Length;
if (temp==0)
return(FM222_BYTECOUNTERR);
Read_FIFO(F_buff);
temp=*F_buff;
switch(temp)
{
case 0x00 :
return(FM222_NOTAUTHERR);
case 0x04:
return(FM222_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM222_CRCERR);
case 0x05:
return(FM222_PARITYERR);
default:
return(FM222_DECRERR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -