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

来源:互联网 发布:云计算工程师40岁 编辑:程序博客网 时间:2024/06/09 21:09
发信人:biolink 发表时间:2003-01-14 11:27:52
--------------------------------------------------------------------------------
条件:
所有扇区密码A都为 0xff,0xff,0xff,0xff,0xff,0xff.
复位,寻卡,碰撞,选卡已经成功
我还把 Mf500PiccAuthE2 改了一下:
{
unsigned short e2addr = 0x80 key_sector * 0x18;
unsigned char *e2addrbuf;//= (unsigned char*)&e2addr;
   
   // 如果密码B验证
   if (auth_mode == PICC_AUTHENT1B)
      e2addr = 12; // key B offset
   e2addrbuf[0] = e2addr & 0xff;
   e2addrbuf[1] = e2addr >> 8;
}

问题:
密码验证的结果是 chTempB = MI_KEYERR;
但我看到写入E2PROM之前 code_keys,startaddr都是对的。
怎么回事。  

chComdata[0] = 0xff;
chComdata[1] = 0xff;
chComdata[2] = 0xff;
chComdata[3] = 0xff;
chComdata[4] = 0xff;
chComdata[5] = 0xff;
Mf500PcdLoadKeyE2(PICC_AUTHENT1A,2,chComdata);
chTempB = Mf500PiccAuth(PICC_AUTHENT1A,2,8);
发信人:wuyuehua 发表时间:2003-01-14 12:50:50
--------------------------------------------------------------------------------
  MCM200中的request,selecttag等命令在RC500都有的,只是寄存器不同。

发信人:qishi00 发表时间:2003-01-15 10:35:54
--------------------------------------------------------------------------------
我想察看初始化后各个寄存器的值。
这样行不行?
for (i=0;i<64;i )
{
   x = ReadIo(i);  
   Tx(i);         //发寄存器地址
   Tx(x);         //发寄存器值
}   
初始化时要对哪些寄存器进行初始化啊?
这样读出来的都是 0xFF 啊?
哪位大侠知道啊?

发信人:jiangbo123 发表时间:2003-01-15 13:08:38
--------------------------------------------------------------------------------
是不是你写入的密码没有经过转换,格式不对。密码必须有固定的格式。

发信人:wuyuehua 发表时间:2003-01-16 20:49:06
--------------------------------------------------------------------------------
各位大霞请帮忙分析一下:
   我在执行M500PiccRead时读不到数据,不知何故。我怀疑是前面的验证过程,想请教确认:验证过程的顺序是否如下(密码由FIFO中取)
1.先执行M500PiccAuth(),将格式化后的密钥12BYTE加载到密钥缓冲区
2.执行M500PiccAuthState(),发送AUTHENT1、AUTHENT2命令(执行完后Control寄存器值也为0x08(已加密))
  还有一个问题,扇区号参数在以上函数中未见带入。
  有劳各位多多帮忙!
发信人:mcuduoduo 发表时间:2003-01-16 21:31:50
--------------------------------------------------------------------------------
头一次作IC卡,搞了多天了还是一头雾水,急问:
1。Request_std命令是不是只要写过了,RC500就会自动不停的发送请求,直到有卡进入天线范围?还是程序中要不断的发送这条命令直到有卡?
2、TX1,TX2应该是什么样的波形?我用示波器看得是正弦波。在RC500
发送请求时能观测到什么波形变化?为什么我发出RRANCEIVE命令后波形没有变化?
3。微控制器对RC500的中断应采用边沿还是电平触发方式?
4。RC500上电复位后,读出所有64个寄存器值,10~2F是手册上所讲的,但是所有的RFU虽然值相同但却不是0,而且每次上电读出的结果都不同,为什么?
大虾们小虾们救命啊!!

发信人:zhaiyu 发表时间:2003-01-17 11:45:24
--------------------------------------------------------------------------------
我的是:ZHAI_YU@21CN.COM

发信人:hb923 发表时间:2003-01-17 11:47:40
--------------------------------------------------------------------------------
发信人:wuyuehua 发表时间:2003-01-17 13:35:00
--------------------------------------------------------------------------------
   请问在AUTHENT执行过程中,扇区号是在哪一个函数中带入的

发信人:stevenson 发表时间:2003-01-17 17:02:00
--------------------------------------------------------------------------------
发信人:wuyuehua 发表时间:2003-01-18 18:00:44
--------------------------------------------------------------------------------
   执行PICC_WRITE命令,指定块号后,
请问: 准备写入该块的数据(16字节)是暂存放在什么地方?是在FIFO中吗?

发信人:flyfisher 发表时间:2003-01-18 19:40:20
--------------------------------------------------------------------------------
531这东西很好用,AB兼容,很好玩的! :)

发信人:biolink 发表时间:2003-01-20 12:17:34
--------------------------------------------------------------------------------
1、电路板问题,我复位成功后寻卡不成,而且是超时错误,我用示波器看TX1,TX2正常,但Rx信号振幅太小,于是借用样机的天线部分,进行到碰撞,正常,但密码验证老是返回MI_KEYERR,(这里源码也有点问题,下面再讨论),于是我全用样机电路调试,直到完成。
我的感觉是板(天线)一定要正确,否则出问题都不能用常理解释判断。调试过程由于板的问题让我有一种没撤的感觉,只是在那里凭经验和直觉做做做,就象大海捞针,繁啊,但心还不能烦。
2、源码的的修改,我改了3个地方。
   1)函数 PcdReset(void)  (jiangbo123前已说过)
       // jiangbo123建议,注释掉
       //while (((ReadRawRC(RegCommand) & 0x3F) != 0x3F) && !T3IR);
      // while reset sequence in progress
      while ((ReadRawRC(RegCommand) & 0x3F) && !T3IR);
   2)函数 Mf500PiccAuthE2()
      // 下面这句引起非法指针,编译器是"Keil 51"
      // 编译可以通过,但好象不分配内存
      //unsigned char *e2addrbuf; //= (unsigned char*)&e2addr;
      if (auth_mode == PICC_AUTHENT1B)
      e2addr = 12; // key B offset   
   
      PcdSetTmo(106);
      FlushFIFO();    // empty FIFO
      ResetInfo(MInfo);
      //memcpy(MSndBuffer,e2addrbuf,2); // write low and high byte of address
      MInfo.nBytesToSend   = 2;
      // 自改,
      MSndBuffer[0] = e2addr & 0xff;
      MSndBuffer[1] = (e2addr >> 8) & 0xff;
   3)函数 Mf500PiccRead()
      FlushFIFO();    // empty FIFO
      //PcdSetTmo(640);  // long timeout
      // 自改,改之前返回超时错误
      PcdSetTmo(1000);  // long timeout
      WriteRC(RegChannelRedundancy,0x0F); // RxCRC, TxCRC, Parity enable
3、还剩的几个问题,大家
   1)寻卡是奇次失败,偶次成功(jiangbo123也提出过)
   2)寻卡只能寻其中的两张(前面已有人提出)
   3)写卡,增值等返回超时错误,但又已经写进去了
4、愿望
   由于天线设计要求比较高,等我天线作好后我会提供出来,同时也希望已经调试成功的而且效果比较好的各位同行把电路板共享出来,这可能会关系到市场竞争,但我希望在更高的层次上竞争,不要为一个电路板而很多人做重复劳动,浪费大家的时间,这从某种意义上也是浪费我们中国(人)的时间。在开发过程中我也从本论坛获取了很多有用的信息,在此特别感谢jiangbo123及飞环的stevenson.

发信人:cwcyxy 发表时间:2003-01-20 12:57:16
--------------------------------------------------------------------------------
你修改的3处源代码没有错误。
还剩下的问题到是有错误,那我的reset函数举例:
#define BYTE unsignedchar
BYTE M500PcdReset(void)
{
    BYTE status=MI_OK;
  
    RC500RST = 1;   
    delay_50us(500);  
    RC500RST = 0;  
    start_timer0(210);     
    
    while (((ReadIO(RegCommand) & 0x3F) != 0x3F) && !T0IR);
    
    while ((ReadIO(RegCommand) & 0x3F) && !T0IR);
    
    stop_timer0();          
    if (T0IR)         
    {
        status = MI_RESETERR;
    }
    else
    {
        WriteIO(RegPage,0x80);
        if (ReadIO(RegCommand) != 0x00)
        {                           
            status = MI_INTERFACEERR;
        }
        else
        {
            WriteIO(RegPage,0x00);
            WriteIO(RegClockQControl,0x0);
            WriteIO(RegClockQControl,0x40);
            delay_50us(2);  
            ClearbitMask(RegClockQControl,0x40);
            WriteIO(RegTimerControl,0x02);
            WriteIO(RegTestAnaSelect,0x01);
            ClearbitMask(RegTxControl,0x03);  
            delay_50us(20);
            SetbitMask(RegTxControl,0x03);  
            delay_50us(20);
        }
    }
    return status;
}
发信人:cwcyxy 发表时间:2003-01-20 13:00:44
--------------------------------------------------------------------------------
寻卡时:
if (mifs_request(ALL, tt) != MI_OK)
{
   if (mifs_request(ALL, tt) !=MI_OK)
   return ;
}  

发信人:cwcyxy 发表时间:2003-01-20 13:02:54
--------------------------------------------------------------------------------
这句要看编译器,而不是错误。

发信人:cwcyxy 发表时间:2003-01-20 13:05:27
--------------------------------------------------------------------------------
void M500PcdSetTmo(BYTE tmoLength)
{
    switch(tmoLength)
    {  
        case 1:                       
            WriteIO(RegTimerClock,0x07);
            WriteIO(RegTimerReload,0x6a);
            break;
        case 2:                       
            WriteIO(RegTimerClock,0x07);
            WriteIO(RegTimerReload,0xa0);
            break;
        case 3:                       
            WriteIO(RegTimerClock,0x09);
            WriteIO(RegTimerReload,0xa0);
            break;
        case 4:                                        
            WriteIO(RegTimerClock,0x09);           
            WriteIO(RegTimerReload,0xff);
            break;
        case 5:                     
            WriteIO(RegTimerClock,0x0b);
            WriteIO(RegTimerReload,0xff);
            break;
        case 6:                       
            WriteIO(RegTimerClock,0x0d);
            WriteIO(RegTimerReload,0xff);
            break;
        case 7:                       
            WriteIO(RegTimerClock,0x0f);
            WriteIO(RegTimerReload,0xff);
            break;
        default:                        
            WriteIO(RegTimerClock,0x07);
            WriteIO(RegTimerReload,tmoLength);
            break;
    }     
}
还是:
char PcdSetTmo(unsignedlong tmoLength)
{
    unsigned char prescale = 7;
    unsigned long reload = tmoLength;
    while (reload > 255)
    {
       prescale ;
       reload = reload >> 1; // division by 2
    }
    // if one of the higherbits are set, the prescaler is set
    // to the largest value
    if (prescale > 0x15)
    {
       prescale = 0x15;
       reload   = 0xFF;
    }
    // fcnt = 13560000 / (2^prescale)
    // T = (reload - counter) / fcnt
    WriteRC(RegTimerClock,prescale); // TautoRestart=0,TPrescale=prescale
    WriteRC(RegTimerReload,reload);// TReloadVal = reload
    
    return MI_OK;
}
PcdSetTmo(1000) 相当于
       WriteIO(RegTimerClock,0x09);
       WriteIO(RegTimerReload,0xfa);  //9.375ms
PcdSetTmo(640) 相当于
       WriteIO(RegTimerClock,0x09);
       WriteIO(RegTimerReload,0xa0); //6ms
发信人:cwcyxy 发表时间:2003-01-20 13:20:46
--------------------------------------------------------------------------------
demo函数的防冲突函数有错误。就是能寻两张卡,经我更改可以寻32张了。
写函数有错误,值操作函数没有。

发信人:cwcyxy 发表时间:2003-01-20 13:27:59
--------------------------------------------------------------------------------
天线设计是比较难的,网络参数匹配不好,难以达到理想的距离。
我也搞不到10cm。
这里我咨询了stevench.jiang—philips上海办事处的技术支持,单端输出也只能达到6cm,双端8cm。

发信人:jiangbo123 发表时间:2003-01-20 14:06:03
--------------------------------------------------------------------------------
你能不能将防冲突函数和写函数的错误,以及怎么修改提供出来大家研究?

发信人:cwcyxy 发表时间:2003-01-20 14:34:47
--------------------------------------------------------------------------------
发信人:jiangbo123 发表时间:2003-01-20 16:00:14
--------------------------------------------------------------------------------
发信人:cwcyxy 发表时间:2003-01-20 17:03:45
--------------------------------------------------------------------------------
BYTE mifs_write(BYTE _Adr, BYTE *_data)
{
    BYTE idata status = MI_OK;
    
    ResetInfo();   
    SndBuffer[0] = PICC_WRITE;        
    SndBuffer[1] = _Adr;
    nBytesToSend = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE);
    if (status != MI_NOTAGERR)   
    {
        if (nbitsReceived != 4)   
        {
            status = MI_bitCOUNTERR;
        }
        else                    
        {
            RcvBuffer[0] &= 0x0f;
            if ((RcvBuffer[0] & 0x0a) == 0)
            {
                status = MI_NOTAUTHERR;                   
            }
            else
            {
                if (RcvBuffer[0] == 0x0a)
                {
                    status = MI_OK;
                }
                else
                {
                    status = MI_codeERR;
                }
            }
        }
    }
    if ( status == MI_OK)
    {
        M500PcdSetTmo(3);      
        
        ResetInfo();   
        memcpy(SndBuffer,_data,16);
        nBytesToSend   = 16;
        status = M500PcdCmd(PCD_TRANSCEIVE);
        
        if (status != MI_NOTAGERR)    
        {
            if (nbitsReceived != 4)  
            {
                status = MI_bitCOUNTERR;
            }
            else                     
            {
                RcvBuffer[0] &= 0x0f;
                if ((RcvBuffer[0] & 0x0a) == 0)
                {
                    status = MI_WRITEERR;
                }
                else
                {
                    if (RcvBuffer[0] == 0x0a)
                    {
                        status = MI_OK;
                    }
                    else
                    {
                        status = MI_codeERR;
                    }
                }     
            }
        }           
    }
    return status;
}

发信人:jiangbo123 发表时间:2003-01-21 10:45:17
--------------------------------------------------------------------------------
发信人:jiangbo123 发表时间:2003-01-22 17:17:28
--------------------------------------------------------------------------------
发信人:LUCKYWBL 发表时间:2003-01-22 17:36:23
--------------------------------------------------------------------------------
您好:
    我现在正在做一个IC卡的读写项目,用的是SLE4428,时序按照dataSHEET做的,可就是读不出数据,请高手赐教!谢谢!

发信人:jiangbo123 发表时间:2003-01-23 08:31:45
--------------------------------------------------------------------------------
发信人:jiangbo123 发表时间:2003-01-23 08:33:53
--------------------------------------------------------------------------------
发信人:biolink 发表时间:2003-01-23 10:09:08
--------------------------------------------------------------------------------
  前两天有事,今天上来看,cwcyxy 已发了这么多帖子,有道理,很有感触,我再试试看。

发信人:lijg68 发表时间:2003-01-27 10:25:36
--------------------------------------------------------------------------------
帮帮忙,有人知道at88sc102的51原代码?

发信人:han_chl 发表时间:2003-01-27 15:15:08
--------------------------------------------------------------------------------
我以前用过F C51,不知道K C51与之有什么区别,有书吗?帮帮忙

发信人:antilope 发表时间:2003-02-10 18:17:23
--------------------------------------------------------------------------------
用CM500读的正常,RC500却出错为何?PRO卡芯片为SIMENS的

发信人:jiangbo123 发表时间:2003-02-11 08:35:00
--------------------------------------------------------------------------------
那是个庞然大物,呵呵。是很久以前用的吧?

发信人:傲气雄鹰 发表时间:2003-02-11 08:40:31
--------------------------------------------------------------------------------
发信人:cwcyxy 发表时间:2003-02-11 08:49:03
--------------------------------------------------------------------------------
发信人:刷新者 发表时间:2003-02-11 15:45:05
--------------------------------------------------------------------------------
Rc500,我还没有这方面的资料,我用的是mcm200,快用完了,想换。希望那位可以发一份Rc500的datasheet和天线的设计资料,多谢!

发信人:hjmc 发表时间:2003-02-11 16:51:43
--------------------------------------------------------------------------------
rc500天线板的设计 可不可以将电感画到天线板上,呜呜

发信人:爬到最顶峰 发表时间:2003-02-11 19:36:17
--------------------------------------------------------------------------------
请问有没有哪家公司的射频卡读卡器可以对感应区内的6张射频卡轮流读卡?急需!!!

发信人:jiangbo123 发表时间:2003-02-11 19:51:53
--------------------------------------------------------------------------------
可惜我没有试过。
发信人:wjianfang 发表时间:2003-02-12 13:25:08
--------------------------------------------------------------------------------
发信人:求是 发表时间:2003-02-12 13:37:42
--------------------------------------------------------------------------------
发信人:cwcyxy 发表时间:2003-02-12 14:27:39
--------------------------------------------------------------------------------
最多只能6张。

发信人:yzx8069 发表时间:2003-02-13 10:23:13
--------------------------------------------------------------------------------
我公司有,一下读55张卡进去。就是说提一袋子卡一下全部读进去。距离为1--4米,不过是有源卡。
Census?系列远距离读卡器和感应卡   
◆ 感应距离在1m~4m
◆ 可同时识别多达55张感应卡
◆ 读卡速度可达60公里/小时
◆ 应用于停车场、“Hand Free”门禁系统、会议报到
www.smartkey.net

发信人:cwcyxy 发表时间:2003-02-13 15:13:35
--------------------------------------------------------------------------------
发信人:爬到最顶峰 发表时间:2003-02-14 08:54:45
--------------------------------------------------------------------------------
可不可以这样轮流读卡,有人做到了吗?

发信人:cwcyxy 发表时间:2003-02-14 09:09:26
--------------------------------------------------------------------------------
发信人:爬到最顶峰 发表时间:2003-02-14 09:51:11
--------------------------------------------------------------------------------
请教各位大侠,可能是什么原因?

发信人:jiangbo123 发表时间:2003-02-14 14:14:32
--------------------------------------------------------------------------------
发信人:爬到最顶峰 发表时间:2003-02-14 14:23:45
--------------------------------------------------------------------------------
有3张卡或以上时只会读其中的2中,而不理别的卡,
我有点不明白了

发信人:suzituan 发表时间:2003-02-14 14:29:54
--------------------------------------------------------------------------------
发信人:cdll 发表时间:2003-02-14 15:22:26
--------------------------------------------------------------------------------
大家好:我有一个问题请教一下大家,我在对RC500进行值操作时(加、减、恢复),第一步送操作命令,有正确代码返回,第二步送数据,超时无数据返回,若不管,紧接着进行第三步,第三步送传输命令则有正确代码返回,且卡片中的数据也按期望的修改,而对卡和RC500进行其他命令操作时均正常,望得到大家的指点,我的程序采用C语言查询方式操作,配置按飞利浦推荐配置。

发信人:yeqx 发表时间:2003-02-15 13:31:54
--------------------------------------------------------------------------------
复位的命令可通过,不过后面的命令使我的RC500烧坏,我都不敢往下调试,请问众位高手有何办法,有使用44B0X开发经验的请指教。

发信人:wzhongf 发表时间:2003-02-15 23:01:19
--------------------------------------------------------------------------------
我可以给正在摸索的同行提供免费的参考代码(IAR System EW8051 C source code),有兴趣者可以mail联系!
wzf@reformer.com.cn
www.reformer.com.cn

发信人:爬到最顶峰 发表时间:2003-02-17 09:08:23
--------------------------------------------------------------------------------
发信人:tpu 发表时间:2003-02-17 09:49:32
--------------------------------------------------------------------------------
我用44b0x linux搞rc531,都没有任何问题。

发信人:stevenson 发表时间:2003-02-17 13:13:48
--------------------------------------------------------------------------------
在过去的一年里,得到了各位工程师们的大力支持和帮助,在此,我代表飞环电子向大家表示衷心的感谢,并希望在新的一年里,能够继续得到大家的支持。
  并祝各位工作顺利!

发信人:stevenson 发表时间:2003-02-17 13:15:47
--------------------------------------------------------------------------------
过去的一年里,得到了各位工程师们的大力支持和帮助,在此,我代表飞环电子向大家表示衷心的感谢,并希望在新的一年里,能够继续得到大家的支持。
  并祝各位工作顺利!
发信人:zhoujj 发表时间:2003-02-17 14:31:27
--------------------------------------------------------------------------------
谢谢!

发信人:wzhongf 发表时间:2003-02-17 21:00:19
--------------------------------------------------------------------------------
发信人:zhoujj 发表时间:2003-02-18 08:10:43
--------------------------------------------------------------------------------
我也需要,能不能发给我阿,我一个人在开发,没有经验,进展好慢。
能发给我参考吗?谢谢,我的
eamil:zhoujj@guoguang.com.cn

发信人:jack_chen 发表时间:2003-02-18 08:43:01
--------------------------------------------------------------------------------
需要资料的话可以和飞环电子联系,philips对工程师私下的资料不保证可靠性,也不会提供任何的技术支持,不知道大家怎么都不愿意联系下philips,至少是用人家的东西阿,再说这些资料也是不收费的,对由于私下传送的资料造成的任何损失philips不负责的!联系方式请看stevenson的,或者直接找philips的stevenCH,前面有联系方式,谢谢大家,请创造良好的一个开发氛围!

发信人:傲气雄鹰 发表时间:2003-02-18 09:40:18
--------------------------------------------------------------------------------
是philips不给
我每年要货100个RC500的话你们肯给资料我也不用那么麻烦的

发信人:傲气雄鹰 发表时间:2003-02-18 10:05:10
--------------------------------------------------------------------------------
资料成了代理们要挟小客户的工具了
发信人:handf 发表时间:2003-02-18 11:33:06
--------------------------------------------------------------------------------
小弟没玩过light卡,看它的存储结构不太一样,想向各位征集一下这种卡的操作方法,特别是卡认证、读写操作。我先谢谢了!

发信人:jack_chen 发表时间:2003-02-18 13:10:10
--------------------------------------------------------------------------------
我们飞环电子从没有这样,不管是对大客户还是小客户,都是一样的,都会提供支持,实际我们从没有要求客户必须买多少,才会给资料,而且就是开发完成后也没硬性要求必须在我们处买,可以自己选择,我们是靠服务以及实在的价格做的,不相信的话可以联系我们,或者你们也可以找在我们这得到资料的工程师去问问,我们有没有要挟的要求,毕竟客户才是我们的上帝!

发信人:傲气雄鹰 发表时间:2003-02-18 15:45:23
--------------------------------------------------------------------------------
发信人:sunlight 发表时间:2003-02-18 21:17:39
--------------------------------------------------------------------------------
发信人:zhoujj 发表时间:2003-02-19 08:39:04
--------------------------------------------------------------------------------
发信人:tpu 发表时间:2003-02-19 10:25:40
--------------------------------------------------------------------------------
不管什么卡,只要符合TypeA协议,都可以用RC500来读。
原创粉丝点击