📄 duxiexitongrc500.c
字号:
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 */
/*功能: 该函数实现对收到的卡片的序列号的判断 */
/*输出: 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)
{//sen(0x66);
return TRUE;
}
return FALSE;
}
/////////////////////////////////////////////////////////待发送数据的字节数
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;
}
}
///////////////////////////////////////////////////////卡片的防冲突检测
uchar AntiColl(void)
{
uchar temp;
uchar i;
uchar row,col;
uchar pre_row;
row = 0;
col = 0;
pre_row = 0;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
//ModConductance = 0x3f;
buffer[0] = RF_CMD_ANTICOL;
buffer[1] = 0x20;
ChannelRedundancy = 0x03; //关闭CRC,打开奇偶校验
temp=Command_Send(2, buffer, Transceive);
while(1)
{
if(temp==FALSE)
{
return(RC500_NOTAGERR);
}
temp = ErrorFlag;
// if((temp & 0x02)==0x02)
// return(RC500_PARITYERR);
// if((temp & 0x04)==0x04)
// return(RC500_FRAMINGERR);
temp=FIFO_Length;
//sen(temp);
if (temp==0)
{
//sen(0x30);
return RC500_BYTECOUNTERR;//
}
Read_FIFO(buffer);//05
Save_UID(row, col, temp); //将收到的UID放入UID数组中
temp = ErrorFlag; //判断接収数据是否出错
temp = temp & 0x01;
if(temp == 0x00)
{
temp = Check_UID(); //校验收到的UID
if(temp == FALSE)
{
//sen(0x30);
return(RC500_SERNRERR);
}
//sen(0x03);
return(RC500_OK);
}
else
{
temp = CollPos; //读取冲突检测寄存器
//sen(0x30);
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);
}
}
}
/****************************************************************/
/*名称: powerdown */
/*功能: 该函数实现RC500处于软件掉电模式 */
/***************************************************************/
/*uchar Powerdown(void)
{
CRCPresetLSB=0x63;
CWConductance=0x3f;
ChannelRedundancy=0x03;
MFOUTSelect=0x02;//调整输出功率以及电流消耗和操作距离.
TxControl=0x50;//TX2/1上的输出信号能量载波
Control=0x10;
DelayMS(200);
//Control=0x10;
DelayMS(1000);
//NCS = 1;//guanpianxuan
CardStatus=0x01;
return(CardStatus);
}*/
/****************************************************************/
/*名称: MIF_Halt */
/*功能: 该函数实现暂停MIFARE卡 */
/*输出: RC500_OK: 应答正确 */
/* RC500_PARITYERR: 奇偶校验错 */
/* RC500_CRCERR: CRC校验错 */
/* RC500_NOTAGERR: 无卡 */
/****************************************************************/
uchar MIF_Halt(void)
{
uchar temp;
uint i;
CRCPresetLSB=0x63;
CWConductance=0x3f;
ChannelRedundancy=0x03;
*buffer=RF_CMD_HALT;
*(buffer+1)=0x00;
temp=Command_Send(2,buffer,Transmit);
if
(temp==TRUE)
{
for(i=0;i<0x50;i++)
{
_nop_();
}
//sen(0x01);
return RC500_OK;
}
else
{
//sen(temp);
//sen(0x10);
temp=ErrorFlag;
if((temp&0x02)==0x02)
{
return RC500_PARITYERR;
}
if((temp&0x04)==0x04)
{
return RC500_FRAMINGERR;
}
return RC500_NOTAGERR;
}
}
////////////////////////////////////////////////////////
uchar Select_Card(void)
{
uchar temp,i;
CRCPresetLSB=0x63;
CWConductance=0x3f;
buffer[0] =RF_CMD_SELECT;//0x93
buffer[1]=0x70;
for(i=0;i<5;i++)
{
buffer[i+2]=UID[i];
//sen(buffer[i+2]);
}
//Bit_Frame=0x07;
ChannelRedundancy=0x0f;//对发送数据进行CRC/接收帧的最后字节被解释为CRC
temp=Command_Send(7,buffer,Transceive);
if(temp==FALSE)
{
//sen(0x40);
return(RC500_NOTAGERR);
}
else
{
temp=ErrorFlag;
//sen(ErrorFlag);//40
if((temp&0x02)==0x02)
//return(RC500_PARITYERR);//卡片奇偶校验错误
if((temp&0x04)==0x04)
//sen(RC500_FRAMINGERR);
return (RC500_FRAMINGERR);//FM1715帧错误
if((temp&0x08)==0x08)
return (RC500_CRCERR); //卡片CRC校验错误
temp=FIFO_Length;
//sen(FIFO_Length);
if(temp!=1)
return(RC500_BYTECOUNTERR);////从卡片接收到的字节数错误
Read_FIFO(buffer);//01
temp=*buffer;
//sen(temp); //08
if((temp==0x08)||(temp==0x88)||(temp==0x53))
{
//sen(0x04);
return(RC500_OK);
}
else {
//sen(0x40);
return(RC500_SELERR);
}
}
}
//////////////////////////////////////////////////////
uchar RC500_Bus_Sel(void) //zhong线选择;通过
{
uchar i;
Page_Sel=0x80;
for(i=0;i<RF_TimeOUT;i++)
{
if(Command ==0x00)
{
Page_Sel=0x00;
//for (j=0;j<5;j++)
//sen(tongxunceshixinxi[j]);
//sen(0x99);
return TRUE;
}
}
return FALSE;
//for (j=0;j<5;j++)
// sen(cuowufanhui[i]);
}
////////////////////////////////////////////////////////////密码认证的过程
uchar mimarenzhen(uchar idata *UID,uchar SecNR,uchar mode)
{
uchar idata i;
uchar idata temp,temp1;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
//ModConductance = 0x3f;
temp1 = Control;
//sen(temp1); //00
temp1 = temp1 & 0xf7;
Control = temp1;
CardStatus=0;
if (mode == 1)
buffer[0] = RF_CMD_AUTH_LB;
else
//sen(0x06);
buffer[0] = RF_CMD_AUTH_LA;
buffer[1] = SecNR * 4 + 3;//2008年4月26日改SECNR为块号原先为扇区号!
for (i = 0; i < 4; i++)
{
buffer[2 + i] = UID[i];
/////sen(buffer[2 + i]);
}
ChannelRedundancy = 0x0f; //开启CRC,奇偶校验校验
temp = Command_Send(6, buffer, Authent1);//验证命令认证过程第1步
////sen(temp);//01
if (temp == FALSE)
{//sen(0x60);
CardStatus=0;
return RC500_NOTAGERR;
}
temp = ErrorFlag;
//sen(ErrorFlag);//40//00
if ((temp & 0x02) == 0x02)
return RC500_PARITYERR;//
if((temp & 0x04) == 0x04)
return RC500_FRAMINGERR;//
if ((temp & 0x08) == 0x08)
return RC500_CRCERR;
//for (i = 0; i < 4; i++)
// {
//buffer[2 + i] = 0x00;}
temp = Command_Send(0, buffer, Authent2); //验证命令认证过程第2步
if(temp == FALSE)
{CardStatus=0;
// P13=1;
//P14=1;
return RC500_NOTAGERR;
}
temp = ErrorFlag;
//sen(ErrorFlag);//00
if ((temp & 0x02) == 0x02)
return RC500_PARITYERR;
if((temp & 0x04) == 0x04)
return RC500_FRAMINGERR;
if ((temp & 0x08) == 0x08)
return RC500_CRCERR;
temp1 = Control;
temp1 = temp1 & 0x08; //Crypto1on=1验证通过
if (temp1 == 0x08)
{
CardStatus=0x01;
return RC500_OK;
}
CardStatus=0;
return RC500_AUTHERR;
}
/****************************************************************/
/*名称: Load_keyE2 */
/*功能: 该函数实现把修改后的密码存入FM1715的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)
{
sen(temp);//84
if (temp >= 0x80) //计算密码存放地址
{
lsb = temp - 0x80;//0x04
msb = 0x01;
}
else
{
msb = 0x00;
lsb = temp + 0x80;
}
}
else
{
msb = 0x01;
lsb = temp + 0x40;//0x80
}
buffer[0] = lsb;
buffer[1] = msb;
temp =Command_Send(2, buffer, LoadKeyE2);
temp = ErrorFlag & 0x40;
if (temp == 0x40)
{
return FALSE;
}
return TRUE;
}*/
uchar Load_keyE2_CPY(uchar Secnr,uchar Mode)
{
uchar temp;
uint i;
uchar msb = 0;
uchar lsb = 0;
CardStatus=0;
//sen(0x05);
//sen(Secnr);//06
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -