STM8控制RC522刷卡不稳定。

[复制链接]
1583|3
手机看帖
扫描二维码
随时随地手机跟帖
wellk|  楼主 | 2016-10-21 17:26 | 显示全部楼层 |阅读模式
用STM8控制RC522刷卡不稳定。通常都是可以很快刷卡的就是偶尔会卡顿一下,小段时间不能寻到卡。之后又可以恢复正常。。
u8 RC_PcdCmd(u8 cmd, u8 *pIn, u8 inLen, u8 *pOut, u8 *pOutLen)
{     
    u8 status  = MI_OK;
    u8 irqEn   = 0x00;
    u8 waitFor = 0x00;
    u8 lastBits;
    u8 n;
    u16 i;

    switch (cmd)
    {
        case PCD_AUTHENT   : irqEn = 0x12; waitFor = 0x10; break;
        case PCD_TRANSCEIVE: irqEn = 0x77; waitFor = 0x30; break;
        default: break;
    }
   
    RC_WriteRawRC(ComIEnReg, irqEn|0x80);
    RC_ClearBitMask(ComIrqReg, 0x80);
    RC_WriteRawRC(CommandReg, PCD_IDLE);
    RC_SetBitMask(FIFOLevelReg, 0x80);


   
     for (i=0; i<inLen; i++)
    {   
        RC_WriteRawRC(FIFODataReg, pIn[i]);   
    }
   
    RC_WriteRawRC(CommandReg, cmd);                                             //?验证密钥?or?发送并接收数据?
   
    if (cmd == PCD_TRANSCEIVE)
    {   
        RC_SetBitMask(BitFramingReg,0x80);                                      // 启动数据的发送
    }
   
    i = 800;                                                                   // 根据时钟频率调整,操作M1卡最大等待时间25ms
    do
    {
        n = RC_ReadRawRC(ComIrqReg);
        i--;
        
    } while ((i!=0) && !(n&0x01) && !(n&waitFor));                             //如果i不为0,并且定时器没减到0,并且没有未知命令和自身终止命令和接收器没有检测到有效数据流,就继续循环,退出循环则表示接收完成   
   
    RC_ClearBitMask(BitFramingReg, 0x80);                                       //StartSend位清零
             
    if (i != 0)
    {   
        if (!(RC_ReadRawRC(ErrorReg) & 0x1B))                                   // FIFO没有溢出、接收器启动并完成接收之后:(没冲突)、(CRC没出错)、(没有SOF错误)、(验证时接受字节数没错)
        {
            status = MI_OK;
            if (n & irqEn & 0x01)
            {   
                status = MI_NOTAGERR;  
            }
            
            if (cmd == PCD_TRANSCEIVE)
            {
                n = RC_ReadRawRC(FIFOLevelReg);                                  //?读FIFO保存的字节数
                      lastBits = RC_ReadRawRC(ControlReg) & 0x07;                     //?最后一个接收的字节的有效位数(0则表示8位都有效)  
                if(lastBits)
                {
                  *pOutLen = ((n-1)*8 + lastBits);  
                }
                 else
                 {   *pOutLen =n*8;  }
               
                if (n == 0)
                {   
                    n = 1;   
                }
               
                if (n > RC_MAX_RLEN)
                {   
                    n = RC_MAX_RLEN;   
                }
               
                for (i=0; i<n; i++)
                {   
                    pOut[i] = RC_ReadRawRC(FIFODataReg);                        //?将缓冲区的数据读出
                }
            }
        }
        else
        {   
            status = MI_ERR;   
        }
    }
  
    RC_SetBitMask(ControlReg, 0x80);                                            // stop timer now
    RC_WriteRawRC(CommandReg, PCD_IDLE);
    return status;
}

相关帖子

wellk|  楼主 | 2016-10-21 17:29 | 显示全部楼层
调试了,貌似就这里造成不稳定的,望有相关经验大神指点一二哦~

使用特权

评论回复
xyz549040622| | 2016-10-21 21:54 | 显示全部楼层
一般这种情况,是由于算法的问题还有while的循环导致的,硬件在你手上,只能自己慢慢调试找问题了。

使用特权

评论回复
zuiyedemeng| | 2018-5-31 15:52 | 显示全部楼层
天线参数没调试好!专业刷卡设备研发,交流请加QQ 270013397

使用特权

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

本版积分规则

2

主题

7

帖子

1

粉丝