用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;
}
|