(13)mifare卡读写器开发心得『转』--整理重发贴

发信人: john wu 发表时间: 2003-10-23 12:54:16
--------------------------------------------------------------------------------
   困扰了我五天,终于发现了DEMO程序的又一个BUG。在Anticollision里面:
   如果按照下面的程序运行,到Select Card的时候,就算地球毁灭卡也不会返回SAK(rc531是这样,我不知rc500是不是)。何故?
   在Anticollision开始的时候激活了ZeroAfterColl,就是下面的语句:
   WriteIO(RegDe coderControl,0x28); // ZeroAfterColl aktivieren(这个单词谁认识?)   
   在Anticollision结束的时候disable了ZeroAfterColl,就是下面的语句:
   Clear bitMask(RegDe coderControl,0x20); // ZeroAfterColl disable
   De coderControl & 0x20写回De coderControl这样能Disable ZeroAfterColl吗???
///////////////////////////////////////////////////////////////////////
//          M I F A R E    A N T I C O L L I S I O N
// for extended serial numbers
///////////////////////////////////////////////////////////////////////
char M500PiccCascAnticoll ( unsigned char select_ code,
                            unsigned char bcnt,       
                            unsigned char *snr)       
{
    char idata status = MI_OK;
    char idata snr_in[4];      // copy of the input parameter snr
    char idata nbytes = 0;
    char idata n bits = 0;
    char idata complete = 0;
    char idata i        = 0;
    char idata byteOffset = 0;
    unsigned char idata snr_crc;
    unsigned char idata snr_check;
    unsigned char dummyShift1;        // dummy byte for snr shift
    unsigned char dummyShift2;        // dummy byte for snr shift   

    //************* Initialisation ******************************
   M500PcdSetTmo(106);
   memcpy(snr_in,snr,4);   
   
   WriteIO(RegDe coderControl,0x28); // ZeroAfterColl aktivieren(这个单词谁认识?)   
   Clear bitMask(RegControl,0x08);     // disable crypto 1 unit
      
    //************** Anticollision Loop ***************************
   complete = 0;
//   bcnt = 0;   // no part of the snr is known
    while (!complete && (status == MI_OK) )
   {
      ResetInfo(MInfo);           
      WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
      n bits = bcnt % 8;    // remaining number of bits
       if (n bits)
      {
         WriteIO(Reg bitFraming,n bits << 4 | n bits); // TxLastbits/RxAlign auf nb_bi
         nbytes = bcnt / 8 1;   
          // number of bytes known
          // in order to solve an inconsistancy in the anticollision sequence
          // (will be solved soon), the case of 7 bits has to be treated in a
          // separate way - please note the errata sheet
          if (n bits == 7)
         {
            MInfo.cmd = PICC_ANTICOLL1;    // pass command flag to ISR        
            WriteIO(Reg bitFraming,n bits); // reset RxAlign to zero
         }
      }
       else
      {
         nbytes = bcnt / 8;
      }
      MSndBuffer[0] = select_ code;
      MSndBuffer[1] = 0x20 ((bcnt/8) << 4) n bits; //number of bytes send
               
       for (i = 0; i < nbytes; i )   // Sende Buffer beschreiben
      {
         MSndBuffer[i 2] = snr_in;
      }
      MInfo.nBytesToSend   = 2 nbytes;   

      status = M500PcdCmd(PCD_TRANSCEIVE,
                         MSndBuffer,
                         MRcvBuffer,
                         &MInfo);
   
    
       // in order to solve an inconsistancy in the anticollision sequence
       // (will be solved soon), the case of 7 bits has to be treated in a
       // separate way
       if (n bits == 7)
      {
          // reorder received bits
         dummyShift1 = 0x00;
          for (i = 0; i < MInfo.nBytesReceived; i )
         {
            dummyShift2 = MRcvBuffer;
            MRcvBuffer = (dummyShift1 >> (i 1)) | (MRcvBuffer << (7-i));
            dummyShift1 = dummyShift2;
         }
         MInfo.n bitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
          // recalculation of collision position
          if ( MInfo.collPos ) MInfo.collPos = 7 - (MInfo.collPos 6) / 9;
      }
         
       if ( status == MI_OK || status == MI_COLLERR)     // no other occured
      {
          // R e s p o n s e   P r o c e s s i n g   
          if ( MInfo.n bitsReceived != (40 - bcnt) ) // not 5 bytes answered
         {
            status = MI_ bitCOUNTERR; // Exit with error
         }
          else
         {
            byteOffset = 0;
            if( n bits != 0 ) // last byte was not complete
            {
                snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
                byteOffset = 1;
            }
             for ( i =0; i < (4 - nbytes); i )     
            {
               snr_in[nbytes i] = MRcvBuffer[i byteOffset];
            }
  
             if (status != MI_COLLERR ) // no error and no collision
            {
                // SerCh check
               snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
               snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
                if (snr_crc != snr_check)
               {
                  status = MI_SERNRERR;
               }
                else   
               {
                  complete = 1;
               }
            }
             else                    // collision occured
            {
               bcnt = bcnt MInfo.collPos - n bits;
               status = MI_OK;
            }
         }
      }
   }
    if (status == MI_OK)
   {
       // transfer snr_in to snr
      memcpy(snr,snr_in,4);
   }
    else
   {
      memcpy(snr," 0000",4);
   }
    //----------------------Einstellungen aus Initialisierung ruecksetzen
   Clear bitMask(RegDe coderControl,0x20); // ZeroAfterColl disable
   
    return status;  
}
    

