📄 main.#3
字号:
}
return MI_OK;
}
///////////////////////////////////////////////////////////////////////
//认证操作函数
//MCU将运算获得的数据,备存储到卡片上的存储器之前,或MCU希望能读取Mifare 1
//卡片上的数据之前,程序员必须证明他的读/写请求操作是被允许的。
// A U T H E N T I C A T I O N
// W I T H P R O V I D E D K E Y S
// auth_mode =0x60 KEYA ,61 KEYB; *snr CARD NOM.;keys key;block
///////////////////////////////////////////////////////////////////////
char Mf500PiccAuthKey( unsigned char auth_mode,
unsigned char *snr,
unsigned char *keys,
unsigned char block)
{
unsigned char i = 0;
status = MI_OK;
PcdSetTmo(2);
FlushFIFO(); // empty FIFO
ResetInfo();
//memcpy(MSndBuffer,keys,12); // write 12 bytes of the key
for(i=0;i<12;i++) MSndBuffer[i]=keys[i];
// for(i=0;i<12;i++) MSndBuffer[i]=0x0f;
MInfo.nBytesToSend = 12;
// write load command
status=PcdSingleResponseCmd(PCD_LOADKEY);
if (status == MI_OK)
{
// execute authentication
status = Mf500PiccAuthState(auth_mode,snr,block);
}
return status;
}
///////////////////////////////////////////////////////////////////////
// S T O R E K E Y S I N E E P R O M
///////////////////////////////////////////////////////////////////////
char Mf500PcdLoadKeyE2(unsigned char key_type,
unsigned char sector,
unsigned char *uncoded_keys)
{
// eeprom address calculation
// 0x80 ... offset
// key_sector ... sector
// 0x18 ... 2 * 12 = 24 = 0x18
unsigned short e2addr = 0x80 + sector * 0x18;
// unsigned short e2addr = 0x30 + sector * 0x18; ///非密钥存贮区地址偏移
unsigned char coded_keys[12];
status = MI_OK;
if (key_type == PICC_AUTHENT1B)
e2addr += 12; // key B offset
status = Mf500HostCodeKey(uncoded_keys,coded_keys);
if(status == MI_OK)
status = PcdWriteE2(e2addr,12,coded_keys);
return status;
}
///////////////////////////////////////////////////////////////////////
// A U T H E N T I C A T I O N S T A T E S
///////////////////////////////////////////////////////////////////////
char Mf500PiccAuthState( unsigned char auth_mode,
unsigned char *snr,
unsigned char block)
{
unsigned char i = 0;
status = MI_OK;
status = ReadRC(RegErrorFlag) & 0xff; // read error flags of the previous
// key load
if(status&0x40){
// SendData("key erro is found");
}
if(status&0x20){
//SendData("access erro");
}
if (status != MI_OK)
{
// SendData("erro have 1");
if (status & 0x40) // key error flag set
status = MI_KEYERR;
else
status = MI_AUTHERR; // generic authentication error
}
else
{
PcdSetTmo(2);
MSndBuffer[0] = auth_mode; // write authentication command
MSndBuffer[1] = block; // write block number for authentication
// memcpy(MSndBuffer + 2,snr,4); // write 4 bytes card serial number
for(i=0;i<4;i++) MSndBuffer[i+2]=snr[i];
ResetInfo();
MInfo.nBytesToSend = 6;
status = PcdSingleResponseCmd(PCD_AUTHENT1);
if (status == MI_OK)
{
if (ReadRC(RegSecondaryStatus) & 0x07) // RxLastBits mu?nbsp;leer sein
{
status = MI_BITCOUNTERR;
}
else
{
ResetInfo();
MInfo.nBytesToSend = 0;
if ((status = PcdSingleResponseCmd(PCD_AUTHENT2)) == MI_OK)
{
if ( ReadRC(RegControl) & 0x08 ) // Crypto1 activated
{
status = MI_OK;
}
else
{
status = MI_AUTHERR;
}
}
}
}
}
return status;
}
/****************************************************************************
* *
* Function: mifs_read *
* *
* Input: Adr //块 *
* Output: Data //读出的数据 *
* *
****************************************************************************/
char Mf500PiccRead( unsigned char addr,
unsigned char *mdata)
{
char tmp = 0;
char i;
status = MI_OK;
FlushFIFO(); // empty FIFO
PcdSetTmo(4); // long timeout 设置定时器的分频值以及定时器重装载值
WriteRC(RegChannelRedundancy,0x0F); // RxCRC, TxCRC, Parity enable
ResetInfo();
MSndBuffer[0] = PICC_READ; // read command code
MSndBuffer[1] = addr;
MInfo.nBytesToSend = 2;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status != MI_OK)
{
if (status != MI_NOTAGERR ) // no timeout occured //此步好像永不满足
{
if (MInfo.nBitsReceived == 4) // NACK
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
if ((MRcvBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR;
}
else
{
status = MI_CODEERR;
}
}
}
for(i=0;i<16;i++) mdata[i]=0;
}
else // Response Processing
{
if (MInfo.nBytesReceived != 16)
{
status = MI_BYTECOUNTERR;
for(i=0;i<16;i++) mdata[i]=0;
}
else
{
for(i=0;i<16;i++) mdata[i]=MRcvBuffer[i];
}
}
PcdSetTmo(2); // short timeout
return status;
}
/****************************************************************************
* *
* Function: mifs_write *
* *
* Input: Adr, Data *
* Output: - *
* *
****************************************************************************/
char Mf500PiccWrite( unsigned char addr,
unsigned char *mdata)
{
char i;
status = MI_OK;
PcdSetTmo(4); // long timeout
WriteRC(RegChannelRedundancy,0x0F); // RxCRC, TxCRC, Parity enable
ResetInfo();
MSndBuffer[0] = PICC_WRITE; // Write command code
MSndBuffer[1] = addr;
MInfo.nBytesToSend = 2;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
/*
if (status != MI_NOTAGERR) // no timeout error
{
if (MInfo.nBitsReceived != 4) // 4 bits are necessary
{
status = MI_BITCOUNTERR;
printf("\n write erro 1 \n");
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
switch(MRcvBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x0a:
status = MI_OK;
break;
default:
status = MI_CODEERR;
break;
}
}
}else if(status != MI_OK) { return status; printf("\n write erro mi_notagerr 11 \n"); }
*/
if ( status == MI_OK)
{
PcdSetTmo(4); // long timeout
ResetInfo();
//memcpy(MSndBuffer,mdata,16);
for(i=0;i<16;i++) MSndBuffer[i]=mdata[i];
MInfo.nBytesToSend = 16;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
/*
if (status != MI_NOTAGERR) // no timeout occured
{
if (MInfo.nBitsReceived != 4) // 4 bits are necessary
{
status = MI_BITCOUNTERR;
printf("\n write erro 2 \n");
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
switch(MRcvBuffer[0])
{
case 0x00:
status = MI_WRITEERR;
break;
case 0x0a:
status = MI_OK;
break;
default:
status = MI_CODEERR;
break;
}
}
}else { printf("\n write erro mi_notagerr 22 \n"); }
*/
PcdSetTmo(2); // short timeout
}
return status;
}
///////////////////////////////////////////////////////////////////////
// V A L U E M A N I P U L A T I O N
///////////////////////////////////////////////////////////////////////
char Mf500PiccValue(unsigned char dd_mode,
unsigned char addr,
unsigned char *value,
unsigned char trans_addr)
{
char i;
status = MI_OK;
PcdSetTmo(2);
ResetInfo();
////1//////////////////////////////////////////////////////////////////
MSndBuffer[0] = dd_mode; // Inc,Dec command code
MSndBuffer[1] = addr;
MInfo.nBytesToSend = 2;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status != MI_NOTAGERR) // no timeout error
{
if (MInfo.nBitsReceived != 4) // 4 bits are necessary
{
status = MI_BITCOUNTERR;
}
else // 4 bit received
{
MRcvBuffer[0] &= 0x0f; // mask out upper nibble
switch(MRcvBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x0a:
status = MI_OK;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
} // else if(status != MI_OK) { return status;}
/////2///////////////////////////////////////////////////
if ( status == MI_OK)
{
PcdSetTmo(4); // long timeout
ResetInfo();
//memcpy(MSndBuffer,value,4);
for(i=0;i<4;i++) MSndBuffer[i]=value[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -