好,接下来我们来看一下PICC的寻卡过程。 首先,通过PcdRequest(PICC_REQIDL, &CardRevBuf[0] )函数我们进**操作。它内部的操作函数是
charPcdRequest(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; status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);//通过522发送req_code命令,并接收返回数据,存到ucComMF522Buf中 if ((status == MI_OK) && (unLen== 0x10))//这个为啥是0x10,因为是2个字节共16bit { *pTagType =ucComMF522Buf[0]; *(pTagType+1) =ucComMF522Buf[1];//获取卡类型 } else { status = MI_ERR; } return status; }
函数将我们的寻卡命令PICC_REQIDL装填如要发送的数组,通过PcdComMF522函数发送出去,如果此时在PCD有效范围内没有寻找到卡,则函数返回MI_ERR,若函数返回MI_OK,并且ulen为0x10(16bit)为两个字节则说明寻卡成功,返回的两字节被装填入CardRevBuf数组。实际上这两个数组表示的是所寻到卡的类型,它们与字节的对应关系如下
// 0x4400 = Mifare_UltraLight
// 0x0400 = Mifare_One(S50)
// 0x0200 = Mifare_One(S70)
// 0x0800 = Mifare_Pro(X)
// 0x4403 = Mifare_DESFire <span style="font-family: SimSun;font-size:14px; background-color: rgb(255, 255, 255);"> </span>
|