搜索
bottom↓
回复: 7

rc500值块操作问题.

[复制链接]

出0入36汤圆

发表于 2010-11-12 08:02:33 | 显示全部楼层 |阅读模式
看别人的代码步骤如下操作:1先发增值命令和块地址.2接收应答再发要增加的四字节数据,3接收应答再发一次传输块地址. 第三步的用意何在.? 另外问下有中文的iso14443PDF么?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入36汤圆

 楼主| 发表于 2010-11-12 11:53:39 | 显示全部楼层
///////////////////////////////////////////////////////////////////////
// Value format operations for Mifare Standard card ICs(调试OK)
///////////////////////////////////////////////////////////////////////
//说明:上层函数调用该函数时对addr和trans_addr 传递的值是一样的 1~63
//                        加或减值命令     块地址            4byte 数据             块地址
char M500PiccValue(unsigned char dd_mode,unsigned char addr,unsigned char *value,unsigned char trans_addr)                  
{
    char status = MI_OK;

    M500PcdSetTmo(1); //设置时间
    ResetInfo(MInfo);   //控制块
    SerBuffer[0] = dd_mode;      
    SerBuffer[1] = addr;
    MInfo.nBytesToSend = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE,
                       SerBuffer,
                       &MInfo);    //发送命令和块号(第1次发送)

    if (status != MI_NOTAGERR)   //识别应答
    {
        if (MInfo.nBitsReceived != 4)  
        {
            status = MI_BITCOUNTERR;
        }
        else                    
        {
            SerBuffer[0] &= 0x0f;
            switch(SerBuffer[0])
            {
                case 0x00:
                    status = MI_NOTAUTHERR;
                    break;
                case 0x0a:
                    status = MI_OK;
                    break;
                case 0x01:
                    status = MI_VALERR;
                    break;
                default:
                    status = MI_CODEERR;
                    break;
            }
        }
    }

    if ( status == MI_OK)   
    {
        M500PcdSetTmo(3);   
        ResetInfo(MInfo);   
        memcpy(SerBuffer,value,4);
        MInfo.nBytesToSend   = 4;
        status = M500PcdCmd(PCD_TRANSCEIVE,
                            SerBuffer,
                            &MInfo);//发送数据(第2次发送)
        
        if (status == MI_OK)    //识别应答
        {
            if (MInfo.nBitsReceived != 4)   
            {
                status = MI_BITCOUNTERR;
            }
            else                    
            {
                SerBuffer[0] &= 0x0f;
                switch(SerBuffer[0])
                {
                    case 0x00:
                        status = MI_NOTAUTHERR;
                        break;
                    case 0x01:
                        status = MI_VALERR;
                        break;
                    default:
                        status = MI_CODEERR;
                        break;
                }
            }
        }        
        else
        {
            if (status == MI_NOTAGERR )
                status = MI_OK;  
        }
    }
/******************以下代码起什么作用************************/
    if (status == MI_OK)
    {
        ResetInfo(MInfo);   
        SerBuffer[0] = PICC_TRANSFER;      
        SerBuffer[1] = trans_addr; //再次传送块号???
        MInfo.nBytesToSend   = 2;
        status = M500PcdCmd(PCD_TRANSCEIVE,
                            SerBuffer,
                            &MInfo);//(第3次发送)
        if (status != MI_NOTAGERR)  
        {
            if (MInfo.nBitsReceived != 4)
            {
                status = MI_BITCOUNTERR;
            }
            else                  
            {
                SerBuffer[0] &= 0x0f;
                switch(SerBuffer[0])
                {
                    case 0x00:
                        status = MI_NOTAUTHERR;
                        break;
                    case 0x0a:
                        status = MI_OK;
                        break;
                    case 0x01:
                        status = MI_VALERR;
                        break;
                    default:
                        status = MI_CODEERR;
                        break;
                }
            }
        }        
    }
    return status;
}

///////////////////////////////////////////////////////////////////////

出0入0汤圆

发表于 2010-11-12 17:09:43 | 显示全部楼层
你上传的程序不够完整.无法很详细地帮你. 总的操作流程如下:


    写指令分两帧写命令,发送两个字节的写指令,“A0H,ADDR”,ADDR为BLOCK地址,CMD为1EH,CRC校验方式,如果权限校验通过,卡返回1010(即0x0A),若权限校验不通过,返回0000,若发生通讯错误,返回0001;如果权限校验通过,则进行第二帧写数据,CMD为1EH,CRC校验方式,发送4个字节的数据,即写数据,CRC校验方式,操作正常,卡会再返回1010,错误则返回错误信息。

出0入0汤圆

发表于 2010-11-12 17:18:31 | 显示全部楼层
操作存储卡的部分和14443协议已经没什么关系了

14443中文ourdev_597465B9VMB3.rar(文件大小:816K) (原文件名:CJT建设事业非接触式CPU卡芯片技术要求(意见征求稿).rar)

出0入36汤圆

 楼主| 发表于 2010-11-12 17:31:21 | 显示全部楼层
to 叶子。
     前面两次已经把命令和数据都已经发送出去了,为什么还来个第3次发送?如你所说不是也只要发送两次就可以了嘛,
干嘛来个第3次发送???

出0入36汤圆

 楼主| 发表于 2010-11-15 12:39:33 | 显示全部楼层
怪不得高手会不屑回答这个问题,原来这个就不能算问题.呵呵,说下我的理解.

  首先PICC中应该存在3种存储单元, 1.接收数据缓冲单元2.内部数据寄存器 3.EEPROM
卡接收到的数据保存在数据缓冲单元,再依据命令做响应.
  当我们写数据时,卡接收到完整的命令和数据后,直接将其写入EEPROM就是我们指定的操作块.写入之前这个块的值是多少
我们不关心.
  当我们要加减值时,卡收到完整的命令后->把命令中指定的块号对应的数据读取到内部数据寄存器(因为在寄存器里面才能
执行运算)然后等待数据的到来.->接收到数据后,将数据和寄存器里面的值加/减后,并保存在寄存器里面.然后等待下一个命令
指定操作块->接收到命令后将寄存器里面的值写入操作块.
  在上例中addr为源块,trans_addr为目的块(源块 目的块可以不同).简单来说就是把某个源块的数据加减后再写入某目的块,这样做就可以实现任意块的
加减和存入.为什么要这样做?那是为了PICC的高级操作的强大备份功能.
  再来看以上的代码就清楚了,第一次发送是告诉PICC我是要对哪个块的数据进行加减,第2次发送是要加减的值,第3次发送告诉
PICC.(把结果存到这个块吧!)
总算把RC500玩转了,谢谢zhangf1021 提供的资料.谢谢楼上的回复.

出0入0汤圆

发表于 2011-5-25 13:25:41 | 显示全部楼层
学习了,又理解了很多rc500的知识。

出0入0汤圆

发表于 2014-1-3 17:31:02 | 显示全部楼层
mark   

                        
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 04:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表