发信人: cxshj 发表时间: 2003-10-23 15:58:30
--------------------------------------------------------------------------------
在对rc500进行复位的时候原来有这样的语句:
while (((ReadRawIO(RegCommand) & 0x3F) != 0x3F) && !T2IR);
    // while reset sequence in progress
while ((ReadRawIO(RegCommand) & 0x3F) && !T2IR);
我的板子经常在第2个 while语句处出现超时错误(由于T2IR退出循环)
为什么??

发信人: cwcyxy 发表时间: 2003-10-23 17:08:58
--------------------------------------------------------------------------------
另外你说的这个bug ,好像没错,我相信大家都是用的这个寄存器简化冲突后的
流程。

发信人: cxshj 发表时间: 2003-10-24 11:17:23
--------------------------------------------------------------------------------
损坏芯片的寄存器
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00 00 31 01 00 60 00 01 00 00 00 00 0A FF 63 00
00 5B 3F 3F 19 13 00 00 00 73 08 AD FF 00 01 08
00 06 03 63 63 00 02 01 00 04 07 02 6A 03 01 01
00 01 01 01 01 01 01 01 00 01 01 01 01 01 01 FE
5555555,芯片就这样离我而去,55555

发信人: jiangbo123 发表时间: 2003-10-27 10:53:34
--------------------------------------------------------------------------------
参考我前面的帖子。

发信人: jiangbo123 发表时间: 2003-10-27 10:55:20
--------------------------------------------------------------------------------
前面也讨论过,可以将它屏蔽掉试试。

发信人: victorymay 发表时间: 2003-10-27 12:00:32
--------------------------------------------------------------------------------
我的DEMO寻卡距离达到8CM,也有更好的达到9cm,但不知有否网友已达到10cm
                                                   多多交流

发信人: jiangbo123 发表时间: 2003-10-31 09:31:46
--------------------------------------------------------------------------------
发信人: qgque 发表时间: 2003-10-31 12:02:02
--------------------------------------------------------------------------------
现在程序包括键盘、显示、通信模块,加上RC500模块之后只要卡靠近天线,单片机就复位,程序中包括定时器T0中断、外部EX0中断和串行中断, data空间占用160BYTES左右,RC500模块程序没有问题。

发信人: zbq8 发表时间: 2003-10-31 13:43:55
--------------------------------------------------------------------------------
1

发信人: jie9621 发表时间: 2003-11-04 08:38:59
--------------------------------------------------------------------------------
jiangbo 大侠: 能否把你用 RC531 操作 TYPE B 卡的例程贴出来? 供兄弟朋友们参考参考? 谢谢!

发信人: jiangbo123 发表时间: 2003-11-04 13:27:19
--------------------------------------------------------------------------------
发信人: google 发表时间: 2003-11-04 15:31:23
--------------------------------------------------------------------------------
发信人: zyfcn 发表时间: 2003-11-04 17:56:58
--------------------------------------------------------------------------------
本人做过多个51单片机项目,经验丰富,现在在一家专业单片机研发公司
设计产品。本人愿意为客户设计单片机产品,有这方面需求的请与本人联系。
姓名:张云峰     电话:13951582096    email: zyfsmail@163.com
住址:无锡市

发信人: xiaoyuer 发表时间: 2003-11-06 09:48:06
--------------------------------------------------------------------------------
        你好,
         我想在操作一张卡后,停止对这张卡的任何操作,可是我用HALT命令做不到这一点。请高手指点迷津,非常感谢!
         ALEXLIUHY@HOTMAIL.COM

发信人: cxshj 发表时间: 2003-11-06 10:30:59
--------------------------------------------------------------------------------
rc500没有发射信号,读寄存器值如下:
损坏芯片的寄存器
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00 00 31 01 00 60 00 01 00 00 00 00 0A FF 63 00
00 5B 3F 3F 19 13 00 00 00 73 08 AD FF 00 01 08
00 06 03 63 63 00 02 01 00 04 07 02 6A 03 01 01
00 01 01 01 01 01 01 01 00 01 01 01 01 01 01 FE
但读rc500内的eerom参数是正常的,感觉不是软件损坏,而是真的不行了
(没找到真正的损坏原因,这个比较恍惚;) )   
你前面的帖子我参考过了。那是在eerom错误的情况下
你有损坏的芯片吧,读rc500的寄存器是否同上


发信人: qingqingxz 发表时间: 2003-11-06 15:56:22
--------------------------------------------------------------------------------
   请问有人用MSP430+RC500做过射频卡读写器吗?

发信人: xjs2004 发表时间: 2003-11-11 13:15:37
--------------------------------------------------------------------------------
发信人: xjs2004 发表时间: 2003-11-11 13:22:11
--------------------------------------------------------------------------------
发信人: 引擎 发表时间: 2003-11-11 13:49:04
--------------------------------------------------------------------------------
关于此问题的说明还有没有了????

发信人: yfang2 发表时间: 2003-11-11 15:23:26
--------------------------------------------------------------------------------
在菲利蒲网站上载的一些关于mifare的 PDF文档加密了,申请表格E文看不懂不知有谁知道密码的。能贡献一下啊!?

发信人: 行星 发表时间: 2003-11-11 19:28:54
--------------------------------------------------------------------------------
可否发一份mifare的详细开发资料,贡献一份!
最好能包含源代码(汇编的,或者c的),十分感谢!
zxcopycn@sohu.com

发信人: jiangbo123 发表时间: 2003-11-11 20:27:58
--------------------------------------------------------------------------------
to cxshj:
我原来也有一些坏的,但是基本是软件损坏,都是调试下载密码函数的时候,计算eeprom的地址不对损坏的,硬件损坏的好像很少,只是一次不小心接上了12v电压烧了一片。一般判断rc500是否正常工作,就是测量晶振信号,以及芯片的第5脚和第7脚,如果有波形输出,应该就没有问题。另外rc500上电之后并不是立即有波形,而是对rc500初始化配置成功之后才有输出。

发信人: jiangbo123 发表时间: 2003-11-11 20:33:15
--------------------------------------------------------------------------------
halt指令只是停止当前卡操作,使卡进入idle状态,这样就只有request all可以再次激活它,所以如果应用程序只提供了request standard方式寻卡,就可以防止卡在执行了halt之后再次被操作。如果使用request all命令,是没有办法阻止再次操作同一张卡的。

发信人: jiangbo123 发表时间: 2003-11-11 20:36:07
--------------------------------------------------------------------------------
to yfang2:
   文档的密码可以直接找飞环电子要,前面的帖子有他们的广告。呵呵。
to :行星
  世界上没有免费午餐,一般人是不会把源代码什么随便发给你的。

发信人: jiangbo123 发表时间: 2003-11-11 20:41:13
--------------------------------------------------------------------------------
一度以为它将永远的沉下去,没想到今天再次被顶上来!呵呵。
另外,小弟最近空闲时间比较多,大家有什么项目外包,也欢迎和我联系,我一直从事ic卡机具开发,对cpu卡,存储卡,磁条卡,type a卡,type b卡都比较熟悉,用过51,龙珠(uclinux),arm(uclinux)。如果有什么问题想和我交流,都可以在此跟贴或者给我发email:strive_2003@163.com

21IC.com 版权所有
//本文程序代码由xwj设计的UltraEdit脚本加亮显示,如需要脚本请联系xuwenjun@21cn.com
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值