📄 mfslave.c
字号:
#include <string.h>
#include <stdio.h>
#include <main.h>
#include <m500a.h>
#include <p89c51rx.h>
#include <Mfreg500.h>
#include <RdIo.h>
#define LED P3_5
void SetBitMask(unsigned char reg,unsigned char mask);
void ClearBitMask(unsigned char reg,unsigned char mask);
#define Request_ALL 0x52
#define Request_IDLE 0x26
#define Write_M1 0xA0
#define ReceiveDataTimeOut 0x0112 //定义错误代码//
#define IllegalPurview 0x5004
#define VerifyError 0x4300
#define SlaveReceiveTimeOut 0x0115
unsigned char Bps=4,Parity='N',idata ReadBuf[40],idata snr[4];//PY
unsigned char idata Key[6]={0xff,0xff,0xff,0xff,0xff,0xff};
unsigned int Trans_Rec_Length;
char M500PcdCmd(unsigned char cmd,
volatile unsigned char* send,
volatile unsigned char* rcv,
volatile MfCmdInfo *info);
void init(void);
void delay_50us(unsigned int _50us);
void Com_Initial(void);
void ComErrTreat(void);
void ChangeBPSandParity(void);
void TreatM1Cmd(void);
void Treat14443Cmd(void);
void StopComunication(void);
void ProtocolCodeErr(void);
int MF_Slave_Receive( unsigned int *RecLength,
unsigned char *RecBuffer,
unsigned int ByteTimeOut);
void MF_Slave_Transmit( unsigned int TranLength,
unsigned char *TranBuffer);
void SystemReset(void);
void RequestALL(void);
void RequestIDLE(void);
void Snrcollision( unsigned char idata *snr);
void Select_MF(unsigned char idata *snr);
void Authentication(unsigned char Auth_mode,
unsigned char Block_addr,
unsigned char *snr,
unsigned char *Keys);
void AuthenE2(unsigned char Auth_mode,
unsigned char Block_addr,
unsigned char *snr,
unsigned int Keyaddr);
void LoadE2Keys(unsigned int Keyaddr,
unsigned char idata *Keys);
void ReadE2(unsigned int startaddr,unsigned char length,unsigned char * data1);
void WriteE2(unsigned int startaddr,unsigned char length,unsigned char* data1);
void ReadM1(unsigned char Block_addr);
void WriteM1(unsigned char Block_addr,
unsigned char * Write_buffer);
void main(void)
{
// char temp;
unsigned char idata WriteBuf[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,0x02,0x03,0x04,0x05,0x06};
init();
while(M500PcdReset() != MI_OK);
M500PcdConfig();
M500PcdRfReset(10);
delay_50us(1000);
// WriteE2(0x30,5,WriteBuf);
// ReadE2(0x30,5,ReadBuf+20);
while(1)
{
Com_Initial();
RequestALL();
if(ReadBuf[6]) continue;
Snrcollision(snr);
if(ReadBuf[6]) continue;
Select_MF(snr);
if(ReadBuf[6]) continue;
// LoadE2Keys(0x80,Key);
// if(ReadBuf[6]) continue;
// AuthenE2(0x60,6,snr,0x80);
// if(ReadBuf[6]) continue;
}
}
void init(void)
{
P2_7 = 0; // Enable the CS for RC500
IT0 = 1; // Config ext0 as edge trigger for RC500
EX0 = 1; // Enable ext0 interrupt for RC500
EA = 1; // Enable global interrupt
}
void RequestALL(void)
{
ReadBuf[0]=0x04;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=0x52;
TreatM1Cmd();
}
void RequestIDLE(void)
{
ReadBuf[0]=0x04;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=0x26;
TreatM1Cmd();
}
void Snrcollision( unsigned char idata *snr)
{
ReadBuf[0]=0x09;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=0x93;
ReadBuf[6]=0x00;
memcpy(ReadBuf+7,snr,4);
TreatM1Cmd();
memcpy(snr,ReadBuf+7,4);
}
void Select_MF(unsigned char idata *snr)
{
ReadBuf[0]=0x0a;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=0x93;
ReadBuf[6]=0x70;
memcpy(ReadBuf+7,snr,4);
ReadBuf[11]=snr[0]^snr[1]^snr[2]^snr[3];
TreatM1Cmd();
}
//下载密码到RC500的E2PROM
void LoadE2Keys(unsigned int Keyaddr,
unsigned char idata *Keys)
{
unsigned char i;
ReadBuf[0]=0x11;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x04;
ReadBuf[5]=(unsigned char)Keyaddr;
ReadBuf[6]=(unsigned char)(Keyaddr>>8);
for(i=0;i<6;i++)
{
ReadBuf[2*i+7]=((~Keys[i])&0xf0)|((Keys[i]>>4)&0x0f);
ReadBuf[2*i+8]=(Keys[i]&0x0f)|((~Keys[i]<<4)&0xf0);
}
TreatM1Cmd();
}
//通过E2PROM进行密码认证
void AuthenE2(unsigned char Auth_mode,
unsigned char Block_addr,
unsigned char *snr,
unsigned int Keyaddr)
{
ReadBuf[0]=0x0b;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x02;
ReadBuf[5]=Auth_mode;
ReadBuf[6]=Block_addr;
memcpy(ReadBuf+7,snr,4);
ReadBuf[11]=(unsigned char)Keyaddr;
ReadBuf[12]=(unsigned char)(Keyaddr>>8);
TreatM1Cmd();
}
void Authentication(unsigned char Auth_mode,
unsigned char Block_addr,
unsigned char *snr,
unsigned char *Keys)
{
unsigned char i;
ReadBuf[0]=0x15;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=Auth_mode;
ReadBuf[6]=Block_addr;
memcpy(ReadBuf+7,snr,4);
for(i=0;i<6;i++)
{
ReadBuf[2*i+11]=((~Keys[i])&0xf0)|((Keys[i]>>4)&0x0f);
ReadBuf[2*i+12]=(Keys[i]&0x0f)|((~Keys[i]<<4)&0xf0);
}
TreatM1Cmd();
}
void ReadM1(unsigned char Block_addr)
{
ReadBuf[0]=0x05;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=0x30;
ReadBuf[6]=Block_addr;
TreatM1Cmd();
}
//写数据
void WriteM1(unsigned char Block_addr,
unsigned char * Write_buffer)
{
ReadBuf[0]=0x15;
ReadBuf[1]=0x00;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0x00;
ReadBuf[5]=0xa0;
ReadBuf[6]=Block_addr;
memcpy(ReadBuf+7,Write_buffer,16);
TreatM1Cmd();
}
void ComErrTreat(void)
{
ReadBuf[0]=4;
ReadBuf[1]=0;
ReadBuf[2]=0;
ReadBuf[3]=0x3f;
ReadBuf[4]=(char)VerifyError;
ReadBuf[5]=(char)(VerifyError>>8);
}
void ChangeBPSandParity(void)
{
Bps=ReadBuf[4];
Parity=ReadBuf[5];
ReadBuf[0]=6;
ReadBuf[1]=0;
ReadBuf[2]=0x30;
ReadBuf[3]=0x10;
ReadBuf[4]=0;
ReadBuf[5]=0;
ReadBuf[6]=Bps;
ReadBuf[7]=Parity;
}
void ProtocolCodeErr(void)
{
ReadBuf[0]=4;
ReadBuf[1]=0;
ReadBuf[2]=0;
ReadBuf[3]=0x3f;
ReadBuf[4]=(char)IllegalPurview;
ReadBuf[5]=(char)(IllegalPurview>>8);
}
void StopComunication(void)
{
ReadBuf[0]=4;
ReadBuf[1]=0;
ReadBuf[2]=0x30;
ReadBuf[3]=0x0f;
ReadBuf[4]=0;
ReadBuf[5]=0;
}
void PrepareTransmitUpBlock(char status)
{
ReadBuf[0]+=5;
ReadBuf[1]=0;
ReadBuf[2]=0x30;
ReadBuf[3]=0x11;
ReadBuf[4]=0;
ReadBuf[5]=0;
ReadBuf[6]=status;
}
void TreatM1Cmd(void)
{
char status = MI_OK;
// ClearBitMask(RegControl,0x08); // disable crypto 1 unit
// long timeout (9.6 ms)
WriteIO(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
if(ReadBuf[4]&1)
WriteIO(RegChannelRedundancy,0x03); // RxCRC,TxCRC disable, Parity enable
else
WriteIO(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
ReadBuf[0]-=3;
if(ReadBuf[4]&4)
{
status=M500PiccExchangeBlock(PCD_WRITEE2,ReadBuf+5,ReadBuf[0],ReadBuf+7,ReadBuf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -