📄 rc531.c
字号:
// buff, 指向待发送数据的指针 //
// Comm_Set, 命令码 //
// //
//输出: //
// TRUE, 命令被正确执行 //
// FALSE, 命令执行错误 //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char Command_Send(char count,char * buff,char Comm_Set)
{
char j,temp;
rc531_register_write(Command,Idle);
Clear_FIFO();
Write_FIFO(count,buff);
rc531_register_write(Command,Comm_Set); //命令执行
RC531_Transceive_FLAG_HIGH; //FOR TEST
for(j=0;j<RF_TimeOut;j++) //检查命令执行否
{
temp=rc531_register_read(Command);
if(temp==0x00)
{ RC531_Transceive_FLAG_LOW; //FOR TEST
return(TRUE);
}
}
return(FALSE);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: Judge_Req //
//功能: 该函数实现对卡片复位应答信号的判断 //
// //
//输入: //
// *buff, 指向应答数据的指针 //
// //
//输出: //
// TRUE, 卡片应答信号正确 //
// FALSE, 卡片应答信号错误 //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char Judge_Req(char * buff)
{
char temp1,temp2;
temp1 = *buff;
temp2 = *(buff + 1);
if((temp1 == ATQA_BYTE0) && (temp2 == ATQA_BYTE1))
return(TRUE);
else
return(FALSE);
}
/********************************************************************************************************/
/*名称: Save_UID */
/*功能: 该函数实现保存卡片收到的序列号 */
/* */
/*输入: */
/* row: 产生冲突的行 */
/* col: 产生冲突的列 */
/* length: 接収到的UID数据长度 */
/* */
/*输出: */
/* N/A */
/********************************************************************************************************/
void Save_UID(char row,char col,char length)
{
char i;
char temp;
char 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: 序列号错误 */
/********************************************************************************************************/
char Check_UID(void)
{
char temp;
char 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(char row,char 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:
rc531_register_write(Bit_Frame,0x00);
break;
case 1:
rc531_register_write(Bit_Frame,0x11);
buffer[1]=(buffer[1] | 0x01);
break;
case 2:
rc531_register_write(Bit_Frame,0x22);
buffer[1]=(buffer[1] | 0x02);
break;
case 3:
rc531_register_write(Bit_Frame,0x33);
buffer[1]=(buffer[1] | 0x03);
break;
case 4:
rc531_register_write(Bit_Frame,0x44);
buffer[1]=(buffer[1] | 0x04);
break;
case 5:
rc531_register_write(Bit_Frame,0x55);
buffer[1]=(buffer[1] | 0x05);
break;
case 6:
rc531_register_write(Bit_Frame,0x66);
buffer[1]=(buffer[1] | 0x06);
break;
case 7:
rc531_register_write(Bit_Frame,0x77);
buffer[1]=(buffer[1] | 0x07);
break;
default:
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: Request //
//功能: 该函数实现对放入RC531操作范围之内的卡片的Request操作 //
// //
//输入: //
// mode: WUPA(监测所以RC531操作范围之内的卡片) //
// REQA(监测在RC531操作范围之内不处于HALT状态的空闲卡片) //
// //
//输出: //
// RC531_NOTAGERR: 无卡 //
// RC531_OK: 应答正确 //
// RC531_REQERR: 应答错误 //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char Request(char mode)
{
char temp;
buffer[0]=mode; //Request模式选择
rc531_register_write(Bit_Frame,0x07); //发送7bit
rc531_register_write(ChannelRedundancy,0x03); //关闭CRC校验
rc531_register_write(Control,0x00); //屏蔽CRYPTO1位
temp=Command_Send(1,buffer,Transceive);
if(temp == FALSE)
{
return(RC531_NOTAGERR);
}
Read_FIFO(buffer); //从FIFO中读取应答信息
temp=Judge_Req(buffer); //判断应答信号是否正确
if (temp==TRUE)
{
tagtype[0]=buffer[0];
tagtype[1]=buffer[1];
return(RC531_OK);
}
else
return(RC531_REQERR);
}
/********************************************************************************************************/
/*名称: AntiColl */
/*功能: 该函数实现对放入RC531操作范围之内的卡片的防冲突检测 */
/* */
/*输入: */
/* N/A */
/* */
/*输出: */
/* RC531_NOTAGERR: 无卡 */
/* RC531_BYTECOUNTERR: 接收字节错误 */
/* RC531_SERNRERR: 卡片序列号应答错误 */
/* RC531_OK: 卡片应答正确 */
/********************************************************************************************************/
char AntiColl(void)
{
char temp;
char i;
char row,col;
char pre_row;
row=0;
col=0;
pre_row=0;
buffer[0]=RF_CMD_ANTICOL;
buffer[1]=0x20;
rc531_register_write(Bit_Frame,0x00);
rc531_register_write(ChannelRedundancy,0x03); //关闭CRC,打开奇偶校验
temp=Command_Send(2,buffer,Transceive);
while(1)
{
if(temp==FALSE)
return(RC531_NOTAGERR);
temp=rc531_register_read(FIFO_Length);
if (temp==0)
return(RC531_BYTECOUNTERR);
Read_FIFO(buffer);
Save_UID(row,col,temp); //将收到的UID放入UID数组中
temp=rc531_register_read(ErrorFlag); //判断接収数据是否出错
_NOP();
if((temp & 0x01)==0x00)
{
if((temp & 0x02)==0x02)
return(RC531_PARITYERR);
if((temp & 0x04)==0x04)
return(RC531_FRAMINGERR);
else
{
temp=Check_UID(); //校验收到的UID
if(temp==FALSE)
return(RC531_SERNRERR);
return(RC531_OK);
}
}
else
{ w++;
temp=rc531_register_read(CollPos); //读取冲突检测寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -