if (status == MI_OK) {
//memcpy(ucComMF522Buf, pData, 16); for (i=0; i<16; i++)
{ ucComMF522Buf[i] = *(pData+i); } // 16字节数据
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]); // 两位CRC计算字节
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); // 发送18字节
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 返回低四位为1010
{ status = MI_ERR; } }
return status; }
/********************************************************************* * 功 能:命令卡片进入休眠状态 * 返 回: 成功返回MI_OK
*********************************************************************/ char PcdHalt(void) {
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_HALT; // 0x50,休眠 ucComMF522Buf[1] = 0;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 计算校验位
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 发送
return MI_OK; }
/********************************************************************* * 用MF522计算CRC16函数
*********************************************************************/
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData) {
unsigned char i,n;
ClearBitMask(DivIrqReg,0x04); // CRCIRQ清零 WriteRawRC(CommandReg,PCD_IDLE); // 空闲命令
SetBitMask(FIFOLevelReg,0x80); // FIFOLevelReg中FlushBuffer位置1,表示缓冲区读和写指针清除,即缓冲区无数据,用来存放一下批数据,ErrReg的BufferOvfl清楚 for (i=0; i { WriteRawRC(FIFODataReg, *(pIndata+i)); } // 将数据写入缓冲区 WriteRawRC(CommandReg, PCD_CALCCRC); // 启动CRC计算,结果存于CRCResultReg中 i = 0xFF; do { n = ReadRawRC(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); // CRCIRQ置位,当CRC有效且所有数据被处理则需要置1,退出循环,或者是执行了127次读取认为完成CRC也退出循环 pOutData[0] = ReadRawRC(CRCResultRegL); pOutData[1] = ReadRawRC(CRCResultRegM); // 计算结果输出到pOutData中 } /********************************************************************* * 功 能:复位RC522 * 返 回: 成功返回MI_OK *********************************************************************/ char PcdReset(void) { MF522_RST=1; _nop_(); MF522_RST=0; // 复位 _nop_(); MF522_RST=1; _nop_(); WriteRawRC(CommandReg,PCD_RESETPHASE); // 0x0F,软件复位 _nop_(); WriteRawRC(ModeReg,0x3D); // 和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); // 48 WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); // 10001101(141):发送完开始计时,接收时停止计时,自动重装 WriteRawRC(TPrescalerReg,0x3E); // 00111110(62),3390 定时时间: 3391*49/6.78=24.5ms WriteRawRC(TxAutoReg,0x40); // 控制驱动天线 return MI_OK; } /********************************************************************* * 设置RC632的工作方式 *********************************************************************/ char M500PcdConfigISOType(unsigned char type) { if (type == 'A') //ISO14443_A { ClearBitMask(Status2Reg,0x08); /* WriteRawRC(CommandReg,0x20); //as default WriteRawRC(ComIEnReg,0x80); //as default WriteRawRC(DivlEnReg,0x0); //as default WriteRawRC(ComIrqReg,0x04); //as default WriteRawRC(DivIrqReg,0x0); //as default WriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensor WriteRawRC(WaterLevelReg,0x08); //as default WriteRawRC(ControlReg,0x20); //as default WriteRawRC(CollReg,0x80); //as default */ WriteRawRC(ModeReg,0x3D);//3F /* WriteRawRC(TxModeReg,0x0); //as default??? WriteRawRC(RxModeReg,0x0); //as default??? WriteRawRC(TxControlReg,0x80); //as default??? WriteRawRC(TxSelReg,0x10); //as default??? */ WriteRawRC(RxSelReg,0x86);//84 // 内部模拟部分的调制信号作为非接触式UART输入,发送后接收器启动延时6个位时钟 // WriteRawRC(RxThresholdReg,0x84);//as default // WriteRawRC(DemodReg,0x4D); //as default // WriteRawRC(ModWidthReg,0x13);//26 WriteRawRC(RFCfgReg,0x7F); //4F // 接收信号电压增益23dB /* WriteRawRC(GsNReg,0x88); //as default??? WriteRawRC(CWGsCfgReg,0x20); //as default??? WriteRawRC(ModGsCfgReg,0x20); //as default??? */ WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); // PcdSetTmo(106); delay(10); PcdAntennaOn(); } else{ return -1; } return MI_OK; } /******************************************************************** * 功 能:读RC632寄存器 SPI方式 * 参数说明:Address[IN]:寄存器地址 * 返 回:读出的值 *********************************************************************/ unsigned char ReadRawRC(unsigned char Address) { unsigned char i, ucAddr; unsigned char ucResult=0; MF522_SCK = 0; MF522_NSS = 0; ucAddr = ((Address<<1)&0x7E)|0x80; for(i=8;i>0;i--) { MF522_SI = ((ucAddr&0x80)==0x80); MF522_SCK = 1; ucAddr <<= 1; MF522_SCK = 0; } for(i=8;i>0;i--) { MF522_SCK = 1; ucResult <<= 1; ucResult|=(bit)MF522_SO; MF522_SCK = 0; } MF522_NSS = 1; MF522_SCK = 1; return ucResult; } /********************************************************************* * 功 能:写RC632寄存器 * 参数说明:Address[IN]:寄存器地址 * value[IN]:写入的值 **********************************************************************/ void WriteRawRC(unsigned char Address, unsigned char value) { unsigned char i, ucAddr; MF522_SCK = 0; MF522_NSS = 0; ucAddr = ((Address<<1)&0x7E); // 地址高位为0表示写,地位必须为0 for(i=8;i>0;i--) { MF522_SI = ((ucAddr&0x80)==0x80); MF522_SCK = 1; ucAddr <<= 1; MF522_SCK = 0; } for(i=8;i>0;i--) { MF522_SI = ((value&0x80)==0x80); MF522_SCK = 1; value <<= 1; MF522_SCK = 0; } MF522_NSS = 1; MF522_SCK = 1; } /********************************************************************* * 功 能:置RC522寄存器位 * 参数说明:reg[IN]:寄存器地址 * mask[IN]:置位值 *********************************************************************/ void SetBitMask(unsigned char reg,unsigned char mask) { char tmp = 0x0; tmp = ReadRawRC(reg); 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库mfrc522程序注释(2)在线全文阅读。
相关推荐: