ucComMF522Buf[0] = auth_mode; ucComMF522Buf[1] = addr; for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); } for (i=0; i<6; i++)
{ ucComMF522Buf[i+8] = *(pSnr+i);
}
//
// memcpy(&ucComMF522Buf[2], pKey, 6); // memcpy(&ucComMF522Buf[8], pSnr, 4); status =
PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) { status = MI_ERR; }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:读取M1卡一块数据 //参数说明: addr[IN]:块地址
// pData[OUT]:读出的数据,16字节 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdRead(unsigned char addr,unsigned char *pData) {
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_READ; ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status =
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
26
if ((status == MI_OK) && (unLen == 0x90))
// { memcpy(pData, ucComMF522Buf, 16); } {
for (i=0; i<16; i++) {
*(pData+i) = ucComMF522Buf[i]; }
} else
{ status = MI_ERR; }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:写数据到M1卡一块 //参数说明: addr[IN]:块地址
// pData[IN]:写入的数据,16字节 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdWrite(unsigned char addr,unsigned char *pData) {
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_WRITE; ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status =
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; }
if (status == MI_OK) {
27
//memcpy(ucComMF522Buf, pData, 16); for (i=0; i<16; i++)
{ ucComMF522Buf[i] = *(pData+i); }
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
status =
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:命令卡片进入休眠状态 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdHalt(void) {
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_HALT; ucComMF522Buf[1] = 0;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status =
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
return MI_OK; }
///////////////////////////////////////////////////////////////////// //用MF522计算CRC16函数
28
/////////////////////////////////////////////////////////////////////
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData) {
unsigned char i,n;
ClearBitMask(DivIrqReg,0x04);
WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i { WriteRawRC(FIFODataReg, *(pIndata+i)); } WriteRawRC(CommandReg, PCD_CALCCRC); i = 0xFF; do { n = ReadRawRC(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); pOutData[0] = ReadRawRC(CRCResultRegL); pOutData[1] = ReadRawRC(CRCResultRegM); } ///////////////////////////////////////////////////////////////////// //功 能:复位RC522 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdReset(void) { MF522_RST=1; _nop_(); MF522_RST=0; _nop_(); MF522_RST=1; _nop_(); WriteRawRC(CommandReg,PCD_RESETPHASE); _nop_(); WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); 29 WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); 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(ModeReg,0x3D);//3F /* WriteRawRC(TxModeReg,0x0); //as default??? WriteRawRC(TxSelReg,0x10); //as default??? */ WriteRawRC(RxSelReg,0x86);//84 // WriteRawRC(RxThresholdReg,0x84);//as default // WriteRawRC(DemodReg,0x4D); //as default // WriteRawRC(ModWidthReg,0x13);//26 WriteRawRC(RFCfgReg,0x7F); //4F 30 WriteRawRC(ComIrqReg,0x04); //as default WriteRawRC(DivIrqReg,0x0); //as default WriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensor WriteRawRC(WaterLevelReg,0x08); //as default WriteRawRC(CollReg,0x80); //as default WriteRawRC(ControlReg,0x20); //as default WriteRawRC(RxModeReg,0x0); //as default??? WriteRawRC(TxControlReg,0x80); //as default???