📄 mf_rc500.lst
字号:
331 unsigned char *snr)
332 {
333 1 char idata status = MI_OK;
334 1 char idata snr_in[4];
335 1 char idata nbytes = 0;
336 1 char idata nbits = 0;
337 1 char idata complete = 0;
338 1 char idata i = 0;
339 1 char idata byteOffset = 0;
340 1 unsigned char dummyShift1;
341 1 unsigned char dummyShift2;
342 1 RC_SetTmod(tmod_1ms);
343 1 memcpy(snr_in,snr,4);
344 1
345 1 RC_WriteRC(RegDecoderControl,0x28);
346 1 RC_ClearBit(RegControl,0x08);
347 1 complete = 0;
348 1 while (!complete && (status == MI_OK) )
349 1 {
350 2 ResetInfo(MInfo);
351 2 RC_WriteRC(RegChannelRedundancy,0x03);
352 2 nbits = bcnt % 8;
353 2 if (nbits)
354 2 {
355 3 RC_WriteRC(RegBitFraming,nbits << 4 | nbits);
356 3 nbytes = bcnt / 8 + 1;
357 3 if (nbits == 7)
358 3 {
359 4 MInfo.cmd = PICC_ANTICOLL1;
360 4 RC_WriteRC(RegBitFraming,nbits);
361 4 }
362 3 }
363 2 else
364 2 {
365 3 nbytes = bcnt / 8;
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 7
366 3 }
367 2
368 2 SerBuffer[0] = 0x93;
369 2 SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
370 2
371 2 for (i = 0; i < nbytes; i++)
372 2 {
373 3 SerBuffer[i + 2] = snr_in[i];
374 3 }
375 2 MInfo.nBytesToSend = 2 + nbytes;
376 2
377 2 status = RC_Command(PCD_TRANSCEIVE,
378 2 SerBuffer,
379 2 &MInfo);
380 2 if (nbits == 7)
381 2 {
382 3 dummyShift1 = 0x00;
383 3 for (i = 0; i < MInfo.nBytesReceived; i++)
384 3 {
385 4 dummyShift2 = SerBuffer[i];
386 4 SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
387 4 dummyShift1 = dummyShift2;
388 4 }
389 3 MInfo.nBitsReceived -= MInfo.nBytesReceived;
390 3 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
391 3 }
392 2
393 2 if ( status == MI_OK || status == MI_COLLERR)
394 2 {
395 3 if ( MInfo.nBitsReceived != (40 - bcnt) )
396 3 {
397 4 status = MI_BITCOUNTERR;
398 4 }
399 3 else
400 3 {
401 4 byteOffset = 0;
402 4 if( nbits != 0 )
403 4 {
404 5 snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
405 5 byteOffset = 1;
406 5 }
407 4
408 4 for ( i =0; i < (4 - nbytes); i++)
409 4 {
410 5 snr_in[nbytes + i] = SerBuffer[i + byteOffset];
411 5 }
412 4
413 4 if (status != MI_COLLERR )
414 4 {
415 5 dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
416 5 dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
417 5 if (dummyShift2 != dummyShift1)
418 5 {
419 6 status = MI_SERNRERR;
420 6 }
421 5 else
422 5 {
423 6 complete = 1;
424 6 }
425 5 }
426 4 else
427 4 {
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 8
428 5 bcnt = bcnt + MInfo.collPos - nbits;
429 5 status = MI_OK;
430 5 }
431 4 }
432 3 }
433 2 }
434 1 if (status == MI_OK)
435 1 {
436 2 memcpy(snr,snr_in,4);
437 2 }
438 1 else
439 1 {
440 2 memcpy(snr,"0000",4);
441 2 }
442 1 RC_ClearBit(RegDecoderControl,0x20);
443 1
444 1 return status;
445 1 }
446
447 char MF_Select(unsigned char *snr,
448 unsigned char *sak)
449 {
450 1 char idata status = MI_OK;
451 1
452 1 RC_SetTmod(tmod_1ms);
453 1
454 1 RC_WriteRC(RegChannelRedundancy,0x0F);
455 1 RC_ClearBit(RegControl,0x08);
456 1 ResetInfo(MInfo);
457 1 SerBuffer[0] = 0x93;
458 1 SerBuffer[1] = 0x70;
459 1
460 1 memcpy(SerBuffer + 2,snr,4);
461 1 SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
462 1 MInfo.nBytesToSend = 7;
463 1 status = RC_Command(PCD_TRANSCEIVE,
464 1 SerBuffer,
465 1 &MInfo);
466 1
467 1 *sak = 0;
468 1 if (status == MI_OK)
469 1 {
470 2 if (MInfo.nBitsReceived != 8)
471 2 {
472 3 status = MI_BITCOUNTERR;
473 3 }
474 2 else
475 2 {
476 3 *sak = SerBuffer[0];
477 3 }
478 2 }
479 1
480 1 return status;
481 1 }
482 #if(0)
char MF_LoadKeyE2(unsigned char key_type,
unsigned char sector,
unsigned char *uncoded_keys)
{
signed char status = MI_OK;
unsigned int e2addr = 0x80 + sector * 0x18;
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 9
unsigned char coded_keys[12];
if (key_type == PICC_AUTHENT1B)
e2addr += 12; // key B offset
if ((status = MF_ChgAvailableKey(uncoded_keys,coded_keys)) == MI_OK)
status = RC_WriteE2( e2addr,12,coded_keys);
return status;
}
char RC_WriteE2(unsigned int startaddr,
unsigned char length,
unsigned char* _data)
{
char status = MI_OK;
ResetInfo(MInfo);
SerBuffer[0] = startaddr & 0xFF;
SerBuffer[1] = (startaddr >> 8) & 0xFF;
memcpy(SerBuffer + 2,_data,length);
MInfo.nBytesToSend = length + 2;
status = RC_Command(PCD_WRITEE2,
SerBuffer,
&MInfo);
return status;
}
char MF_AuthE2( unsigned char auth_mode,
unsigned char *snr,
unsigned char keynr,
unsigned char block)
{
char idata status = MI_OK;
unsigned int e2addr = 0x80 + keynr * 0x18;
unsigned char *e2addrbuf = (unsigned char*)&e2addr;
if (auth_mode == PICC_AUTHENT1B)
e2addr += 12;
RC_FlushFIFO();
ResetInfo(MInfo);
memcpy(SerBuffer,e2addrbuf,2);
SerBuffer[2] = SerBuffer[0];
SerBuffer[0] = SerBuffer[1];
SerBuffer[1] = SerBuffer[2];
MInfo.nBytesToSend = 2;
if ((status=RC_Command(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)
{
status = MF_AuthState(auth_mode,snr,block); //11.9
}
return status;
}
char load_key(void)
{
uchar code Nkey_a1[6]={0xc5,0xc4,0xc3,0xc2,0xc1,0xc0};
uchar code Nkey_b1[6]={0xd5,0xd4,0xd3,0xd2,0xd1,0xd0};
uchar code Nkey_a2[6]={0xff,0xff,0xff,0xff,0xff,0xff};
uchar code Nkey_b2[6]={0xff,0xff,0xff,0xff,0xff,0xff};
uchar code Nkey_a[6]={0xff,0xff,0xff,0xff,0xff,0xff};
uchar code Nkey_b[6]={0xff,0xff,0xff,0xff,0xff,0xff};
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 10
uchar i,key_mode;//s;
if (MF_LoadKeyE2(KEYA,0,Nkey_a1))
return LOAD_KEYA_ERR;
if(MF_LoadKeyE2(KEYB,0,Nkey_b1))
return LOAD_KEYB_ERR;
if (MF_LoadKeyE2(KEYA,1,Nkey_a))
return LOAD_KEYA_ERR;
if(MF_LoadKeyE2(KEYB,1,Nkey_b))
return LOAD_KEYB_ERR;
key_mode=KEYA;//0x00 /*prepare key A (SET 0)loading*/
for (i=2;i<16;i++)
{
watch_dog();
if(MF_LoadKeyE2(key_mode,i,Nkey_a2))
return LOAD_KEYA_ERR;
}
key_mode=KEYB;//0x04 /*prepare key B (SET 0)loading*/
for (i=2;i<16;i++)
{
watch_dog( );
if(MF_LoadKeyE2(key_mode,i,Nkey_b2))
return LOAD_KEYB_ERR;
//load key ok
}
return 0;
}
char MF_Value(unsigned char dd_mode,
unsigned char addr,
unsigned char *value,
unsigned char trans_addr)
{
char status = MI_OK;
RC_SetTmod(tmod_1ms);
ResetInfo(MInfo);
SerBuffer[0] = dd_mode;
SerBuffer[1] = addr;
MInfo.nBytesToSend = 2;
status = RC_Command(PCD_TRANSCEIVE,
SerBuffer,
&MInfo);
if (status != MI_NOTAGERR)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
SerBuffer[0] &= 0x0f;
switch(SerBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 11
break;
case 0x0a:
status = MI_OK;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
}
if ( status == MI_OK)
{
RC_SetTmod(tmod_6ms);
ResetInfo(MInfo);
memcpy(SerBuffer,value,4);
MInfo.nBytesToSend = 4;
status = RC_Command(PCD_TRANSCEIVE,
SerBuffer,
&MInfo);
if (status == MI_OK)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
SerBuffer[0] &= 0x0f;
switch(SerBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
}
else
if (status == MI_NOTAGERR )
status = MI_OK;
}
if ( status == MI_OK)
{
ResetInfo(MInfo);
SerBuffer[0] = PICC_TRANSFER;
SerBuffer[1] = trans_addr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -