ospic 发表于 2012-11-7 19:51

RC522写数据问题

我用RC522与S50卡做个系统,卡是与其它系统共用,目前复位、设置、寻卡、防冲撞、选定卡片、密码A认证、读数据步骤以通过,但写数据没有通过。
资料上写,写入数据成功后返回0x0A(1010),但我的系统返回0x05。
读块3中的控制码为 7F 07 88 FF。
控制码:7F 07 88 FF   高4位   低4位   块3 011 011
字节6 7F = 01111111    C2 1000   C1 0000块2 000 000
字节7 07 = 00000111    C1 0000   C3 1000块1 000 000
字节8 88 = 10001000    C3 1000   C2 1000块0 000 000
                           块3-0   块3-0
从控制码分析,块0--块2应该是密码A认证后可对0--2块读写。
不知为什么写不进去,那位高手能帮帮我,先谢谢了。

ocon 发表于 2012-11-8 00:06

检查你的写函数是否有BUG;
用成品读卡器测试卡片读写是否正常,密码是否对头;
卡片出厂时初始密码一般为6个0xff;

ospic 发表于 2012-11-8 09:17

首先谢谢您(2楼),写函数
char PcdWrite(unsigned char addr,unsigned char *pData)
{
    char status;
    unsigned intunLen;
    unsigned char i,ucComMF522Buf;
    ucComMF522Buf = PICC_WRITE;
    ucComMF522Buf = addr;   
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf);   
    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
    if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf & 0x0F) != 0x0A)){
            status = (char)MI_ERR;
    }
    if (status == MI_OK){
      for (i=0; i<16; i++){
              ucComMF522Buf = *(pData+i);
      }
      CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf);
      status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
      if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf & 0x0F) != 0x0A)){
      {        status = (char)MI_ERR; }
      }
    }   
    return(status);
}
1、我想网上的大部分都是这个。
2、成品读卡器读写没问题,试过了。
3、卡是与其它系统共用,密码以认证,没有认证数据也读不出来呀。
4、我猜想是不是初始化设置的问题,有那位高手有好用的初始化设置代码上传一个,我对比看看。
我的
char PcdReset(void)
{
        unsigned char i;
    RST522_1();
    _NOP();
    RST522_0();
   _NOP();
    RST522_1();
   _NOP();
    WriteRawRC(CommandReg,PCD_RESETPHASE);          //软件复位
    for(i=0;i<120;i++){
          ;       
   }
    WriteRawRC(ModeReg,0x3D);//定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363
    WriteRawRC(TReloadRegL,30);//16位定时器低位 30
    WriteRawRC(TReloadRegH,0);//16位定时器高位
    WriteRawRC(TModeReg,0x8D);//定义内部定时器的设置
    WriteRawRC(TPrescalerReg,0x3E);//设置定时器分频系数
    WriteRawRC(TxAutoReg,0x40);      //调制发送信号为100%ASK
      return(MI_OK);
}
//////////////////////////////////////////////////////////////////////   
//设置RC632的工作方式   
//////////////////////////////////////////////////////////////////////   
char M500PcdConfigISOType(unsigned char type)   
{   
   if (type == 'A')                     //ISO14443_A   
   {   
       //ISO14443_A
       ClearBitMask(Status2Reg,0x08);   
       WriteRawRC(ModeReg,0x3d);//3F
       WriteRawRC(RxSelReg,0x86);//84   
       WriteRawRC(RFCfgReg,0x4F); //4F    接收器增益4F = 33dB; 7F = 48dB
       WriteRawRC(TReloadRegL,30);                                                      
       WriteRawRC(TReloadRegH,0);   
       WriteRawRC(TModeReg,0x8D);   
       WriteRawRC(TPrescalerReg,0x3E);   
       WriteRawRC(TxAutoReg,0x40);    //调制发送信号为100%ASK
       Delay(1);   
       PcdAntennaOn();   
   }   
   else
   { return((char)MI_NOTAGERR); }   
   return(MI_OK);   
}

ocon 发表于 2012-11-8 10:28


char PcdReset(void)
{
    RC522RST=1;
    delay_cycles(50);
    RC522RST=0;//硬件复位
    delay_cycles(50);
    RC522RST=1;
    delay_cycles(50);
    WriteRawRC(CommandReg,PCD_RESETPHASE);//复位
    WriteRawRC(ModeReg,0x3D);    //和Mifare卡通讯
    WriteRawRC(TReloadRegL,30);         
    WriteRawRC(TReloadRegH,0);
    WriteRawRC(TModeReg,0x8D);
    WriteRawRC(TPrescalerReg,0x3E);
    WriteRawRC(TxAutoReg,0x40);//必须要
    return MI_OK;
}
char M500PcdConfigISOType(unsigned char type)
{
    if (type == 'A'){ //ISO14443_A
      ClearBitMask(Status2Reg,0x08);
      WriteRawRC(ModeReg,0x3D);//3F
      WriteRawRC(RxSelReg,0x86);//84
      WriteRawRC(RFCfgReg,0x7F);   //4F
      WriteRawRC(TReloadRegL,30);//
      WriteRawRC(TReloadRegH,0);
      WriteRawRC(TModeReg,0x8D);
      WriteRawRC(TPrescalerReg,0x3E);
      delay_us(100);
      PcdAntennaOn();
    }
    else{
      return -1;
    }
    return MI_OK;
}

ospic 发表于 2012-11-8 10:55

谢谢4楼的代码,基本差不多,只有设置增益有差别,我的天线增益设0x4F时效果最好,距离可达6厘米。其它值也试过,距离和效果都不好,也没能解决写入数据的问题。我这个天线其它系统也在用应该没问题。

ospic 发表于 2012-11-8 10:59

真是搞不懂了,能读却不能写,愁呀!!!

yirongfu 发表于 2012-11-8 12:40

写之前再验证一次密钥了吧?我以前遇到的情况如果读后接着写,似乎不行,再验证一次就行了。
另外,返回05表示invalid frame format,可以把对status的判断去掉,直接写看看能否写进去,因为或许跟你的底层通讯接口收发有关联,尤其是用硬件接口时。
仅供参考。

ospic 发表于 2012-11-8 13:59

问题解决了,多亏7楼提醒“返回05表示invalid frame format”,我的SPI接口是用软件模拟的SCK时钟的占空比不是1:1,高电平窄,低电平宽。没想到设置、寻卡、防冲撞、选定卡片、密码A认证、读数据居然通过了。我将高电平加宽,写入成功。谢谢7楼的yirongfu。我给30分。

ospic 发表于 2012-11-8 14:10

我是新人,我的资料中显示有45分,我想给您30分,但是给不出来,只能填写15分,不知为什么。

yirongfu 发表于 2012-11-8 14:13

问题解决了,多亏7楼提醒“返回05表示invalid frame format”,我的SPI接口是用软件模拟的SCK时钟的占空比不是1:1,高电平窄,低电平宽。没想到设置、寻卡、防冲撞、选定卡片、密码A认证、读数据居然通过了。我将高 ...
ospic 发表于 2012-11-8 13:59 https://bbs.21ic.com/images/common/back.gif

呵呵,很高兴能帮到你,调试接口是挺熬人的过程,我深有体会:)

yirongfu 发表于 2012-11-8 14:15

我是新人,我的资料中显示有45分,我想给您30分,但是给不出来,只能填写15分,不知为什么。
ospic 发表于 2012-11-8 14:10 https://bbs.21ic.com/images/common/back.gif

因为您发帖时给的总分是20分,给2楼5分,所以就只剩15分了,呵呵,没事

ospic 发表于 2012-11-8 14:23

噢,明白了,想多加分也不行。也不能让2楼的白忙活呀。以后有机会给您补上,在次感谢了。

萨姆胡哥 发表于 2013-9-20 20:26

有自己硬件设计RC522的经验不?我现在自己手工焊接了一个RC522模块,能测到13.56MHz的信号,但是比买的模块电压幅值小一点(80%左右),可是单片机读不出数据,用买的模块就OK,其他的部分没区别。。

vd5678 发表于 2013-12-6 18:56

我也遇到相同的問題,baud rate調整好後就正常了,
新的問題是,我買了張UID卡回來,block0無法寫入,返回 0x04
但是寫其他 block正常,不知哪位大俠有遇到過相同問題,求解~

陈导511322 发表于 2014-4-7 11:14

vd5678 发表于 2013-12-6 18:56 static/image/common/back.gif
我也遇到相同的問題,baud rate調整好後就正常了,
新的問題是,我買了張UID卡回來,block0無法寫入,返回...

块0 是专用的 不能更改

陈导511322 发表于 2014-4-7 11:36

多谢楼上 提醒 我的也解决

散装805 发表于 2014-6-16 14:43

陈导511322 发表于 2014-4-7 11:14 static/image/common/back.gif
块0 是专用的 不能更改

有一种扇区0也可以修改的卡,调来调去就是写不进,求支招

szvcstudy 发表于 2014-6-26 23:31

UID卡0块写操作,群里有没有懂的,求指导!!

yeyang1234 发表于 2014-11-21 19:40

请问楼主,最近在做RC522的项目,因为没有NSS片选引脚,那么发送数据n帧数据的时候怎么才能表示当前帧为最后一帧?也就是在发送该帧之后可以开始向新的地址发送数据?

bairanhua 发表于 2015-4-21 22:42

楼主,求代码,我现在选卡过程出现错误,找不到问题,郁闷中......
页: [1] 2
查看完整版本: RC522写数据问题