200 lines
6.0 KiB
C
200 lines
6.0 KiB
C
/***********************************************************************************************
|
|
*FeliCa操作函数文件
|
|
***********************************************************************************************/
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#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*******************************************************/
|
|
|