📄 rc531.c
字号:
/* RC531_CRCERR: CRC校验错 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_WRITEERR: 写卡块数据出错 */
/* RC531_OK: 应答正确 */
/********************************************************************************************************/
char MIF_Write(char *buff,char Block_Adr)
{
char temp;
char *F_buff;
F_buff=buff+0x10;
rc531_register_write(ChannelRedundancy,0x0f);
*F_buff=RF_CMD_WRITE;
*(F_buff+1)=Block_Adr;
temp=Command_Send(2,F_buff,Transceive);
if (temp==FALSE)
return(RC531_NOTAGERR);
temp=rc531_register_read(FIFO_Length);
if (temp==0)
return(RC531_BYTECOUNTERR);
Read_FIFO(F_buff);
temp=*F_buff;
switch(temp)
{
case 0x00 :
return(RC531_NOTAUTHERR);
case 0x04:
return(RC531_EMPTY);
case 0x0a:
break;
case 0x01:
return(RC531_CRCERR);
case 0x05:
return(RC531_PARITYERR);
default:
return(RC531_WRITEERR);
}
temp=Command_Send(16,buff,Transceive);
if (temp==TRUE)
return(RC531_OK);
else
{
temp=rc531_register_read(ErrorFlag);
if ((temp & 0x02)==0x02)
return(RC531_PARITYERR);
else if((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
else if ((temp & 0x08)==0x08)
return(RC531_CRCERR);
else
return(RC531_WRITEERR);
}
}
/********************************************************************************************************/
/*名称: MIF_Halt */
/*功能: 该函数实现暂停MIFARE卡 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* RC531_OK: 应答正确 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_CRCERR: CRC校验错 */
/* RC531_NOTAGERR: 无卡 */
/********************************************************************************************************/
char MIF_Halt(void)
{
char temp;
rc531_register_write(ChannelRedundancy,0x03);
*buffer=RF_CMD_HALT;
*(buffer+1)=0x00;
temp=Command_Send(2,buffer,Transmit);
if (temp==TRUE)
return(RC531_OK);
else
{
temp=rc531_register_read(ErrorFlag);
if ((temp & 0x02)==0x02)
return(RC531_PARITYERR);
if ((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
return(RC531_NOTAGERR);
}
}
/********************************************************************************************************/
/*名称: MIF_Initival */
/*功能: 该函数实现MIFARE卡初始化值操作 */
/* */
/*输入: */
/* buff: 四个字节初始化数值起始地址 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_BYTECOUNTERR: 接收字节错误 */
/* RC531_NOTAUTHERR: 未经权威认证 */
/* RC531_EMPTY: 数据溢出错误 */
/* RC531_CRCERR: CRC校验错 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_WRITEERR: 写卡块数据出错 */
/* RC531_OK: 应答正确 */
/********************************************************************************************************/
char MIF_Initival(char *buff,char Block_Adr)
{
char temp;
char 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_private */
/*功能: 该函数实现MIFARE卡初始化值操作 */
/* */
/*输入: */
/* SecNR:需设置密码和数据格式的扇区号 */
/* */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_BYTECOUNTERR: 接收字节错误 */
/* RC531_NOTAUTHERR: 未经权威认证 */
/* RC531_EMPTY: 数据溢出错误 */
/* RC531_CRCERR: CRC校验错 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_WRITEERR: 写卡块数据出错 */
/* RC531_OK: 应答正确 */
/********************************************************************************************************/
char MIF_private(char SecNR)
{
char i,temp;
char Key[12],Access_Bytes[16];
for(i=0;i<6;i++)
{ Access_Bytes[i]=0x00;
Access_Bytes[10+i]=0xff;
}
Access_Bytes[6]=0x80;
Access_Bytes[7]=0xf7;
Access_Bytes[8]=0x87;
Access_Bytes[9]=0x00;
for(i=0;i<12;i++)
{
Key[i]=0x0f; //key=key_Set_In_Factory
}
temp=Load_key_CPY(Key);
if(temp!=1)
return(RC531_LOADKEYERR);
temp=Authentication(UID,SecNR,0);
if(temp!=0)
return(temp);
temp=MIF_Write(Access_Bytes,(SecNR*4+3));
if(temp!=0)
return(temp);
temp=MIF_Halt();
if(temp!=0)
return(temp);
return(RC531_OK);
}
/********************************************************************************************************/
/*名称: HL_Initial */
/*功能: 该函数实现高级初始化命令 */
/* */
/*输入: */
/* buff: 待写入初始化数据的首地址 */
/* Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* 操作状态码 */
/********************************************************************************************************/
char HL_Initial(char *buff,char Block_Adr,char Mode)
{
char temp;
Secnr=Block_Adr/4;
//Halt
MIF_Halt();
//Request
temp=Request(RF_CMD_REQUEST_ALL );
if(temp!=RC531_OK)
return(RC531_REQERR);
//AntiCol and Select
temp=AntiColl();
if(temp!=RC531_OK)
return(RC531_ANTICOLLERR);
temp=Select_Card();
if(temp!=RC531_OK)
return(RC531_SELERR);
//LoadKey
Load_keyE2_CPY(Secnr,Mode);
//Authentication
temp=Authentication(UID,Secnr,Mode);
if(temp!=RC531_OK)
return(RC531_AUTHERR);
//Initial
temp=MIF_Initival(buff,Block_Adr);
if(temp!=RC531_OK)
return(RC531_INTIVALERR);
//Halt
MIF_Halt();
return(RC531_OK);
}
/********************************************************************************************************/
/*名称: HL_Read */
/*功能: 该函数实现高级读命令 */
/* */
/*输入: */
/* Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* 操作状态码 */
/* 读出数据存于buffer中 */
/********************************************************************************************************/
char HL_Read(char *buff,char Block_Adr,char Mode)
{
char temp;
Secnr=Block_Adr/4;
//Halt
MIF_Halt();
//Request
temp=Request(RF_CMD_REQUEST_STD);
if(temp!=RC531_OK)
return(RC531_REQERR);
//AntiCol and Select
temp=AntiColl();
if(temp!=RC531_OK)
return(RC531_ANTICOLLERR);
temp=Select_Card();
if(temp!=RC531_OK)
return(RC531_SELERR);
//LoadKey
Load_keyE2_CPY(Secnr,Mode);
//Authentication
temp=Authentication(UID,Secnr,Mode);
if(temp!=RC531_OK)
return(RC531_AUTHERR);
//Read
temp=MIF_READ(buff,Block_Adr);
//Halt
MIF_Halt();
if(temp!=RC531_OK)
return(RC531_READERR);
else
return(RC531_CMD_ERR);
}
/********************************************************************************************************/
/*名称: HL_Write */
/*功能: 该函数实现高级写命令 */
/* */
/*输入: */
/* buff: 待写入数据的首地址 */
/* Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/* */
/*输出: */
/* 操作状态码 */
/********************************************************************************************************/
char HL_Write(char *buff,char Block_Adr,char Mode)
{
char temp;
Secnr=Block_Adr/4;
//Halt
MIF_Halt();
//Request
temp=Request(RF_CMD_REQUEST_STD );
if(temp!=RC531_OK)
return(RC531_REQERR);
//AntiCol and Select
temp=AntiColl();
if(temp!=RC531_OK)
return(RC531_ANTICOLLERR);
temp=Select_Card();
if(temp!=RC531_OK)
return(RC531_SELERR);
//LoadKey
Load_keyE2_CPY(Secnr,Mode);
//Authentication
temp=Authentication(UID,Secnr,Mode);
if(temp!=RC531_OK)
return(RC531_AUTHERR);
//Write
temp=MIF_Write(buff,Block_Adr);
//Halt
MIF_Halt();
if(temp!=RC531_OK)
return(RC531_WRITEERR);
else
return(RC531_CMD_ERR);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -