|
#define ReadWriteArea 0x01
extern unsigned char UID[4];
extern int g_SPI_Fd;
unsigned char SetKey_read[16];
unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char ResetKey[6] = {0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF};
unsigned char SetKey_write[16] = {0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF,
0xFF, 0x07, 0x80, 0x69,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char Default_write[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x07, 0x80, 0x69,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
主程序中寫卡部分代碼
void my_register(void)
{
while(1)
{
int i,j;
HandleConfigMenu('A');//讀卡
my_status = PcdSelect(UID);
PcdHalt(); //我是這里設(shè)置的休眠,不知道會不會對讀寫有影響
printf("Select:%x\n", my_status);
if(MI_OK != my_status) continue;
my_status = PcdAuthState(PICC_AUTHENT1A , ReadWriteArea, ResetKey, UID);//尋卡
if(MI_OK == my_status)
{
printf("The card has been registered!!!\n");
usleep(500000);
break;
}
else
{
printf("Check\n");
my_status = PcdWrite(ReadWriteArea, SetKey_write);
printf("PcdWrite: %x\n", my_status);
printf("WRITE ...\n");
if(MI_OK == my_status)
{
my_status = MI_ERR;
printf("Registering...\n");
buzzer_control(DEVICE_BUZZER,BUZZERON);
usleep(500000);
buzzer_control(DEVICE_BUZZER,BUZZEROFF);
printf("!!!!!!!!\n");
printf("\n");
printf("The card register successfully!\n");
printf("\n");
printf("!!!!!!!!\n");
break;
}
}
}
}
下面貼出來PcdWrite、PcdAuthState相關(guān)代碼,有懂的朋友幫我看一下是不是哪里參數(shù)設(shè)置錯了
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_WRITE;
ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) //根據(jù)終端打印信息,是這里出錯
{ printf("1.\n");
status = MI_ERR; }
if (status == MI_OK)
{
for (i=0; i<16; i++)
{ ucComMF522Buf[ i] = *(pData+i); }
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
{ printf("2.\n");
status = MI_ERR; }
}
return status;
}
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = auth_mode;
ucComMF522Buf[1] = addr;
for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); }
for (i=0; i<6; i++)
{ ucComMF522Buf[i+8] = *(pSnr+i); }
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
{ status = MI_ERR; }
return status;
}
void Auto_Reader(void)
{
int i = 0;
while(1)
{
if(PcdRequest(0x26,UID) == MI_OK)
{
if(PcdAnticoll(UID) == MI_OK)
{
printf("\n");
printf("\n");
printf("\n");
printf("ID:\t");
for(i=0; i<4; i++)
{
printf("%x", UID[ i]);
}
printf("\n");
printf("\n");
printf("\n");
}
break;
}
else
{
printf(".");
}
usleep(300000);
}
} |
|