OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3093|回复: 5

求助,RFID中通过RC522和ISO14443卡通讯函数中发送数据后怎么根据时钟调整i值?

[复制链接]

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-6-12
在线时间
93 小时
发表于 2016-6-12 19:01:19 | 显示全部楼层 |阅读模式
2金钱
/////////////////////////////////////////////////////////////////////
//功    能:通过RC522和ISO14443卡通讯
//参数说明:Command[IN]:RC522命令字
//          pIn [IN]:通过RC522发送到卡片的数据
//          InLenByte[IN]:发送数据的字节长度
//          pOut [OUT]:接收到的卡片返回数据
//          *pOutLenBit[OUT]:返回数据的位长度
/////////////////////////////////////////////////////////////////////
char PcdComMF522(u8   Command,
                 u8 *pIn ,
                 u8   InLenByte,
                 u8 *pOut ,
                 u8 *pOutLenBit)
{
    char   status = MI_ERR;
    u8   irqEn   = 0x00;
    u8   waitFor = 0x00;
    u8   lastBits;
    u8   n;
    u16   i;
    switch (Command)
    {
        case PCD_AUTHENT:
                        irqEn   = 0x12;
                        waitFor = 0x10;
                        break;
                case PCD_TRANSCEIVE:
                        irqEn   = 0x77;
                        waitFor = 0x30;
                        break;
                default:
                        break;
    }

    WriteRawRC(ComIEnReg,irqEn|0x80);
    ClearBitMask(ComIrqReg,0x80);        //清所有中断位
    WriteRawRC(CommandReg,PCD_IDLE);
    SetBitMask(FIFOLevelReg,0x80);                 //清FIFO缓存

    for (i=0; i<InLenByte; i++)
    {   WriteRawRC(FIFODataReg, pIn );    }
    WriteRawRC(CommandReg, Command);          
//            n = ReadRawRC(CommandReg);

    if (Command == PCD_TRANSCEIVE)
    {    SetBitMask(BitFramingReg,0x80);  }         //开始传送
                                                                                     
    //i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
        i = 2000;
    do
    {
        n = ReadRawRC(ComIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x01) && !(n&waitFor));
    ClearBitMask(BitFramingReg,0x80);

    if (i!=0)
    {   
        if(!(ReadRawRC(ErrorReg)&0x1B))
        {
            status = MI_OK;
            if (n & irqEn & 0x01)
            {   status = MI_NOTAGERR;   }
            if (Command == PCD_TRANSCEIVE)
            {
                       n = ReadRawRC(FIFOLevelReg);
                      lastBits = ReadRawRC(ControlReg) & 0x07;
                if (lastBits)
                {   *pOutLenBit = (n-1)*8 + lastBits;   }
                else
                {   *pOutLenBit = n*8;   }
                if (n == 0)
                {   n = 1;    }
                if (n > MAXRLEN)
                {   n = MAXRLEN;   }
                for (i=0; i<n; i++)
                {   pOut = ReadRawRC(FIFODataReg);    }
            }
        }
        else
        {   status = MI_ERR;   }

    }


    SetBitMask(ControlReg,0x80);           // stop timer now
    WriteRawRC(CommandReg,PCD_IDLE);
    return status;
}

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-6-12
在线时间
93 小时
 楼主| 发表于 2016-6-12 19:01:20 | 显示全部楼层
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-6-12
在线时间
93 小时
 楼主| 发表于 2016-6-12 19:13:05 | 显示全部楼层
在线等啊,有人没?
回复

使用道具 举报

16

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
798
金钱
798
注册时间
2016-9-17
在线时间
241 小时
发表于 2016-9-17 14:26:08 | 显示全部楼层
楼主解决了吗?我也有同样的问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-17 20:13:13 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
344
金钱
344
注册时间
2016-7-29
在线时间
68 小时
发表于 2016-10-14 16:00:56 | 显示全部楼层
不懂,看了之后,能正常通信,然后就没有管它了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 23:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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