📄 main.#3
字号:
case 0x02:
e2key_secotor=Receive_Buf_UART1[5];
status= Mf500PiccAuthE2(selec_abkey,csn,e2key_secotor,sector_num);
// 参数e2key_secotor 0 <= e2key_sector <= 15此为e2rom的扇区号
// 参数sector_num为卡的扇区0 block 0 <= block <= 15 即为认证的卡的扇区
if(status==0)
SEND_ICINFO_PC(1,0,0,NULL);
else
SEND_ICINFO_PC(1,1,0,NULL);
SpeakSound();
break;
default:
SEND_ICINFO_PC(1,2,0,NULL);
SpeakSound();
break;
}
break;
case 0x02: //卡的初始化值操作
block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
memmove(temp_buf,Receive_Buf_UART1+4,16); //搬移16个16进制数
status=Mf500PiccWrite(block_num,temp_buf);
if(status==0)
SEND_ICINFO_PC(2,0,0,NULL);
else
SEND_ICINFO_PC(2,1,0,NULL);
SpeakSound();
break;
case 0x03: //卡的增减值操作
block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
//memmove(temp_buf,RECEIVEBUFFER+5,1); //搬移1个16进制数
temp_buf[0]=Receive_Buf_UART1[5];
temp_buf[1]=Receive_Buf_UART1[6];
temp_buf[2]=0;
temp_buf[3]=0;
switch(Receive_Buf_UART1[4]){
case 0x01:
status=Mf500PiccValue(0xc0,block_num,temp_buf,block_num);//减值
if(status==0)
SEND_ICINFO_PC(3,0,0,NULL);
else
SEND_ICINFO_PC(3,1,0,NULL);
SpeakSound();
break;
case 0x02:
status=Mf500PiccValue(0xc1,block_num,temp_buf,block_num); //增值操作
if(status==0)
SEND_ICINFO_PC(3,0,0,NULL);
else
SEND_ICINFO_PC(3,1,0,NULL);
SpeakSound();
break;
default:
SEND_ICINFO_PC(3,2,0,NULL);
break;
}
break;
case 0x04: //读写块操作
block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
switch(Receive_Buf_UART1[4]){
case 0x01:
status=Mf500PiccRead(block_num,rbuf);
if(status==0)
SEND_ICINFO_PC(4,0,16,rbuf);
else
SEND_ICINFO_PC(4,1,0,NULL);
SpeakSound();
break;
case 0x02:
memmove(temp_buf,Receive_Buf_UART1+5,16); //搬移16个16进制数
status=Mf500PiccWrite(block_num,temp_buf);
if(status==0)
SEND_ICINFO_PC(4,0,0,NULL); //显示写成功
else
SEND_ICINFO_PC(4,1,0,NULL);
SpeakSound();
break;
default:
SEND_ICINFO_PC(4,2,0,NULL);
break;
}
break;
case 0x05: //卡密钥装载命令
block_num=Receive_Buf_UART1[2]*4+3;
memmove(temp_buf,Receive_Buf_UART1+3,16); //搬移16个16进制数
status=Mf500PiccWrite(block_num,temp_buf);
if(status==0)
SEND_ICINFO_PC(5,0,0,NULL); //显示写成功
else
SEND_ICINFO_PC(5,1,0,NULL);
SpeakSound();
break;
case 0x06://设备密钥装载命令 loadkeye2 将密钥装入RC500的密钥存贮区
if(Receive_Buf_UART1[3]==0x0A)
selec_abkey=PICC_AUTHENT1A;
if(Receive_Buf_UART1[3]==0x0B)
selec_abkey=PICC_AUTHENT1B;
e2key_secotor=Receive_Buf_UART1[2];
keybuf[0]=Receive_Buf_UART1[4];
keybuf[1]=Receive_Buf_UART1[5];
keybuf[2]=Receive_Buf_UART1[6];
keybuf[3]=Receive_Buf_UART1[7];
keybuf[4]=Receive_Buf_UART1[8];
keybuf[5]=Receive_Buf_UART1[9];
status=Mf500PcdLoadKeyE2(selec_abkey,e2key_secotor,keybuf); //first save key to e2rom
if(status==00)
SEND_ICINFO_PC(6,0,0,NULL); //显示写成功
else
SEND_ICINFO_PC(6,1,0,NULL);
SpeakSound();
break;
default:
SEND_ICINFO_PC(6,2,0,NULL);
break;
}//run command
}////接收成功
}//while(1)
}//end main()
//串口0中断服务程序
// Head_Flag=0x0E End_Flag=0x05 0x0A means 0x7D
// when x<0x10 ,x= 0x7D x^0x10
void Seri_int(void) interrupt 4
{
if(RI0){
RI0=0; // 清串口0标字位
if(UART1_Receive_Len > 240)
{
UART1_Receive_Len = 0;
Receive_Flag_UART1 = 0;
}
if(SBUF0==0x0E)
{ // 接收帧头
Receive_Flag_UART1=1;
UART1_Receive_Len = 0;
}
else{
if(Receive_Flag_UART1==1)
{
// 接收数据
if(SBUF0==0x05){
Receive_Flag_UART1=0;
Padding_Flag_UART1=0;
UART1_Rec_Complete=1;
}
else if(Padding_Flag_UART1==1){
Padding_Flag_UART1=0;
Receive_Buf_UART1[UART1_Receive_Len] = SBUF0;
Receive_Buf_UART1[UART1_Receive_Len] ^= 0x7D;
UART1_Receive_Len++;
}
else if(SBUF0==0x7D){
Padding_Flag_UART1=1;
}
else if(SBUF0==0x0A){
Receive_Buf_UART1[UART1_Receive_Len] = 0x7D;
UART1_Receive_Len++;
}
else{
Receive_Buf_UART1[UART1_Receive_Len] = SBUF0;
UART1_Receive_Len++;
}
}
}
}
}
// 向pc发送子程序
// command----命令,status_flag----应答状态,len-----应答数据长度,buf[]-----应答数据
//此函数请不要添加看门狗定时器复位,否则卡不能认证,不知为何,曾为此痛不于生
void SEND_ICINFO_PC(unsigned char command,unsigned char status_flag,unsigned char len,unsigned char buf[])
{
unsigned char i;
unsigned char checksum=0;
unsigned char xdata buff[20];
unsigned char Data_Len;
DIR=1;
Delay(5000);
Delay(5000);
Delay(5000);
Delay(5000);
Delay(5000);
Delay(5000);
Delay(5000);
Delay(5000);
Data_Len=0;
buff[Data_Len]=0x66; //应答标志
buff[++Data_Len]=command; //命令
if(status_flag==0)
buff[++Data_Len]=0x00; //成功标志
else
buff[++Data_Len]=0x01;
for(i=0;i<len;i++)
buff[++Data_Len]=buf[i];
for(i=0;i<Data_Len+1;i++)
{
checksum = checksum + buff[i];
}
buff[++Data_Len] = checksum; //校验和
TI0=0;
SBUF0 = 0x0E; // 发送帧头
while(!TI0); TI0=0;
for(i=0;i<Data_Len+1;i++) // 发送数据
{
if(buff[i] == 0x7D)
{
SBUF0 = 0x0A;
while(!TI0); TI0=0;
}
else if(buff[i]<0x10)
{
SBUF0 = 0x7D;
while(!TI0); TI0=0;
SBUF0 = buff[i]^0x7D;
while(!TI0); TI0=0;
}
else
{
SBUF0 = buff[i];
while(!TI0); TI0=0;
}
}
SBUF0 = 0x05; // 发送帧尾
while(!TI0); TI0=0;
// SBUF1 = 0x05; // 发送帧尾
// while(!(SCON1 & 0x02)); SCON1 &=0xFD;
DIR=0;
}
/****************************************************************************
* *
* Function: Mf500PcdConfig *
* *
* Input: *
* Output: STATE *
* *
****************************************************************************/
char Mf500PcdConfig(void)
{
unsigned int idata RstLoopCnt = 0;
unsigned int idata CmdWaitCnt = 0;
status = MI_RESETERR;
// wait until reset command recognized
do
{
Delay(100); // wait
PReset=1; // reset RC500
Delay(300); // wait
PReset=0; // clear reset pin
Delay(300); // wait
}
while (ReadRC(RegPage) != 0x80);
do
{
WriteRC(RegPage,0x0); // Dummy access in order to determine the bus
}while(ReadRC(RegCommand) != 0x00); // configuration
// necessary read access
// after first write access, the returned value
// should be zero ==> interface recognized
if (ReadRC(RegCommand) != 0x00)
{
status = MI_INTERFACEERR;
}
else
{
status = 0;
}
if(status==0)
{
// loade2();
XBYTE[RegClockQControl]=0x0;
XBYTE[RegClockQControl]=0x40;
Delay(24);// wait approximately 100 us - calibration in progress
ClearBitMask(RegClockQControl,0x40); // clear bit ClkQCalib for
XBYTE[RegBitPhase]=0xAd;
XBYTE[RegRxThreshold]=0xFF;
XBYTE[RegRxControl2]=01;
XBYTE[RegFIFOLevel]=0x1A; // initialize to 26d
XBYTE[RegTimerControl]=0x02; // TStopRxEnd=0,TStopRxBeg=0,当数据发送结束时定时器自动启动
XBYTE[RegIRqPinConfig]=0x3; // interrupt active low enable管脚irq上的信号与位irq状态相反,标准cmos输出
//XBYTE[RegRxWait]=0x02; //////RxWait有默认值
status=PcdRfReset(1); // Rf - reset and enable output driver
}
return status;
}
/****************************************************************************
Request 指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE 1卡片。如果有
MIFARE 1卡片存在,这一指令将分别与MIFARE 1进行通信,读取MIFARE 1卡片上的卡片
类型号TAGTYPE(2个字节),由MCM传递给MCU,进行识别处理。
程序员可以根据TAGTYPE来区别卡片的不同类型。
对于MIFARE 1卡片来说,返回卡片的TAGTYPE(2个字节)可能为0004h。
* Function: Mf500PiccRequest *
* Input: req_code *
* Output: TagType *
* *
****************************************************************************/
char Mf500PiccRequest(unsigned char req_code,
unsigned char *atq)
{
char i;
status = MI_OK;
PcdSetTmo(2);
WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
ClearBitMask(RegControl,0x08); // disable crypto 1 unit
WriteRC(RegBitFraming,0x07); // set TxLastBits to 7
ResetInfo();
//AUXR=0;
MSndBuffer[0] = req_code;
MInfo.nBytesToSend = 1;
status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
if (status) // error occured
{
atq[0] = 0;
}
else
{
if (MInfo.nBitsReceived != 16) // 2 bytes expected
{
atq[0] = 0;
status = MI_BITCOUNTERR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -