|
今天终于把rc531的读卡器调通了。但是我发现有的卡能够读写块数据,有的卡却不能读写块数据。不过卡的UID都能读取,我用串口调试发现问题是出在密码的验证上,密码的输入都能通过。
char Authentication(uint8_t *UID,uint8_t block,uint8_t mode)
{
char i;
char temp,temp1;
uint8_t SndData[16];
temp1=ReadIO(RegControl);
temp1=temp1 & 0xf7;
WriteIO(RegControl,temp1);
WriteIO(RegChannelRedundancy,0x0f); //开启CRC,奇偶校验校验
if (mode==1) //AUTHENT1
SndData[0]=PICC_AUTHENT1B;
else
SndData[0]=PICC_AUTHENT1A;
SndData[1]=block;
for (i=0;i<4;i++)
SndData[2+i]=UID;
temp=Command_Send(SndData,6,PCD_AUTHENT1);
if(temp!=0)
return 1;
temp=Command_Send(SndData,0,PCD_AUTHENT2); //AUTHENT2
if(temp!=0)
return 2;
temp1=ReadIO(RegControl);
temp1=temp1 & 0x08; //Crypto1on=1,验证通过
if (temp1==0x08)
return 0;
else
return 3;
}
正常这个函数返回应该是0,出问题的时候返回时2。也就是说:
temp=Command_Send(SndData,0,PCD_AUTHENT2); //AUTHENT2
这里命令没有成功。
我的Command_Send函数原型是:
uint8_t Command_Send(uint8_t *Send_Buf, uint8_t Length, uint8_t comm_set)
{
uint8_t status;
uint32_t time;
uint32_t i;
uint32_t k;
//清空FIFO缓冲区
Clear_FIFO();
//写命令参数
Write_FIFO(Send_Buf, Length);
//设置延时时间
time = 0xff;
//向command寄存器写控制命令码
WriteIO(RegCommand, comm_set);
//检测命令是否被执行
for(i = 0; i < time; i++)
{
status = ReadIO(RegCommand); //读取Command_Reg寄存器
if(status == 0) return 0; //成功 //判断Command_Reg寄存器是否已为0
for(k = 0; k < 1250; k++); //延时
}
return 1; //失败
}
不知道这里命令没有写入成功是跟什么有关,为什么有的卡能够成功,有的又不成功。希望有人能解答我的疑惑。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|