/*********************************************************************************************** *FeliCa操作函数文件 ***********************************************************************************************/ #include #include #include "DP1312EA.h" #include "DP1312EA_Config.h" #include "Felica.h" #include "nfc_platform.h" void ReadmoniF(void) { s8 status; u8 i; u8 IDm[10],PMm[8]; DP1312EA_PcdConfigISOTypeF(); nfc_platform_sleep_ms(10); status = DP1312EA_PcdRequestF(IDm,PMm); #ifdef UART_DEBUG nfc_platform_log("ATQF: %d_",status); if(status==MI_OK) { for(i=0;i<10;i++) nfc_platform_log(" %02X ",IDm[i]); nfc_platform_log("_"); for(i=0;i<8;i++) nfc_platform_log(" %02X",PMm[i]); } nfc_platform_log("\n"); #endif if(status!=MI_OK) return; } /*********************************************************************************************** *配置为FeliCa卡 ***********************************************************************************************/ void DP1312EA_PcdConfigISOTypeF(void) { DP1312EA_ClearBitMask(Status2Reg,0x08);//08h //MFCrypto1On DP1312EA_WriteRawRC(WaterLevelReg,0x10); //0bh, DP1312EA_WriteRawRC(ControlReg,0x10);//0ch, //Initiator DP1312EA_WriteRawRC(BitFramingReg,0); //0dh, DP1312EA_WriteRawRC(ModeReg,0x00);//11h, *00* DP1312EA_WriteRawRC(TxModeReg,0x92); //12h, 212k DP1312EA_WriteRawRC(RxModeReg,0x92); //13h, 212k //DP1312EA_WriteRawRC(TxModeReg,0xa2); //12h 424k //DP1312EA_WriteRawRC(RxModeReg,0xa2);//13h 424k DP1312EA_WriteRawRC(TxControlReg,0x80);//14h, DP1312EA_WriteRawRC(TxAutoReg,0x00); //15h, DP1312EA_WriteRawRC(TxSelReg,0x10);//16h DP1312EA_WriteRawRC(RxSelReg,0x83);//17h DP1312EA_WriteRawRC(RxThresholdReg,0x55); //18h DP1312EA_WriteRawRC(DemodReg,0x6D); //19h DP1312EA_WriteRawRC(TypeBReg,0); //1eh, DP1312EA_WriteRawRC(GsNOffReg,0xF2); //23h DP1312EA_WriteRawRC(ModWidthReg,0x26); //24h, DP1312EA_WriteRawRC(RFCfgReg,0x78); //26h DP1312EA_WriteRawRC(GsNOnReg,0xFF); //27h DP1312EA_WriteRawRC(CWGsPReg,0x3f); //28h DP1312EA_WriteRawRC(ModGsPReg,0x12); //29h DP1312EA_WriteRawRC(TModeReg,0x8D); //2ah DP1312EA_WriteRawRC(TPrescalerReg,0x00); //2bh DP1312EA_FieldOff(); nfc_platform_sleep_ms(5); DP1312EA_FieldOn(); } s8 DP1312EA_PcdRequestF(u8 *pIDm,u8 *pPMm) { s8 status; struct TranSciveBuffer MfComData,*pi = &MfComData; DP1312EA_WriteRawRC(TPrescalerReg,0x01); //2bh, DP1312EA_WriteRawRC(TModeReg,0x80); //2ah, DP1312EA_WriteRawRC(TReloadRegL,0xEC);//2dh, DP1312EA_WriteRawRC(TReloadRegH,0x5C); //2ch, MfComData.MfCommand = DP1312EA_TRANSCEIVE; MfComData.MfLength =6; MfComData.MfData[0] =0x06; MfComData.MfData[1] =0; MfComData.MfData[2] =0xFF; MfComData.MfData[3] =0xFF; MfComData.MfData[4] =0; MfComData.MfData[5] =0; // FLAG_0; status = DP1312EA_PcdComTransceive(pi); // FLAG_1; if (status == MI_OK) { if(MfComData.MfLength == 0x90) { memcpy(pIDm, &MfComData.MfData[2], 8); memcpy(pPMm, &MfComData.MfData[10], 8); } else status = MI_VALERR; } return status; } s8 DP1312EA_PcdReadF(u8 *pIDm,u8 *pDat) { s8 status; struct TranSciveBuffer MfComData,*pi= &MfComData; MfComData.MfCommand = DP1312EA_TRANSCEIVE; MfComData.MfLength = 16; MfComData.MfData[0] = 0x10; //len MfComData.MfData[1] = 0x06; memcpy(&MfComData.MfData[2],pIDm, 8); MfComData.MfData[10] = 1; //bNumServices MfComData.MfData[11] = 0x0B; //pServiceList.. MfComData.MfData[12] = 0; MfComData.MfData[13] = 1; //read how much number of block MfComData.MfData[14] = 0x80; //pBlockList.. MfComData.MfData[15] = 0x01; status = DP1312EA_PcdComTransceive(pi); if (status == MI_OK) { if(MfComData.MfLength == 0xE8) { memcpy(pDat, &MfComData.MfData[13], 16); } else status = MI_VALERR; } return status; } /*********************************************************************************************** *检测并读取FeliCa卡函数 ***********************************************************************************************/ void DP1312EA_Felica(void) { s8 status; u8 i; u8 IDm[8],PMm[8],buf[16]; DP1312EA_Reset(); DP1312EA_PcdConfigISOTypeF(); nfc_platform_sleep_ms(10); status = DP1312EA_PcdRequestF(IDm,PMm); #ifdef UART_DEBUG nfc_platform_log("ATQF: %d_",status); if(status==MI_OK) { for(i=0;i<8;i++) nfc_platform_log(" %02X ",IDm[i]); nfc_platform_log("_"); for(i=0;i<8;i++) nfc_platform_log(" %02X",PMm[i]); } nfc_platform_log("\n"); #endif if(status!=MI_OK) return; status = DP1312EA_PcdReadF(IDm,buf); #ifdef UART_DEBUG nfc_platform_log("Read: %d_",status); if(status==MI_OK) { for(i=0;i<16;i++) nfc_platform_log(" %02X",buf[i]); } nfc_platform_log("\n"); #endif if(status!=MI_OK) return; do { DP1312EA_FieldOff(); nfc_platform_sleep_ms(10); DP1312EA_FieldOn(); //LED_1; nfc_platform_sleep_ms(10); status = DP1312EA_PcdRequestF(IDm,PMm); if(status==MI_OK){ // LED_0; } else break; }while(status==MI_OK); } /***********************************************END*******************************************************/