📄 rc500.lst
字号:
247 6 n=1;
248 6 }
249 5 for(i=0;i<n;i++)
250 5 {
251 6 pi->MfData[i]=ReadRC(RegFIFOData);
252 6 }
253 5 }
254 4 }
255 3 }
256 2 else if(n&irqEn&0x20)
257 2 {
258 3 status=MI_NOTAGERR;
259 3 }
260 2 else
261 2 {
262 3 status=MI_COM_ERR;
263 3 }
264 2 WriteRC(RegInterruptEn,0x7F);
265 2 WriteRC(RegInterruptRq,0x7F);
266 2 }
267 1 return status;
268 1 }
269 //*************************************************
270 char PcdRead(uchar addr,uchar *readdata)
271 {
272 1 char status;
273 1 uchar i;
274 1 idata struct TranSciveBuffer{uchar MfCommand;
275 1 uchar MfLength;
276 1 uchar MfData[16];
277 1 }MfComData;
278 1 struct TranSciveBuffer *pi;
279 1
280 1 pi=&MfComData;
281 1 PcdSetTmo(4);
282 1 WriteRC(RegChannelRedundancy,0x0F);
283 1 MfComData.MfCommand=PCD_TRANSCEIVE;
284 1 MfComData.MfLength=2;
285 1 MfComData.MfData[0]=PICC_READ;
286 1 MfComData.MfData[1]=addr;
287 1
288 1 status=PcdComTransceive(pi);
289 1 if(status==MI_OK)
290 1 {
291 2 if(MfComData.MfLength!=0x80)
292 2 {
293 3 status = MI_BITCOUNTERR;
294 3 }
295 2 else
296 2 {
297 3 for(i=0;i<16;i++)
298 3 {
299 4 *(readdata+i)=MfComData.MfData[i];
300 4 }
301 3 }
302 2 }
303 1 return status;
C51 COMPILER V7.05 RC500 12/20/2004 15:31:09 PAGE 6
304 1 }
305 //*******************************************************************
306 char PcdRequest(uchar req_code)
307 {
308 1 char status;
309 1 idata struct TranSciveBuffer {uchar MfCommand;
310 1 uchar MfLength;
311 1 uchar MfData[1];
312 1 }MfComData;
313 1 struct TranSciveBuffer *pi;
314 1
315 1 pi=&MfComData;
316 1 PcdSetTmo(106);
317 1 WriteRC(RegChannelRedundancy,0x03);
318 1 ClearBitMask(RegControl,0x08);
319 1 WriteRC(RegBitFraming,0x07);
320 1 MfComData.MfCommand=PCD_TRANSCEIVE;
321 1 MfComData.MfLength=1;
322 1 MfComData.MfData[0]=req_code;
323 1 status=PcdComTransceive(pi);
324 1 if(!status)
325 1 { if(MfComData.MfLength!=0x10)
326 2 {
327 3 status=MI_BITCOUNTERR;
328 3 }
329 2 }
330 1 return status;
331 1 }
332 //****************************************************************************
333 char PcdSelect(uchar *snr)
334 {
335 1 uchar i;
336 1 char status;
337 1 uchar snr_check=0;
338 1 idata struct TranSciveBuffer{uchar MfCommand;
339 1 uchar MfLength;
340 1 uchar MfData[7];
341 1 }MfComData;
342 1 struct TranSciveBuffer *pi;
343 1
344 1 pi=&MfComData;
345 1 PcdSetTmo(106);
346 1 WriteRC(RegChannelRedundancy,0x0F);
347 1 ClearBitMask(RegControl,0x08);
348 1
349 1 MfComData.MfCommand=PCD_TRANSCEIVE;
350 1 MfComData.MfLength=7;
351 1 MfComData.MfData[0]=PICC_ANTICOLL1;
352 1 MfComData.MfData[1]=0x70;
353 1 for(i=0;i<4;i++)
354 1 {
355 2 snr_check^=*(snr+i);
356 2 MfComData.MfData[i+2]=*(snr+i);
357 2 }
358 1 MfComData.MfData[6]=snr_check;
359 1 status=PcdComTransceive(pi);
360 1 if(status==MI_OK)
361 1 { if(MfComData.MfLength!=0x8)
362 2 {
363 3 status = MI_BITCOUNTERR;
364 3 }
365 2 }
C51 COMPILER V7.05 RC500 12/20/2004 15:31:09 PAGE 7
366 1 return status;
367 1 }
368 //************************************************************************
369 void PcdSetTmo(uchar tmoLength)
370 {
371 1 switch(tmoLength)
372 1 {
373 2 case 1: // short timeout (1,0 ms)
374 2 WriteRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
375 2 WriteRC(RegTimerReload,0x6a); // TReloadVal = 'h6a =106(dec)
376 2 break;
377 2 case 2: // medium timeout (1,5 ms)
378 2 WriteRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
379 2 WriteRC(RegTimerReload,0xa0); // TReloadVal = 'ha0 =160(dec)
380 2 break;
381 2 case 3: // long timeout (6 ms)
382 2 WriteRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
383 2 WriteRC(RegTimerReload,0xa0); // TReloadVal = 'ha0 =160(dec)
384 2 break;
385 2 case 4: // long timeout (9.6 ms)
386 2 WriteRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
387 2 WriteRC(RegTimerReload,0xff); // TReloadVal = 'ff =255(dec)
388 2 break;
389 2 default: // short timeout (1,0 ms)
390 2 WriteRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
391 2 WriteRC(RegTimerReload,tmoLength);// TReloadVal = tmoLength
392 2 break;
393 2 }
394 1 WriteRC(RegTimerControl,0X06);
395 1 }
396 //*********************************************************
397 extern char PcdWrite(uchar addr,uchar *writedata)
398 {
399 1 char status;
400 1 uchar i;
401 1 idata struct TranSciveBuffer{uchar MfCommand;
402 1 uchar MfLength;
403 1 uchar MfData[16];
404 1 }MfComData;
405 1 struct TranSciveBuffer *pi;
406 1
407 1 pi=&MfComData;
408 1 PcdSetTmo(4);
409 1 WriteRC(RegChannelRedundancy,0x0F);
410 1 MfComData.MfCommand=PCD_TRANSCEIVE;
411 1 MfComData.MfLength=2;
412 1 MfComData.MfData[0]=PICC_WRITE;
413 1 MfComData.MfData[1]=addr;
414 1
415 1 status=PcdComTransceive(pi);
416 1 if(status!=MI_NOTAGERR)
417 1 {
418 2 if(MfComData.MfLength!=4)
419 2 {
420 3 status=MI_BITCOUNTERR;
421 3 }
422 2 else
423 2 {
424 3 MfComData.MfData[0]&=0x0f;
425 3 switch(MfComData.MfData[0])
426 3 {
427 4 case 0x00:
C51 COMPILER V7.05 RC500 12/20/2004 15:31:09 PAGE 8
428 4 status=MI_NOTAUTHERR;
429 4 break;
430 4 case 0x0a:
431 4 status=MI_OK;
432 4 break;
433 4 default:
434 4 status=MI_CODEERR;
435 4 break;
436 4 }
437 3 }
438 2 }
439 1 if(status==MI_OK)
440 1 {
441 2 PcdSetTmo(3);
442 2 MfComData.MfCommand=PCD_TRANSCEIVE;
443 2 MfComData.MfLength=16;
444 2 for(i=0;i<16;i++)
445 2 {
446 3 MfComData.MfData[i]=*(writedata+i);
447 3 }
448 2 status=PcdComTransceive(pi);
449 2 if(status!=MI_NOTAGERR)
450 2 {
451 3 MfComData.MfData[0]&=0x0f;
452 3 switch(MfComData.MfData[0])
453 3 {
454 4 case 0x00:
455 4 status=MI_WRITEERR;
456 4 break;
457 4 case 0x0a:
458 4 status=MI_OK;
459 4 break;
460 4 default:
461 4 status=MI_CODEERR;
462 4 break;
463 4 }
464 3 }
465 2 }
466 1 return status;
467 1 }
468 //*************************************************************
469 /*****************************************************************************
470 * 复位并初始化RC500
471 *注意:RC500上电后应延时500ms才能可靠初始化
472 ******************************************************************************/
473 char PcdReset()
474 {
475 1 char status=MI_OK;
476 1 char n=0;
477 1 uint i=0x4000;
478 1
479 1 RC500_RST=1;
480 1 DelayMs(100);
481 1 RC500_RST=0;
482 1 while(i!=0&&n!=0x3f)
483 1 {
484 2 n=ReadRawRC(RegCommand);
485 2 i--;
486 2 }
487 1 while(i!=0&&n==0x3f)
488 1 {
489 2 n=ReadRawRC(RegCommand);
C51 COMPILER V7.05 RC500 12/20/2004 15:31:09 PAGE 9
490 2 i--;
491 2 }
492 1 if(i!=0)
493 1 {
494 2 WriteRawRC(RegPage,0x80);
495 2 n=0x80;
496 2 while((i!=0)&&(n&0x80))
497 2 {
498 3 n=ReadRawRC(RegCommand);
499 3 i--;
500 3 }
501 2 if(i==0||(n&0xff))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -