📄 fm1715_test.c
字号:
#ifndef _MAIN_INCLUDED_
#define _MAIN_INCLUDED_
//常量定义
#define FALSE 0
#define TRUE 1
#FM1715命令码
#define Transceive 0x1E //发送接收命令
#define Transmit 0x1A //发送命令
#define ReadE2 0x03 //读取FM1715 EEPROM命令
#define WriteE2 0x01 //写FM1715 EEPROM命令
#define Authent1 0x0c //验证命令认证过程第1步
#define Authent2 0x14 //验证命令认证过程第2步
#define LoadKeyE2 0x0B //将密钥从EEPROM复制到KEY缓存
#define LoadKey 0x19 //将密钥从FIFO memory复制到key memory
#define RF_TimeOut 0xfff //send command delay
#define Req 0x01
#define Sel 0x02
//Define data type
#define uchar unsigned char
#define uint unsigned int
//Define card type
#define TYPEA_MODE 0 //type A mode
#define TYPEB_MODE 1 //type B mode
#define SHANGHAI_MODE 2 //shanghai mode
#define TM0_HIGH 0xf0 //timer0 high bit,4ms setting
#define TM0_LOW 0x60 //timer0 low bit
#define TIMEOUT 100 //Timer out ,4ms x100 =0.4s
//RF communication command
#define RF_CMD_REQUEST_STD 0x26
#define RF_CMD_REQUEST_ALL 0x52
#define RF_CMD_ANTICOL 0x93 //?????
#define RF_CMD_SELECT 0x93 //?????
#define RF_CMD_AUTH_LA 0x60
#define RF_CMD_AUTH_LB 0x61
#define RF_CMD_READ 0x30
#define RF_CMD_WRITE 0xA0
#define RF_CMD_INC 0xC1
#define RF_CMD_DEC 0xC0
#define RF_CMD_RESTORE 0xC2
#define RF_CMD_TRANSFER 0xb0
#define RF_CMD_HALT 0x50
//status Values
#define ALL 0x01
#define KEYB 0x04
#define KEYA 0x00
#define _AB 0x40
#define CRC_A 1
#define CRC_B 2
#define CRC_OK 0
#define CRC_ERR 1
#define BBC_OK 0
#define BBC_ERR 1
//****************** Define Card Type *****************************
#define MIFARE_8K 0 // Mifare series 8KB card
#define MIFARE_TOKEN 1 // Mifare series 1KB TOKEN card
#define SHANGHAI_8K 2 // shanghai standard 8KB card
#define SHANGHAI_TOKEN 3 // shanghai standard 1KB TOKEN card
//****************** Function error code **************************
#define FM1715_OK 0 // Right
#define FM1715_NOTAGERR 1 // No card
#define FM1715_CRCERR 2 // card CRC error
#define FM1715_EMPTY 3 // data overflow error
#define FM1715_AUTHERR 4 // card Auth error
#define FM1715_PARITYERR 5 // card Parity error
#define FM1715_CODEERR 6 // card communication error(BCC verify error)
#define FM1715_SERNRERR 8 // card serieal number error(anti-collision error)
#define FM1715_SELECTERR 9 // card data length error(select error)
#define FM1715_NOTAUTERRR 10 // card didnt pass athu
#define FM1715_BITCOUNTER 11 // Received bit counter error
#define FM1715_BYTECOUNTERR 12 // Received byte counter error
#define FM1715_RESTERR 13 // calling restore function error
#define FM1715_TRANSERR 14 // calling transfer function error
#define FM1715_WRITEERR 15 // calling write function error
#define FM1715_INCRERR 16 // calling increment function error
#define FM1715_DECRERR 17 // calling Decrement function error
#define FM1715_READERR 18 // calling read function error
#define FM1715_LOADKEYERR 19 // calling LOADKEY function error
#define FM1715_FRAMINGERR 20 // FM1715 Framing error
#define FM1715_REQERR 21 // calling Req function error
#define FM1715_SELERR 22 // calling Sel function error
#define FM1715_ANTICOLLERR 24 // calling anticoll function error
#define FM1715_INITVALERR 25 // calling init function error 与资料上有所改动
#define FM1715_READVALERR 26 // calling 高级读块值 function error
#define FM1715_DESELECTERR 27 //
#define FM1715_CMD_ERR 28 // command error
//*************************** FM1715 Address define *******************
#define Page_Sel XBYTE[0x7000] //Page write register
#define Command XBYTE[0x7001] //Command register
#define FIFO XBYTE[0x7002] //64 bytes FIFO register
#define PrimaryStatus XBYTE[0x7003] //Sender,Receiver , FIFO status register
#define FIFO_Length XBYTE[0x7004] //Current FIFO byte count register
#define SecondaryStatus XBYTE[0x7005] //each status register
#define InterruptEn XBYTE[0x7006] //Interrupt Enable/Disable register
#define Int_Req XBYTE[0x7007] //Int request flag register
#define Control XBYTE[0x7009] //Control register
#define ErrorFlag XBYTE[0x700A] //Error Status register
#define CollPos XBYTE[0x700B] //Collision Detect register
#define TimerValue XBYTE[0x700C] //Current timer value
#define Bit_Frame XBYTE[0x700F] //bit frame adjust register
#define TxControl XBYTE[0x7011] //Transmit control register
#define CWConductance XBYTE[0x7012] //Select TX1 and TX2 发射天线 Impedence
#define ModConductance XBYTE[0x7013] //output driver impedence
#define CoderControl XBYTE[0x7014] //coder mode and clock frequency
#define TypeBFraming XBYTE[0x7017] //ISO14443B Framing format
#define DecoderControl XBYTE[0x701a] //Decoder control register
#define Rxcontrol2 XBYTE[0x701e] //Decoder control and select receive source
#define RxWait XBYTE[0x7021] //select transmit and receive interval
#define ChannelRedundancy XBYTE[0x7022] //RF channel detect mode setting register
#define CRCPresetLSB XBYTE[0x7023]
#define CRCPresetMSB XBYTE[0x7024]
#define MFOUTSelect XBYTE[0x7026] //mfOUT configure register
#define TimerClock XBYTE[0x702a] //timer cycle setting register
#define TimerControl XBYTE[0x702b] //timer control register
#define TimerReload XBYTE[0x702C] //Timer init value register
#define TypeSH XBYTE[0x7031] //shanghai standard select register
#define TestDigiSelect XBYTE[0x703d] //Test pin configure register
#endif
sbit MFRST=P1^0; //FM1715 Reset pin
uchar idata readdata[6] _at_ 0x0040; //Read/write memory
uchar idata value[4] _at_ 0x0050; //Inc/Dec value
uchar idata KeySet; //password type
uchar idata tagtype[2] _at_ 0x0096; //card indentify character
//***************************** FM1715 varialbe define *********************
uchar idata PRO_SendBuf[16] _at_ 0x0080; //Send buffer
uchar idata PRO_RecvBuf[16] _at_ 0x0080; //Receive buffer
uchar idata buffer[24] _at_ 0x0060; //FM1715 command send/receive buffer
uchar idata UID[5] _at_ 0x007a; //User ID
uchar idata Secnr _at_ 0x0090; //sector number
uchar idata keybuffer[6]; //key save buffer
//**********************************************************
//Name: Check_UID
//function: check card UID
//input: N/A
//output: TRUE UID right
// FALSE UID error
//**********************************************************'
uchar Check_UID(void)
{
uchar temp;
uchar i;
temp=0x00;
for(i=0;i<5;i++)
{
temp=temp^UID[i];
}
if(temp==0)
{
return TRUE;
}
return FALSE;
}
//*******************************************************************
//name:Save_UID
//function: This function sae card's serial number
//input: row : coflict row
// col : coflict line
// length: the length of received UID data
//output: N/A
//*******************************************************************
void Save_UID(uchar row,uchar col,uchar length)
{
uchar i;
uchar temp;
uchar temp1;
if((row == 0x00)&&(col==0x00))
{
for(i=0;i<length;i++)
{
UID[i]=buffer[i];
}
}
else
{
temp=buffer[0];
temp1=UID[row-1];
switch(col)
{
case 0:
temp1=0x00;
row=row+1;
break;
case 1:
temp=temp&0xFE;
temp1=temp1&0x01;
break;
case 2:
temp=temp&0xFC;
temp1=temp1&0x03;
break;
case 3:
temp=temp&0xF8;
temp1=temp1&0x07;
break;
case 4:
temp=temp&0xF0;
temp1=temp1&0x0F;
break;
case 5:
temp=temp&0xE0;
temp1=temp1&0x1F;
break;
case 6:
temp=tmep&0xC0;
temp1=temp1&0x3F;
break;
case 7:
temp=temp&0x80;
temp1=temp1&0x7F;
break;
default:
break;
}
buffer[0]=temp;
UID[row-1]=temp1|temp;
for(i=1;i<length;i++)
{
UID[row-1+i]=buffer[i];
}
}
}
//*************************************************************
//name: Set_BitFraming
//function: set the byte that ready to send
//input: row : conflict row
// col : conflict col
//ouput: N/A
//*************************************************************
void Set_BitFraming(uchar row,uchar col)
{
switch(row)
{
case 0:
buffer[1]=0x20;
break;
case 1:
buffer[1]=0x30;
break;
case 2:
buffer[1]=0x40;
break;
case 3:
buffer[1]=0x50;
case 4:
buffer[1]=0x60;
break;
default:
break;
}
switch(col)
{
case 0:
Bit_Frame=0x00;
break;
case 1:
Bit_Frame=0x11;
buffer[1]=(buffer[1]|0x01);
break;
case 2:
Bit_Frame=0x22;
buffer[1]=(buffer[1]|0x02);
break;
case 3:
Bit_Frame=0x33;
buffer[1]=(buffer[1]|0x03);
break;
case 4:
Bit_Frame=0x44;
buffer[1]=(buffer[1]|0x04);
break;
case 5:
Bit_Frame=0x55;
buffer[1]=(buffer[1]|0x05);
break;
case 6:
Bit_Frame=0x66;
buffer[1]=(buffer[1]|0x06);
break;
case 7:
Bit_Frame=0x77;
buffer[1]=(buffer[1]|0x057);
break;
default:
break;
}
}
//************************************************************
//name: FM1715_Bus_Sel
//function: this function select FM1715 control bus?
//input: N/A
//output: TRUE, select bus succeed
// FALSE, select bus fail
//************************************************************
uchar FM1715_Bus_Sel(void)
{
uchar i;
Page_Sel=0x80;
for(i=0;i<RF_TimeOut;i++)
{
if(Command==0x00)
{
Page_Sel=0x00;
return TRUE;
}
}
return FALSE;
}
//********************************************************
//name: Init_FM1715
//function: Init FM1715
//input: mode: 0 -->TYPEA mode
// 1 -->TYPEB mode
// 2 -->shanghai mode
//ouput: N/A
//*********************************************************
void Init_FM1715(uchar mode)
{
uchar idata temp;
uint i;
MFRST=1; //Reset FM1715
for(i=0;i<0x1fff;i++)
{
_nop_();
}
MFRST=0;
for(i=0;i<0x1fff;i++)
{
_nop_();
}
while(Command!=0) //waiting command=0, FM1715 Reset succeed
{
_nop_();
}
FM1715_Bus_Sel(); //Select FM1715 bus
TimerClock=0x0b; //151us/per
TimerControl=0x02; //send complete, start timer, recieve start ,stop timer
TimerReload=0x42; //10ms interval
InterruptEn=0x7f; //Close all interrupt
temp=InterruptEn;
Int_Req=0x7f;
MFOUTSelect=0x02; //for debug
TxControl=0x5b; //start TX1,TX2
if(mode==SHANGHAI_MODE) //shanghai mode
{
TypeSH=0x01;
}
else
{
TypeSH=0x00;
}
if(mode==TYPEB_MODE)
{
CoderControl=0x20;
TypeBFraming=0x05;
DecoderControl=0x19;
ChannelRedundancy=0x24;
TxControl=0x4b;
CWConductance=0x3f;
ModConductance=af; ??????这里是否有问题
}
}
//******************************************************************
//name: Command_Send
//function: send command to FM1715
//input: count, the length of command
// buff, point to the data that ready to send
// Comm_Set, command code
//output: TRUE , running command succeed
// FALSE, running command error
//******************************************************************
uchar Command_Send(uchar count,uchar idata *buff,uchar Comm_Set)
{
uint j;
uchar idata temp,temp1;
Command=0x00;
Clear_FIFO();
Write_FIFO(count,buff);
temp=MFOUTSelect;
Command=Comm_Set; //running command
for(j=0;j<RF_TimeOut;j++)
{
temp=MFOUTSelect;
temp=Command;
temp1=Int_Req&0x80;
if((temp==0x00)||(temp1==0x80))
{
return TRUE;
}
}
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -