📄 rc531.c
字号:
/*名称: Read_FIFO */
/*功能: 该函数实现从RC531的FIFO中读出x bytes数据 */
/* */
/*输入: */
/* buff, 指向读出数据的指针 */
/* */
/*输出: */
/* N/A */
/********************************************************************************************************/
void Read_FIFO(uchar idata *buff)
{
uchar temp;
uchar i;
temp=FIFO_Length;
for(i=0;i<temp;i++)
*(buff+i)=FIFO;
}
/*******************************************************************************************************/
/*名称: Judge_Req */
/*功能: 该函数实现对卡片复位应答信号的判断 */
/* */
/*输入: */
/* *buff, 指向应答数据的指针 */
/* */
/*输出: */
/* TRUE, 卡片应答信号正确 */
/* FALSE, 卡片应答信号错误 */
/*******************************************************************************************************/
uchar Judge_Req(uchar idata *buff)
{
uchar temp1,temp2;
temp1 = *buff;
temp2 = *(buff + 1);
if((temp1 == 0x04) && (temp2 == 0x00))
return(TRUE);
return(FALSE);
}
/********************************************************************************************************/
/*名称: Save_UID */
/*功能: 该函数实现保存卡片收到的序列号 */
/* */
/*输入: */
/* row: 产生冲突的行 */
/* col: 产生冲突的列 */
/* length: 接収到的UID数据长度 */
/* */
/*输出: */
/* N/A */
/********************************************************************************************************/
void Save_UID(uchar row,uchar col,uchar length)
{
uchar i;
uchar temp;
uchar temp1;
if(row==0x00 && col==0x00)
for(i=0;i<length;i++)
UID[i]=buffer[i];
else
{
temp=buffer[0];
temp1=UID[row-1];
switch(col)
{
case 0:
temp1=0x00;
row=row+1;
break;
case 1:
temp=temp & 0xFE;
temp1=temp1 & 0x01;
break;
case 2:
temp=temp & 0xFC;
temp1=temp1 & 0x03;
break;
case 3:
temp=temp & 0xF8;
temp1=temp1 & 0x07;
break;
case 4:
temp=temp & 0xF0;
temp1=temp1 & 0x0F;
break;
case 5:
temp=temp & 0xE0;
temp1=temp1 & 0x1F;
break;
case 6:
temp=temp & 0xC0;
temp1=temp1 & 0x3F;
break;
case 7:
temp=temp & 0x80;
temp1=temp1 & 0x7F;
break;
default:
break;
}
buffer[0]=temp;
UID[row-1]=temp1 | temp;
for(i=1;i<length;i++)
{
UID[row-1+i]=buffer[i];
}
}
}
/********************************************************************************************************/
/*名称: Check_UID */
/*功能: 该函数实现对收到的卡片的序列号的判断 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* TRUE: 序列号正确 */
/* FALSE: 序列号错误 */
/********************************************************************************************************/
uchar Check_UID(void)
{
uchar temp;
uchar i;
temp=0x00;
for(i=0;i<5;i++)
{
temp=temp ^ UID[i];
}
if(temp==0)
return(TRUE);
return(FALSE);
}
/********************************************************************************************************/
/*名称: Set_BitFraming */
/*功能: 该函数实现对收到的卡片的序列号的判断 */
/* */
/*输入: */
/* row: 产生冲突的行 */
/* col: 产生冲突的列 */
/* */
/*输出: */
/* N/A */
/********************************************************************************************************/
void Set_BitFraming(uchar row,uchar col)
{
switch(row)
{
case 0:
buffer[1]=0x20;
break;
case 1:
buffer[1]=0x30;
break;
case 2:
buffer[1]=0x40;
break;
case 3:
buffer[1]=0x50;
break;
case 4:
buffer[1]=0x60;
break;
default:
break;
}
switch(col)
{
case 0:
Bit_Frame=0x00;
break;
case 1:
Bit_Frame=0x11;
buffer[1]=(buffer[1] | 0x01);
break;
case 2:
Bit_Frame=0x22;
buffer[1]=(buffer[1] | 0x02);
break;
case 3:
Bit_Frame=0x33;
buffer[1]=(buffer[1] | 0x03);
break;
case 4:
Bit_Frame=0x44;
buffer[1]=(buffer[1] | 0x04);
break;
case 5:
Bit_Frame=0x55;
buffer[1]=(buffer[1] | 0x05);
break;
case 6:
Bit_Frame=0x66;
buffer[1]=(buffer[1] | 0x06);
break;
case 7:
Bit_Frame=0x77;
buffer[1]=(buffer[1] | 0x07);
break;
default:
break;
}
}
/********************************************************************************************************/
/*名称: Read_E2 */
/*功能: 该函数实现从RC531的EE中读出数据 */
/* */
/*输入: */
/* lsb, EE地址(低字节) */
/* msb, EE地址(高字节) */
/* count, 待读出数据EE的字节个数 */
/* buff, 指向待读出数据的指针 */
/* */
/*输出: */
/* TRUE, EE数据正确读出 */
/* FALSE, EE数据读出有误 */
/********************************************************************************************************/
uchar Read_E2(uchar lsb,uchar msb,uchar count,uchar idata *buff)
{
uchar 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数据写入有误 */
/********************************************************************************************************/
uchar Write_E2(uchar lsb,uchar msb,uchar count,uchar idata *buff)
{
uchar idata 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=SecondaryStatus;
temp=temp & 0x40;
if (temp==0x40)
return(TRUE);
else
return(FALSE);
}
/********************************************************************************************************/
/*名称: Load_key_CPY */
/*功能: 该函数实现把FIFO中的密码存入rc531的keybuffer中 */
/* */
/*输入: */
/* keybuff: 密码首地址 */
/* */
/*输出: */
/* TRUE: 密钥装载成功 */
/* FALSE: 密钥装载失败 */
/********************************************************************************************************/
uchar Load_key_CPY(uchar idata *keybuff)
{
uchar temp;
temp=Command_Send(12,keybuff,LoadKey);
temp=ErrorFlag & 0x40;
if (temp==0x40)
return(FALSE);
return(TRUE);
}
/********************************************************************************************************/
/*名称: Load_keyE2 */
/*功能: 该函数实现把E2中密码存入rc531的keybuffer中 */
/* */
/*输入: */
/* Secnr: EE起始地址 */
/* */
/*输出: */
/* True: 密钥装载成功 */
/* False: 密钥装载失败 */
/********************************************************************************************************/
uchar Load_keyE2_CPY(uchar Secnr,uchar Mode)
{
uchar temp;
uchar msb=0;
uchar 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=ErrorFlag & 0x40;
if (temp==0x40)
return(FALSE);
return(TRUE);
}
/********************************************************************************************************/
/*名称: Authentication */
/*功能: 该函数实现密码认证的过程 */
/* */
/*输入: */
/* UID: 卡片序列号地址 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -