📄 rc531.c
字号:
row=temp/8;
col=temp%8;
buffer[0]=RF_CMD_ANTICOL;
Set_BitFraming(row+pre_row,col); //设置待发送数据的字节数
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);
}
}
}
/********************************************************************************************************/
/*名称: Select_Card */
/*功能: 该函数实现对放入RC531操作范围之内的某张卡片进行选择 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_CRCERR: CRC校验错 */
/* RC531_BYTECOUNTERR: 接收字节错误 */
/* RC531_OK: 应答正确 */
/* RC531_SELERR: 选卡出错 */
/********************************************************************************************************/
char Select_Card(void)
{
char temp,i;
buffer[0]=RF_CMD_SELECT;
buffer[1]=0x70;
for(i=0;i<5;i++)
buffer[i+2]=UID[i];
rc531_register_write(ChannelRedundancy,0x0f); //开启CRC,奇偶校验校验
temp=Command_Send(7,buffer,Transceive);
if(temp==FALSE)
return(RC531_NOTAGERR);
else
{
temp=rc531_register_read(ErrorFlag);
if ((temp & 0x01)==0x01)
return(RC531_COLLERR);
if ((temp & 0x02)==0x02)
return(RC531_PARITYERR);
if((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(RC531_CRCERR);
temp=rc531_register_read(FIFO_Length);
if (temp!=1)
return(RC531_BYTECOUNTERR);
Read_FIFO(buffer); //从FIFO中读取应答信息
if (*buffer==SAK_BYTE0 || *buffer==SAK_BYTE1) //判断应答信号是否正确
return(RC531_OK);
else
return(RC531_SELERR);
}
}
/********************************************************************************************************/
/*名称: Read_E2 */
/*功能: 该函数实现从RC531的EE中读出数据 */
/* */
/*输入: */
/* lsb, EE地址(低字节) */
/* msb, EE地址(高字节) */
/* count, 待读出数据EE的字节个数 */
/* buff, 指向待读出数据的指针 */
/* */
/*输出: */
/* TRUE, EE数据正确读出 */
/* FALSE, EE数据读出有误 */
/********************************************************************************************************/
char Read_E2(char lsb,char msb,char count,char *buff)
{
char temp;
*buff=lsb;
*(buff+1)=msb;
*(buff+2)=count;
temp=Command_Send(3,buff,ReadE2);
Read_FIFO(buff);
return(temp);
}
/********************************************************************************************************/
/*名称: Write_E2 */
/*功能: 该函数实现向RC531的EE中写入数据 */
/* */
/*输入: */
/* lsb, EE地址(低字节) */
/* msb, EE地址(高字节) */
/* count, 待写入数据EE的字节个数 */
/* buff, 指向待写入数据的指针 */
/* */
/*输出: */
/* TRUE, EE数据正确写入 */
/* FALSE, EE数据写入有误 */
/********************************************************************************************************/
char Write_E2(char lsb,char msb,char count,char *buff)
{
char temp,i;
for(i=0;i<count;i++)
*(buff+count-i+2)=*(buff-i+count);
*buff=lsb;
*(buff+1)=msb;
temp=Command_Send(count+2,buff,WriteE2);
temp=rc531_register_read(SecondaryStatus);
temp=temp & 0x40;
if (temp==0x40)
return(TRUE);
else
return(FALSE);
}
/********************************************************************************************************/
/*名称: Load_key_CPY */
/*功能: 该函数实现把FIFO中的密码存入rc531的keybuffer中 */
/* */
/*输入: */
/* keybuff: 密码首地址 */
/* */
/*输出: */
/* TRUE: 密钥装载成功 */
/* FALSE: 密钥装载失败 */
/********************************************************************************************************/
char Load_key_CPY(char *keybuff)
{
char temp;
temp=Command_Send(12,keybuff,LoadKey);
temp=(rc531_register_read(ErrorFlag)) & 0x40;
if (temp==0x40)
return(FALSE);
return(TRUE);
}
/********************************************************************************************************/
/*名称: Load_keyE2 */
/*功能: 该函数实现把E2中密码存入rc531的keybuffer中 */
/* */
/*输入: */
/* Secnr: EE起始地址 */
/* */
/*输出: */
/* True: 密钥装载成功 */
/* False: 密钥装载失败 */
/********************************************************************************************************/
char Load_keyE2_CPY(char Secnr,char Mode)
{
char temp;
char msb=0;
char lsb=0;
temp = Secnr * 12;
if (Mode==0)
{
if (temp>=0x80) //计算密码存放地址
{
lsb=temp-0x80;
msb=0x01;
}
else
{
msb=0x00;
lsb=temp+0x80;
}
}
else
{
msb=0x01;
lsb=temp+0x40;
}
buffer[0]=lsb;
buffer[1]=msb;
temp=Command_Send(2,buffer,LoadKeyE2);
temp=(rc531_register_read(ErrorFlag)) & 0x40;
if (temp==0x40)
return(FALSE);
return(TRUE);
}
/********************************************************************************************************/
/*名称: Authentication */
/*功能: 该函数实现密码认证的过程 */
/* */
/*输入: */
/* UID: 卡片序列号地址 */
/* SecNR: 扇区号 */
/* mode: 模式 */
/* 0 : KeyA */
/* 1 : KeyB */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_CRCERR: CRC校验错 */
/* RC531_OK: 应答正确 */
/* RC531_AUTHERR: 权威认证有错 */
/********************************************************************************************************/
char Authentication(char *UID,char SecNR,char mode)
{
char i;
char temp,temp1;
temp1=rc531_register_read(Control);
temp1=temp1 & 0xf7;
rc531_register_write(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];
rc531_register_write(ChannelRedundancy,0x0f); //开启CRC,奇偶校验校验
temp=Command_Send(6,buffer,Authent1);
if (temp==FALSE)
return(RC531_NOTAGERR);
temp=rc531_register_read(ErrorFlag);
if ((temp & 0x01)==0x01)
return(RC531_COLLERR);
if ((temp & 0x02)==0x02)
return(RC531_PARITYERR);
if ((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(RC531_CRCERR);
temp=Command_Send(0,buffer,Authent2); //AUTHENT2
if(temp==FALSE)
return(RC531_NOTAGERR);
temp=rc531_register_read(ErrorFlag);
if ((temp & 0x01)==0x01)
return(RC531_COLLERR);
if ((temp & 0x02)==0x02)
return(RC531_PARITYERR);
if ((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(RC531_CRCERR);
temp1=rc531_register_read(Control);
temp1=temp1 & 0x08; //Crypto1on=1,验证通过
if (temp1==0x08)
return(RC531_OK);
else
return(RC531_AUTHERR);
}
/********************************************************************************************************/
/*名称: MIF_Read */
/*功能: 该函数实现读MIFARE卡块的数值 */
/* */
/*输入: */
/* buff: 缓冲区首地址 */
/* Block_Adr: 块地址 */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_PARITYERR: 奇偶校验错 */
/* RC531_CRCERR: CRC校验错 */
/* RC531_BYTECOUNTERR: 接收字节错误 */
/* RC531_OK: 应答正确 */
/********************************************************************************************************/
char MIF_READ(char *buff,char Block_Adr)
{
char temp;
rc531_register_write(ChannelRedundancy,0x0f);
//Int_Req=0x7f;
buff[0]=RF_CMD_READ;
buff[1]=Block_Adr;
temp=Command_Send(2,buff,Transceive);
if (temp==0)
return(RC531_NOTAGERR);
temp=rc531_register_read(ErrorFlag);
if ((temp & 0x01)==0x01)
return(RC531_COLLERR);
if ((temp & 0x02)==0x02)
return(RC531_PARITYERR);
if ((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
if ((temp & 0x08)==0x08)
return(RC531_CRCERR);
temp=rc531_register_read(FIFO_Length);
if (temp!=0x10)
return(RC531_BYTECOUNTERR);
Read_FIFO(buff);
return(RC531_OK);
}
/********************************************************************************************************/
/*名称: MIF_Write */
/*功能: 该函数实现写MIFARE卡块的数值 */
/* */
/*输入: */
/* buff: 缓冲区首地址 */
/* Block_Adr: 块地址 */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_BYTECOUNTERR: 接收字节错误 */
/* RC531_NOTAUTHERR: 未经权威认证 */
/* RC531_EMPTY: 数据溢出错误 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -