初级会员

- 积分
- 64
- 金钱
- 64
- 注册时间
- 2017-1-18
- 在线时间
- 13 小时
|
1金钱
最近在用STM32F103和RC522做一个IC卡通信的开发。从网上找了一个RC522的例程调试。目前寻卡操作正常,但防冲撞一直调不过,请教高人是什么原因?程序哪里不对吗?寻卡正确说明与RC522的读写和与卡的通信建立了起来,防冲撞返回的一直是MI_ERR,无法返回MI_OK。求高人指点!附程序如下:
寻卡程序:
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); //寄存器包含接收器和发送器和数据模式检测器的状态标志
WriteRawRC(BitFramingReg,0x07); //不启动数据发送
SetBitMask(TxControlReg,0x03); //TX1、TX2输出信号将传递经发送数据调制的13.56MHz的能量载波信号
ucComMF522Buf[0] = req_code; //req_code=0x52或0x26,确定寻卡方式
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);//通过522发送req_code命令,并接收返回数据,存到ucComMF522Buf中
if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1]; //获取卡类型
}
else
{
status = MI_ERR;
}
return status;
}
防冲撞程序:
char PcdAnticoll(unsigned char *pSnr)
{
char status;
unsigned char i,snr_check=0;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); //寄存器包含接收器和发送器和数据模式检测器的状态标志
WriteRawRC(BitFramingReg,0x00); //不启动数据发送,接收的LSB位存放在位0,接收到的第二位放在位1,定义发送的最后一个字节的位数为8
ClearBitMask(CollReg,0x80); //所有接收的位在冲突后将被清除
ucComMF522Buf[0] = PICC_ANTICOLL1; //#define PICC_ANTICOLL1 0x93 //防冲撞
ucComMF522Buf[1] = 0x20; //SEL为0x93表明串联级别1,NVB为0x20表明PCD发送字节数为整两个字节
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);//通过522发送PICC_ANTICOLL1和0x20两个字节,并接收返回数据,存到ucComMF522Buf中
if (status == MI_OK)
{
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComMF522Buf[i];
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i]) //返回四个字节,最后一个字节为校验位
{ status = MI_ERR; }
}
SetBitMask(CollReg,0x80); //置RC522寄存器位CollReg,
return status;
}
调用防冲撞函数:
status = PcdAnticoll(&g_ucTempbuf[2]); //防冲撞,返回卡的序列号 4字节
这里无法返回卡的序列号,status返回值一下是MI_ERR。
|
|