📄 slrc500.lst
字号:
250 2 WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
251 2 break;
252 2 case 15: // (4.9485 s) FWI=14
253 2 WriteRawRC(RegTimerClock,0x9); // TAutoRestart=0,TPrescale=4096*128
254 2 WriteRawRC(RegTimerReload,0x0ff);// TReloadVal = 'h81 =129(dec)
255 2 break;
256 2 default: //
257 2 WriteRawRC(RegTimerClock,0x19); // TAutoRestart=0,TPrescale=128
258 2 WriteRawRC(RegTimerReload,tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
259 2 break;
260 2 }
261 1 WriteRawRC(RegTimerControl,0X06);
262 1 }
263
264 /////////////////////////////////////////////////////////////////////
265 //通过RC500和ISO14443卡通讯
266 //input: pi->MfCommand = RC500命令字
267 // pi->MfLength = 发送的数据长度
268 // pi->MfData[] = 发送数据
269 //output:status = 错误字
270 // pi->MfLength = 接收的数据BIT长度
271 // pi->MfData[] = 接收数据
272 /////////////////////////////////////////////////////////////////////
273 char PcdComTransceive(struct TranSciveBuffer *pi)
274 {
275 1 bit recebyte = 0;
276 1 char status;
277 1 unsigned char irqEn = 0x00;
278 1 unsigned char waitFor = 0x00;
279 1 unsigned char lastBits;
280 1 unsigned char n;
281 1 unsigned int i;
282 1 switch (pi->MfCommand)
283 1 {
284 2 case PCD_IDLE:
285 2 irqEn = 0x00;
286 2 waitFor = 0x00;
287 2 break;
288 2 case PCD_WRITEE2:
289 2 irqEn = 0x11;
290 2 waitFor = 0x10;
291 2 break;
292 2 case PCD_READE2:
293 2 irqEn = 0x07;
294 2 waitFor = 0x04;
295 2 recebyte=1;
296 2 break;
297 2 case PCD_LOADCONFIG:
298 2 case PCD_LOADKEYE2:
299 2 case PCD_AUTHENT1:
300 2 irqEn = 0x05;
301 2 waitFor = 0x04;
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 6
302 2 break;
303 2 case PCD_CALCCRC:
304 2 irqEn = 0x11;
305 2 waitFor = 0x10;
306 2 break;
307 2 case PCD_AUTHENT2:
308 2 irqEn = 0x04;
309 2 waitFor = 0x04;
310 2 break;
311 2 case PCD_RECEIVE:
312 2 irqEn = 0x06;
313 2 waitFor = 0x04;
314 2 recebyte=1;
315 2 break;
316 2 case PCD_LOADKEY:
317 2 irqEn = 0x05;
318 2 waitFor = 0x04;
319 2 break;
320 2 case PCD_TRANSMIT:
321 2 irqEn = 0x05;
322 2 waitFor = 0x04;
323 2 break;
324 2 case PCD_TRANSCEIVE:
325 2 irqEn = 0x3D;
326 2 waitFor = 0x04;
327 2 recebyte=1;
328 2 break;
329 2 default:
330 2 pi->MfCommand = MI_UNKNOWN_COMMAND;
331 2 break;
332 2 }
333 1
334 1 if (pi->MfCommand != MI_UNKNOWN_COMMAND)
335 1 {
336 2 WriteRawRC(RegPage,0x00);
337 2 WriteRawRC(RegInterruptEn,0x7F); //清除中断使能
338 2 WriteRawRC(RegInterruptRq,0x7F); //清除中断标志
339 2 WriteRawRC(RegCommand,PCD_IDLE); //清除Command寄存器
340 2 SetBitMask(RegControl,0x01); //清除FIFO指针
341 2 WriteRawRC(RegInterruptEn,irqEn|0x80);
342 2 for (i=0; i<pi->MfLength; i++)
343 2 {
344 3 WriteRawRC(RegFIFOData, pi->MfData[i]);//将数据写入FIFO
345 3 }
346 2 WriteRawRC(RegCommand, pi->MfCommand);//将指令写入Command寄存器
347 2 i = 0x3500;
348 2 do
349 2 {
350 3 n = ReadRawRC(RegInterruptRq);//当定时器TimerValue 寄存器值减为0 时置位
351 3 i--;
352 3 }
353 2 while ((i!=0) && !(n&irqEn&0x20) && !(n&waitFor));
354 2 status = MI_COM_ERR;
355 2 if ((i!=0) && !(n&irqEn&0x20))
356 2 {
357 3 if (!(ReadRawRC(RegErrorFlag)&0x17))
358 3 {
359 4 status = MI_OK;
360 4 if (recebyte) //从PICC读数据
361 4 {
362 5 n = ReadRawRC(RegFIFOLength);//指示保存在FIFO 缓冲区的字节数
363 5 //写入FIFOData寄存器增加,读减少FIFOLength
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 7
364 5 lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
365 5 if (lastBits)//显示最后接收字节的有效位个数如果为0 整个字节有效
366 5 {
367 6 pi->MfLength = (n-1)*8 + lastBits;
368 6 }
369 5 else
370 5 {
371 6 pi->MfLength = n*8;//计算比特数长度
372 6 }
373 5 if (n == 0)
374 5 {
375 6 n = 1;
376 6 }
377 5 for (i=0; i<n; i++)
378 5 {
379 6 pi->MfData[i] = ReadRawRC(RegFIFOData);//读出FIFO的数据
380 6 }
381 5 }
382 4 }
383 3 else if (ReadRawRC(RegErrorFlag)&0x01)//如果检测到一个位冲突该位置位该位在PrepareRx
384 3 //状态中接收器的启动阶段自动清零
385 3 {
386 4 status = MI_COLLERR;
387 4 if (recebyte)
388 4 {
389 5 n = ReadRawRC(RegFIFOLength);
390 5 lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
391 5 if (lastBits)
392 5 {
393 6 pi->MfLength = (n-1)*8 + lastBits;
394 6 }
395 5 else
396 5 {
397 6 pi->MfLength = n*8;
398 6 }
399 5 if (n == 0)
400 5 {
401 6 n = 1;
402 6 }
403 5 for (i=0; i<n; i++)
404 5 {
405 6 pi->MfData[i+1] = ReadRawRC(RegFIFOData);
406 6 }
407 5 }
408 4 pi->MfData[0]=ReadRawRC(0x0B);
409 4 }
410 3
411 3 }
412 2 else if (n & irqEn & 0x20)
413 2 { status = MI_NOTAGERR; }
414 2 else if (!(ReadRawRC(RegErrorFlag)&0x17))
415 2 { status = MI_ACCESSTIMEOUT; }
416 2 else
417 2 { status = MI_COM_ERR; }
418 2
419 2 WriteRawRC(RegInterruptEn,0x7F);
420 2 WriteRawRC(RegInterruptRq,0x7F);
421 2 SetBitMask(RegControl,0x04); // stop timer now
422 2 WriteRawRC(RegCommand,PCD_IDLE);
423 2 }
424 1 return status;
425 1 }
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 8
426
427 /*
428 /////////////////////////////////////////////////////////////////////
429 //读RC500EEPROM
430 //input :startaddr=EEPROM地址(低位在前)
431 // length=读字节数
432 //output:readdata=读出的数据
433 /////////////////////////////////////////////////////////////////////
434 char PcdReadE2(unsigned int startaddr,unsigned char length,unsigned char *readdata)
435 {
436 char status;
437 struct TranSciveBuffer MfComData;
438 struct TranSciveBuffer *pi;
439 pi = &MfComData;
440
441 MfComData.MfCommand = PCD_READE2;
442 MfComData.MfLength = 3;
443 MfComData.MfData[0] = startaddr&0xFF;
444 MfComData.MfData[1] = (startaddr >> 8) & 0xFF;
445 MfComData.MfData[2] = length;
446
447 status = PcdComTransceive(pi);
448
449 if (status == MI_OK)
450 { memcpy(readdata, &MfComData.MfData[0], length); }
451 return status;
452 }
453 */
454
455 /////////////////////////////////////////////////////////////////////
456 //写RC500EEPROM
457 //input :startaddr=EEPROM地址(低位在前)
458 // length=写字节数
459 // writedata=要写入的数据
460 /////////////////////////////////////////////////////////////////////
461 char PcdWriteE2(unsigned int startaddr,unsigned char length,unsigned char *writedata)
462 {
463 1 char status;
464 1 struct TranSciveBuffer MfComData;
465 1 struct TranSciveBuffer *pi;
466 1 pi = &MfComData;
467 1
468 1 MfComData.MfCommand = PCD_WRITEE2;
469 1 MfComData.MfLength = length+2;
470 1 MfComData.MfData[0] = startaddr&0xFF;
471 1 MfComData.MfData[1] = (startaddr >> 8) & 0xFF;
472 1 memcpy(&MfComData.MfData[2], writedata, length);
473 1
474 1 status = PcdComTransceive(pi);
475 1 return status;
476 1 }
477
478 /////////////////////////////////////////////////////////////////////
479 //开启天线
480 //每次启动或关闭天险发射之间应至少有1ms的间隔
481 /////////////////////////////////////////////////////////////////////
482 char PcdAntennaOn()
483 {
484 1 unsigned char i;
485 1 i = ReadRawRC(RegTxControl);
486 1 if (i & 0x03)
487 1 { return MI_OK; }
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 9
488 1 else
489 1 {
490 2 SetBitMask(RegTxControl, 0x03);
491 2 return MI_OK;
492 2 }
493 1 }
494
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1376 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 88
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -