打印

RC522写数据问题

[复制链接]
12146|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ospic|  楼主 | 2012-11-7 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用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 int  unLen;
    unsigned char i,ucComMF522Buf[MAXRLEN];
    ucComMF522Buf[0] = PICC_WRITE;
    ucComMF522Buf[1] = addr;   
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);   
    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
    if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){
            status = (char)MI_ERR;
    }
    if (status == MI_OK){
        for (i=0; i<16; i++){
                ucComMF522Buf[i] = *(pData+i);
        }
        CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
        status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
        if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 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;
}

使用特权

评论回复
5
ospic|  楼主 | 2012-11-8 10:55 | 只看该作者
谢谢4楼的代码,基本差不多,只有设置增益有差别,我的天线增益设0x4F时效果最好,距离可达6厘米。其它值也试过,距离和效果都不好,也没能解决写入数据的问题。我这个天线其它系统也在用应该没问题。

使用特权

评论回复
6
ospic|  楼主 | 2012-11-8 10:59 | 只看该作者
真是搞不懂了,能读却不能写,愁呀!!!

使用特权

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

使用特权

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
阿泉爱学习 + 1 赞一个!
9
ospic|  楼主 | 2012-11-8 14:10 | 只看该作者
我是新人,我的资料中显示有45分,我想给您30分,但是给不出来,只能填写15分,不知为什么。

使用特权

评论回复
10
yirongfu| | 2012-11-8 14:13 | 只看该作者
问题解决了,多亏7楼提醒“返回05表示invalid frame format”,我的SPI接口是用软件模拟的SCK时钟的占空比不是1:1,高电平窄,低电平宽。没想到设置、寻卡、防冲撞、选定卡片、密码A认证、读数据居然通过了。我将高 ...
ospic 发表于 2012-11-8 13:59


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

使用特权

评论回复
11
yirongfu| | 2012-11-8 14:15 | 只看该作者
我是新人,我的资料中显示有45分,我想给您30分,但是给不出来,只能填写15分,不知为什么。
ospic 发表于 2012-11-8 14:10


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

使用特权

评论回复
12
ospic|  楼主 | 2012-11-8 14:23 | 只看该作者
噢,明白了,想多加分也不行。也不能让2楼的白忙活呀。以后有机会给您补上,在次感谢了。

使用特权

评论回复
13
萨姆胡哥| | 2013-9-20 20:26 | 只看该作者
有自己硬件设计RC522的经验不?我现在自己手工焊接了一个RC522模块,能测到13.56MHz的信号,但是比买的模块电压幅值小一点(80%左右),可是单片机读不出数据,用买的模块就OK,其他的部分没区别。。

使用特权

评论回复
14
vd5678| | 2013-12-6 18:56 | 只看该作者
我也遇到相同的問題,baud rate調整好後就正常了,
新的問題是,我買了張UID卡回來,block0無法寫入,返回 0x04
但是寫其他 block正常,不知哪位大俠有遇到過相同問題,求解~

使用特权

评论回复
15
陈导511322| | 2014-4-7 11:14 | 只看该作者
vd5678 发表于 2013-12-6 18:56
我也遇到相同的問題,baud rate調整好後就正常了,
新的問題是,我買了張UID卡回來,block0無法寫入,返回  ...

块0 是专用的 不能更改

使用特权

评论回复
16
陈导511322| | 2014-4-7 11:36 | 只看该作者
多谢楼上 提醒 我的也解决

使用特权

评论回复
17
散装805| | 2014-6-16 14:43 | 只看该作者
陈导511322 发表于 2014-4-7 11:14
块0 是专用的 不能更改

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

使用特权

评论回复
18
szvcstudy| | 2014-6-26 23:31 | 只看该作者
UID卡0块写操作,群里有没有懂的,求指导!!

使用特权

评论回复
19
yeyang1234| | 2014-11-21 19:40 | 只看该作者
请问楼主,最近在做RC522的项目,因为没有NSS片选引脚,那么发送数据n帧数据的时候怎么才能表示当前帧为最后一帧?也就是在发送该帧之后可以开始向新的地址发送数据?

使用特权

评论回复
20
bairanhua| | 2015-4-21 22:42 | 只看该作者
楼主,求代码,我现在选卡过程出现错误,找不到问题,郁闷中......

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

2

粉丝