FM1702SL源码:
- /****************************************************************************
- * File : main.c *
- * COPYRIGHT BY HUOYAN LTD.COMPANY *
- * Version: V1.3 *
- * Author: NIL *
- * *
- * Compiler: KEIL C51 V7.10 *
- * *
- * Description: AT89S52-Firmware for FM1702 Demo Serial Reader *
- * *
- ****************************************************************************/
- #include <reg52.h>
- #define __SRC
- #include "main.h"
- #undef __SRC
- #include <intrins.h>
- //#include <string.h>
- //#include <stdio.h>
- //#include <absacc.h>
- #include "FM1702.h"
- #define uchar unsigned char
- #define uint unsigned int
- //pin define mcu控制管脚定义
- sbit RF_MISO = P1^0;
- sbit RF_MOSI = P1^1;
- sbit RF_SCK = P1^2;
- sbit RF_NSS = P1^3;
- sbit RF_RST = P1^4; //由高变低时启动内部复位程序
- sbit CARD_LED = P2^0;
- sbit SPEAKER = P2^0;
-
-
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- //名称: spi_byte_transceive //
- //功能: 该函数实现SPI通讯的数据收发 //
- // //
- //输入: //
- // 发送数据 //
- // //
- //输出: //
- // 接收数据 //
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- char spi_byte_transceive(char sendbyte)
- {
- char i,temp;
- for(i=0;i<8;i++)
- {
- RF_SCK=0;
- if(sendbyte & 0x80) //位运算,判断最高位是否为1
- {
- RF_MOSI=1;
- }
- else
- {
- RF_MOSI=0;
- }
- sendbyte <<= 1;
- RF_SCK=1;
- temp <<= 1;
- if(RF_MISO)
- temp |= 0x01;
- }
- RF_SCK=0;
- _nop_();
- _nop_();
- RF_MOSI=0;
- return (temp);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- //名称: rc531_register_write //
- //功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 //
- // //
- //输入: //
- // RC531目标寄存器地址和写入值 //
- // //
- //输出: //
- // N/A //
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- void SPIWrite(char reg_ad,char reg_data)
- {
- RF_SCK=0;
- reg_ad <<= 1;
- RF_NSS=0;
- reg_ad &= 0x7F;
- spi_byte_transceive(reg_ad);
- spi_byte_transceive(reg_data);
- RF_NSS=1;
- return;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- //名称: rc531_register_read //
- //功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 //
- // //
- //输入: //
- // RC531目标寄存器地址 //
- // //
- //输出: //
- // 目标寄存器的值 //
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- unsigned char SPIRead(char reg_ad)
- { char temp;
- RF_SCK=0;
- _nop_();
- _nop_();
- RF_NSS=0;
- reg_ad <<= 1;
- reg_ad |= 0x80;
- spi_byte_transceive(reg_ad);
- temp=spi_byte_transceive(0x00);
- RF_NSS=1;
- return (temp);
- }
-
- ///////////////////////////////////////////////////////////////////////
- // 主函数
- ///////////////////////////////////////////////////////////////////////
- void main(void)
- { //设置变量
- uchar baud;
-
- InitSystem(); //初始化系统
- while (1)
- {
- //检查命令标志
- if (CmdValid) //if LEVEL 1
- {
- CmdValid = FALSE;
- if(RevBuffer[0]==11) //if LEVEL 2
- {
- RevBuffer[2]=RevBuffer[1];
- RevBuffer[0]=1;
- RevBuffer[1]=0;
- CALL_isr_UART(); //equal to 'SETB TI', defined in main.h
- SPEAKER=0; //开蜂鸣器和指示灯
- delay_10ms(RevBuffer[2]);
- SPEAKER=1;
- }
- else if(RevBuffer[0]==13) //设置通讯波特率 //if LEVEL 2
- {
- switch(RevBuffer[1])
- {
- case 0:
- baud=BAUD_9600;
- break;
- case 1:
- baud=BAUD_14400;
- break;
- case 2:
- baud=BAUD_19200;
- break;
- case 3:
- baud=BAUD_28800;
- break;
- case 4:
- baud=BAUD_38400;
- break;
- case 5:
- baud=BAUD_57600;
- break;
- case 6:
- baud=BAUD_115200;
- break;
- default:
- baud=BAUD_19200;
- break;
- } //switch body
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- CALL_isr_UART();
- delay_10ms(5);
- TR1 = 0;
- TH1 = baud;
- TL1 = TH1;
- delay_10ms(2);
- TR1 = TRUE;
- }//if LEVEL 2
- else
- {
- cmd_process(); // 进入IC卡处理程序
- CALL_isr_UART();
- }
- }
- }//while循环体
- }//main函数
- ///////////////////////////////////////////////////////////////////////
- // 系统初始化
- ///////////////////////////////////////////////////////////////////////
- void InitSystem(void)
- {
- RF_NSS=1;
- RF_RST=0;
- ET2 = 0; //Timer 2 disabled
- T2CON = 0x04; //start Timer 2(internal timer, auto reload)
- PCON = 0x80; //baud rate double
- SCON = 0x70; //UART mode 1, enable receive, if No valid stop bit, RI not activated.
- //TMOD = 0x22;
- TMOD = 0x21; //Timer 1 8bit auto reload TR1 control
- //Timer 0 16bit TR0 control
- TH1 = BAUD_19200; //默认波特率
- TL1 = TH1;
- TR1 = TRUE; // 波特率发生器
-
- TH0 = 0x60;
- TL0 = 0x60;
- TR0 = 0; //Timer 0 doesn't run
-
- ET0=0;
- ET1=0;
- EA=1;
- EX0=1;
- IT0 = 1;
- TR2=0;
- ES = TRUE; //enable UART interrupt
- CmdValid=0; //flag initiation
- //喇叭和指示灯测试
- SPEAKER=0;
- delay_10ms(10);
- delay_10ms(10);
- SPEAKER=1;
- Init_FM1702(0);
- }
- ///////////////////////////////////////////////////////////////////////
- // 串口接收和发送中断
- ///////////////////////////////////////////////////////////////////////
- void isr_UART(void) interrupt 4 using 1
- {
- uchar len, i;
- unsigned int j=0;
-
- if(RI)
- {
- len=SBUF;
- RI=0;
- for(i=0;i<len;i++)
- {
- while(!RI)
- {
- j++;
- if(j>1000)
- {
- break;
- }
- }
- if(j<1000)
- {
- RevBuffer[i]=SBUF;
- RI=0;
- j=0;
- }
- else
- {
- break;
- }
- }
- if(i==len)
- {
- REN=0;
- CmdValid=1;
- }
- }
- else if(!RI && TI)
- {
- TI=0;
- len=RevBuffer[0];
- for(i=0;i<len+1;i++)
- {
- SBUF=RevBuffer[i];
- while(!TI);
- TI=0;
- }
- REN=1;
- }
- }
- ///////////////////////////////////////////////////////////////////////
- // IC卡处理函数
- ///////////////////////////////////////////////////////////////////////
- void cmd_process(void)
- {
- uchar cmd;
- uchar status;
-
- cmd = RevBuffer[0];
- switch(cmd)
- {
- case 1: // Halt the card //终止卡的操作
- status=MIF_Halt();
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 2:
- status = Request(RF_CMD_REQUEST_ALL); //RF_CMD_REQUEST_STD=0x26, request Idle
- if(status != FM1702_OK)
- {
- status = Request(RF_CMD_REQUEST_ALL);
- if(status != FM1702_OK)
- {
- RevBuffer[0] = 1;
- RevBuffer[1] = FM1702_REQERR;
- break;
- }
- }
- if(tagtype[0]==2)
- cardtype=mifarepro; // Mifare Pro 卡
- else if(tagtype[0]==4)
- cardtype=mifare1; // Mifare One 卡
- else if(tagtype[0]==16)
- cardtype=mifarelight; // Mifare Light 卡
- else
- cardtype=unknowncard;
- RevBuffer[0]=3;
- RevBuffer[1]=status;
- RevBuffer[2]=tagtype[0];
- RevBuffer[3]=tagtype[1];
- break;
- case 3: // 防冲突 读卡的系列号 MLastSelectedSnr
- status = AntiColl();;
- if(status!=FM1702_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=FM1702_ANTICOLLERR;
- break;
- }
- //memcpy(MLastSelectedSnr,&RevBuffer[2],4);
- RevBuffer[0]=5;
- RevBuffer[1]=status;
- RevBuffer[2]=UID[0];
- RevBuffer[3]=UID[1];
- RevBuffer[4]=UID[2];
- RevBuffer[5]=UID[3];
- break;
- case 4: // 选择卡 Select Card
- status=Select_Card();
- if(status!=FM1702_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=FM1702_SELERR;
- break;
- }
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 5: //下载密钥
- status = Load_keyE2(RevBuffer[2],RevBuffer[1]); //%40
- status = Authentication(UID, RevBuffer[2], RevBuffer[1]);
- if(status != FM1702_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 6: // Key loading into the MF RC500's EEPROM
- // 校验卡密码(E2) Load_keyE2_CPY(uchar Secnr, uchar Mode)
- status = Load_keyE2_CPY(RevBuffer[2],RevBuffer[1]); //%40
- if(status != FM1702_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 8: //读卡
- status=MIF_READ(&RevBuffer[2],RevBuffer[1]);
- if(status != FM1702_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- else
- {
- if(cardtype==mifare1||cardtype==mifarepro)
- RevBuffer[0]=17;
- else if(cardtype==1)
- RevBuffer[0]=9;
- else
- RevBuffer[0]=16;
- }
- RevBuffer[1]=status;
- break;
- case 9: //写卡
- status=MIF_Write(&RevBuffer[2],RevBuffer[1]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 10: //加值减值
- if(RevBuffer[1] == RF_CMD_INC)
- {
- status = MIF_Increment(&RevBuffer[3],RevBuffer[2]);
- MIF_Transfer(RevBuffer[2]);
- }
- else if(RevBuffer[1] == RF_CMD_DEC)
- {
- status = MIF_Decrement(&RevBuffer[3],RevBuffer[2]);
- MIF_Transfer(RevBuffer[2]);
- }
- else
- {
- status = 1;
- }
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 12:
- RevBuffer[0]=1;
- RevBuffer[1]=0;
- break;
- default:
- RevBuffer[0] = 1;
- RevBuffer[1] = 1;
- break;
- }
- }
- /****************************************************************/
- /*名称: Clear_FIFO */
- /*功能: 该函数实现清空FM1702中FIFO的数据*/
- /*输入: N/A */
- /*输出: TRUE, FIFO被清空*/
- /* FALSE, FIFO未被清空*/
- /****************************************************************/
- uchar Clear_FIFO(void)
- {
- uchar temp;
- uint i;
- temp = SPIRead(Control); /* 清空FIFO */
- temp = (temp | 0x01);
- SPIWrite(Control,temp);
- for(i = 0; i < RF_TimeOut; i++) /* 检查FIFO是否被清空 */
- {
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- /****************************************************************/
- /*名称: Write_FIFO */
- /*功能: 该函数实现向FM1702的FIFO中写入x bytes数据*/
- /*输入: count, 待写入字节的长度*/
- /* buff, 指向待写入数据的指针*/
- /*输出: N/A */
- /****************************************************************/
- void Write_FIFO(uchar count, uchar idata *buff)
- {
- uchar i;
-
- for(i = 0; i < count; i++)
- {
- SPIWrite(FIFO,*(buff + i));
- }
- }
- /****************************************************************/
- /*名称: Read_FIFO */
- /*功能: 该函数实现从FM1702的FIFO中读出x bytes数据*/
- /*输入: buff, 指向读出数据的指针*/
- /*输出: N/A */
- /****************************************************************/
- uchar Read_FIFO(uchar idata *buff)
- {
- uchar temp;
- uchar i;
-
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return 0;
- }
- if(temp >= 24)
- {
-
- temp = 24;
- }
- for(i = 0; i < temp; i++)
- {
- *(buff + i) = SPIRead(FIFO);
- }
- return temp;
- }
- /****************************************************************/
- /*名称: Judge_Req */
- /*功能: 该函数实现对卡片复位应答信号的判断*/
- /*输入: *buff, 指向应答数据的指针*/
- /*输出: TRUE, 卡片应答信号正确*/
- /* FALSE, 卡片应答信号错误*/
- /****************************************************************/
- uchar Judge_Req(uchar idata *buff)
- {
-
- uchar temp1, temp2;
-
- temp1 = *buff;
- temp2 = *(buff + 1);
- if((temp1 == 0x02) || (temp1 == 0x04) || (temp1 == 0x05) || (temp1 == 0x53) || (temp1 == 0x03))
- {
- if (temp2 == 0x00)
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- /****************************************************************/
- /*名称: Check_UID */
- /*功能: 该函数实现对收到的卡片的序列号的判断*/
- /*输入: N/A */
- /*输出: TRUE: 序列号正确*/
- /* FALSE: 序列号错误*/
- /****************************************************************/
- 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;
- }
- /****************************************************************/
- /*名称: Save_UID */
- /*功能: 该函数实现保存卡片收到的序列号*/
- /*输入: row: 产生冲突的行*/
- /* col: 产生冲突的列*/
- /* length: 接収到的UID数据长度*/
- /*输出: 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] = RevBuffer[i];
- }
- }
- else
- {
- temp = RevBuffer[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 = temp & 0xC0; temp1 = temp1 & 0x3F; break;
- case 7: temp = temp & 0x80; temp1 = temp1 & 0x7F; break;
- default: break;
- }
- RevBuffer[0] = temp;
- UID[row - 1] = temp1 | temp;
- for(i = 1; i < length; i++)
- {
- UID[row - 1 + i] = RevBuffer[i];
- }
- }
- }
- /****************************************************************/
- /*名称: Set_BitFraming */
- /*功能: 该函数设置待发送数据的字节数*/
- /*输入: row: 产生冲突的行*/
- /* col: 产生冲突的列*/
- /*输出: N/A */
- /****************************************************************/
- void Set_BitFraming(uchar row, uchar col)
- {
- switch(row)
- {
- case 0: RevBuffer[1] = 0x20; break;
- case 1: RevBuffer[1] = 0x30; break;
- case 2: RevBuffer[1] = 0x40; break;
- case 3: RevBuffer[1] = 0x50; break;
- case 4: RevBuffer[1] = 0x60; break;
- default: break;
- }
- switch(col)
- {
- case 0: SPIWrite(Bit_Frame,0x00); break;
- case 1: SPIWrite(Bit_Frame,0x11); RevBuffer[1] = (RevBuffer[1] | 0x01); break;
- case 2: SPIWrite(Bit_Frame,0x22); RevBuffer[1] = (RevBuffer[1] | 0x02); break;
- case 3: SPIWrite(Bit_Frame,0x33); RevBuffer[1] = (RevBuffer[1] | 0x03); break;
- case 4: SPIWrite(Bit_Frame,0x44); RevBuffer[1] = (RevBuffer[1] | 0x04); break;
- case 5: SPIWrite(Bit_Frame,0x55); RevBuffer[1] = (RevBuffer[1] | 0x05); break;
- case 6: SPIWrite(Bit_Frame,0x66); RevBuffer[1] = (RevBuffer[1] | 0x06); break;
- case 7: SPIWrite(Bit_Frame,0x77); RevBuffer[1] = (RevBuffer[1] | 0x07); break;
- default: break;
- }
- }
- /****************************************************************/
- /*名称: Init_FM1702 */
- /*功能: 该函数实现对FM1702初始化操作*/
- /*输入: mode:工作模式, 0:TYPEA模式*/
- /* 1:TYPEB模式*/
- /* 2:上海模式*/
- /*输出: N/A */
- /****************************************************************/
- void Init_FM1702(uchar mode)
- {
-
- uchar temp;
- uint i;
-
- // unsigned int idata timecnt=0;
- RF_SCK = 1;
- RF_MISO = 1;
- RF_MOSI = 1;
- RF_RST = 1; /* FM1702复位 */
- for(i = 0; i < 0x1fff; i++)
- {
- _nop_(); /*等待约140ms, 11.0592*/
- }
- RF_RST = 0;
- for(i = 0; i < 0x1fff; i++)
- {
- _nop_();
- }
- ////////////////////////////////////////////////////////////////////////////
-
- while(temp = SPIRead(Command) != 0) /* 等待Command = 0,FM1702复位成功 */
- {
- _nop_();
- }
- ////////////////////////////////////////////////////////////////////////////
- // delay_10ms(1);
- SPIWrite(Page_Sel,0x80);
- for(i = 0; i < 0x1fff; i++) /* 延时 */
- {
- if(temp=SPIRead(Command) == 0x00)
- {
- SPIWrite(Page_Sel,0x00);
- }
- }
- // P2 = SPIRead(TimerClock); //for debug
- SPIWrite(TimerClock,0x0b); //address 2AH /* 定时器周期设置寄存器 */
- SPIWrite(TimerControl,0x02); //address 2BH /* 定时器控制寄存器 */
- SPIWrite(TimerReload,0x42); //address 2CH /* 定时器初值寄存器 */
-
- SPIWrite(InterruptEn,0x7f); //address 06H /* 中断使能/禁止寄存器 */
- // temp = SPIRead(InterruptEn);
- SPIWrite(Int_Req,0x7f); //address 07H /* 中断请求标识寄存器 */
- SPIWrite(MFOUTSelect,0x02); //address 26H /* mf OUT 选择配置寄存器 */
- //设置调制器的输入源为内部编码器, 并且设置TX1和TX2
- SPIWrite(TxControl,0x5b); //address 11H /* 发送控制寄存器 */
- SPIWrite(RxControl2,0x01);
- // SPIWrite(RxControl1,0x73);
- SPIWrite(RxWait,0x07);
- if(mode ==2)
- {
- SPIWrite(TypeSH,0x01);
- }
- else
- {
- SPIWrite(TypeSH,0x00);
- }
- }
- /****************************************************************/
- /*名称: Command_Send */
- /*功能: 该函数实现向FM1702发送命令集的功能*/
- /*输入: count, 待发送命令集的长度*/
- /* buff, 指向待发送数据的指针*/
- /* Comm_Set, 命令码*/
- /*输出: TRUE, 命令被正确执行*/
- /* FALSE, 命令执行错误*/
- /****************************************************************/
- uchar Command_Send(uchar count, uchar idata *buff, uchar Comm_Set)
- {
- uint j;
- uchar idata temp, temp1;
-
- SPIWrite(Command,0x00);
- Clear_FIFO();
- Write_FIFO(count, buff);
-
- SPIWrite(Command,Comm_Set); /* 命令执行 */
- for(j = 0; j < RF_TimeOut; j++) /* 检查命令执行否 */
- {
- temp = SPIRead(Command);
- temp1 = SPIRead(Int_Req) & 0x80;
- if(temp == 0x00)
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- /****************************************************************/
- /*名称: Read_E2 */
- /*功能: 该函数实现从FM1702的EE中读出数据*/
- /*输入: lsb, EE地址(低字节) */
- /* msb, EE地址(高字节) */
- /* count, 待读出数据EE的字节个数*/
- /* buff, 指向待读出数据的指针*/
- /*输出: TRUE, EE数据正确读出*/
- /* FALSE, EE数据读出有误*/
- /****************************************************************/
- uchar Read_E2(uchar lsb, uchar msb, uchar count, uchar idata *buff)
- {
-
- uchar temp;
-
- *buff = lsb;
- *(buff + 1) = msb;
- *(buff + 2) = count;
- temp = Command_Send(3, buff, ReadE2);
- Read_FIFO(buff);
- if(temp == FALSE) return(TRUE);
- return(FALSE);
- }
- /****************************************************************/
- /*名称: Write_E2 */
- /*功能: 该函数实现向FM1702的EE中写入数据*/
- /*输入: lsb, EE地址(低字节) */
- /* msb, EE地址(高字节) */
- /* count, 待写入数据EE的字节个数*/
- /* buff, 指向待写入数据的指针*/
- /*输出: TRUE, EE数据正确写入*/
- /* FALSE, EE数据写入有误*/
- /****************************************************************/
- uchar Write_E2(uchar lsb, uchar msb, uchar count, uchar idata *buff)
- {
- uchar idata temp, i;
- for(i = 0; i < count; i++)
- {
- *(buff + count - i + 2) = *(buff - i + count);
- }
- *buff = lsb;
- *(buff + 1) = msb;
- temp = Command_Send(count + 2, buff, WriteE2);
- temp = SPIRead(SecondaryStatus);
- temp = temp & 0x40;
- if(temp == 0x40)
- {
- SPIWrite(Command,0x00); //added 2006/03/15
- return TRUE;
- }
- return FALSE;
- }
- /****************************************************************/
- /*名称: MIF_Halt */
- /*功能: 该函数实现暂停MIFARE卡*/
- /*输入: N/A */
- /*输出: FM1702_OK: 应答正确*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_NOTAGERR: 无卡*/
- /****************************************************************/
- uchar MIF_Halt(void)
- {
- uchar temp;
- uint i;
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- SPIWrite(ChannelRedundancy,0x03);
- *RevBuffer = RF_CMD_HALT;
- *(RevBuffer + 1) = 0x00;
- temp = Command_Send(2, RevBuffer, Transmit);
- if(temp == TRUE)
- {
- for(i = 0; i < 0x50; i++)
- {
- _nop_();
- }
- return FM1702_OK;
- }
- else
- {
- temp = SPIRead(ErrorFlag);
- if((temp & 0x02) == 0x02)
- {
- return(FM1702_PARITYERR);
- }
- if((temp & 0x04) == 0x04)
- {
- return(FM1702_FRAMINGERR);
- }
- return(FM1702_NOTAGERR);
- }
- }
- ///////////////////////////////////////////////////////////////////////
- // 转换密钥格式
- ///////////////////////////////////////////////////////////////////////
- char M500HostCodeKey( uchar *uncoded, uchar *coded)
- {
- char idata status = FM1702_OK;
- uchar idata cnt = 0;
- uchar idata ln = 0;
- uchar idata hn = 0;
- for (cnt = 0; cnt < 6; cnt++)
- {
- ln = uncoded[cnt] & 0x0F;
- hn = uncoded[cnt] >> 4;
- coded[cnt * 2 + 1] = (~ln << 4) | ln;
- coded[cnt * 2 ] = (~hn << 4) | hn;
- }
- return FM1702_OK;
- }
- /****************************************************************/
- /*名称: Load_keyE2 */
- /*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/
- /*输入: Secnr: EE起始地址*/
- /*输出: True: 密钥装载成功*/
- /* False: 密钥装载失败*/
- /****************************************************************/
- uchar Load_keyE2_CPY(uchar Secnr, uchar Mode)
- {
- char idata status;
- uchar temp;
- uchar msb = 0;
- uchar lsb = 0;
- uchar coded_keys[12];
- uchar temp1;
- if(Secnr >= 0x20)
- {
- temp1 = Secnr - 0x20;
- Secnr = 0x20 + temp1 * 4;
- }
- temp = Secnr * 12;
- if(Mode == RF_CMD_AUTH_LA)
- {
- if(temp >= 0x80)
- {
- lsb = temp - 0x80;
- msb = 0x01;
- }
- else
- {
- lsb = temp + 0x80;
- msb = 0x00;
- }
- }
- else
- {
- msb = 0x01;
- lsb = temp + 0x40;
- }
-
- status = M500HostCodeKey(&RevBuffer[3],coded_keys);////////////////
- status = Write_E2(lsb, msb, 12, coded_keys); ////////////////
- if(status != FM1702_OK)
- {
- return FALSE;
- }
- return TRUE;
- }
- /****************************************************************/
- /*名称: Load_keyE2 */
- /*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/
- /*输入: Secnr: EE起始地址*/
- /*输出: True: 密钥装载成功*/
- /* False: 密钥装载失败*/
- /****************************************************************/
- uchar Load_keyE2(uchar Secnr, uchar Mode)
- {
- uchar temp;
- uchar msb = 0;
- uchar lsb = 0;
- uchar temp1;
- if(Secnr >= 0x20)
- {
- temp1 = Secnr - 0x20;
- Secnr = 0x20 + temp1 * 4;
- }
- temp = Secnr * 12;
- if(Mode == RF_CMD_AUTH_LA)
- {
- if(temp >= 0x80)
- {
- lsb = temp - 0x80;
- msb = 0x01;
- }
- else
- {
- lsb = temp + 0x80;
- msb = 0x00;
- }
- }
- else
- {
- msb = 0x01;
- lsb = temp + 0x40;
- }
-
- RevBuffer[0] = lsb;
- RevBuffer[1] = msb;
-
- temp = Command_Send(2, RevBuffer, LoadKeyE2);
- temp = SPIRead(ErrorFlag) & 0x40;
- if(temp == 0x40)
- {
- return FALSE;
- }
- return TRUE;
- }
- /****************************************************************/
- /*名称: Request */
- /*功能: 该函数实现对放入FM1702操作范围之内的卡片的Request操作*/
- /*输入: mode: ALL(监测所以FM1702操作范围之内的卡片) */
- /* STD(监测在FM1702操作范围之内处于HALT状态的卡片) */
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_OK: 应答正确*/
- /* FM1702_REQERR: 应答错误*/
- /****************************************************************/
- uchar Request(uchar mode)
- {
-
- uchar idata temp;
-
- // SPIWrite(CRCPresetLSB,0x63); //CRCPresetLSB address is 0x23
- // SPIWrite(CWConductance,0x3f);
- RevBuffer[0] = mode;
- SPIWrite(Bit_Frame,0x07);
- SPIWrite(ChannelRedundancy,0x03);
- temp = SPIRead(Control);
- temp = temp & (0xf7);
- SPIWrite(Control,temp); //Control reset value is 00
- temp = Command_Send(1, RevBuffer, Transceive); //Transceive=0x1E
- if(temp == FALSE)
- {
- return FM1702_NOTAGERR;
- }
- Read_FIFO(RevBuffer);
- temp = Judge_Req(RevBuffer);
- if(temp == TRUE)
- {
- tagtype[0] = RevBuffer[0];
- tagtype[1] = RevBuffer[1];
- return FM1702_OK;
- }
- return FM1702_REQERR;
- }
- /****************************************************************/
- /*名称: AntiColl */
- /*功能: 该函数实现对放入FM1702操作范围之内的卡片的防冲突检测*/
- /*输入: N/A */
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_SERNRERR: 卡片序列号应答错误*/
- /* FM1702_OK: 卡片应答正确*/
- /****************************************************************/
- uchar AntiColl(void)
- {
-
- uchar temp;
- uchar i;
- uchar row, col;
- uchar pre_row;
-
- row = 0;
- col = 0;
- pre_row = 0;
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- // SPIWrite(ModConductance,0x3f);
- RevBuffer[0] = RF_CMD_ANTICOL;
- RevBuffer[1] = 0x20;
- SPIWrite(ChannelRedundancy,0x03);
- temp = Command_Send(2, RevBuffer, Transceive);
- while(1)
- {
- if(temp == FALSE)
- {
- return(FM1702_NOTAGERR);
- }
- //temp = ErrorFlag;
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return FM1702_BYTECOUNTERR;
- }
- Read_FIFO(RevBuffer);
- Save_UID(row, col, temp); /* 将收到的UID放入UID数组中 */
-
-
- temp = SPIRead(ErrorFlag); /* 判断接収数据是否出错 */
- temp = temp & 0x01;
- if(temp == 0x00)
- {
- temp = Check_UID(); /* 校验收到的UID */
- if(temp == FALSE)
- {
- return(FM1702_SERNRERR);
- }
- return(FM1702_OK);
- }
- else
- {
- temp = SPIRead(CollPos); /* 读取冲突检测寄存器 */
- row = temp / 8;
- col = temp % 8;
- RevBuffer[0] = RF_CMD_ANTICOL;
- Set_BitFraming(row + pre_row, col); /* 设置待发送数据的字节数 */
- pre_row = pre_row + row;
- for(i = 0; i < pre_row + 1; i++)
- {
- RevBuffer[i + 2] = UID[i];
- }
- if(col != 0x00)
- {
- row = pre_row + 1;
- }
- else
- {
- row = pre_row;
- }
- temp = Command_Send(row + 2, RevBuffer, Transceive);
- }
- }
- }
- /****************************************************************/
- /*名称: Select_Card */
- /*功能: 该函数实现对放入FM1702操作范围之内的某张卡片进行选择*/
- /*输入: N/A */
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_OK: 应答正确*/
- /* FM1702_SELERR: 选卡出错*/
- /****************************************************************/
- uchar Select_Card(void)
- {
-
- uchar temp, i;
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- RevBuffer[0] = RF_CMD_SELECT;
- RevBuffer[1] = 0x70;
- for(i = 0; i < 5; i++)
- {
- RevBuffer[i + 2] = UID[i];
- }
- SPIWrite(ChannelRedundancy,0x0f);
- temp = Command_Send(7, RevBuffer, Transceive);
- if(temp == FALSE)
- {
- return(FM1702_NOTAGERR);
- }
- else
- {
- temp = SPIRead(ErrorFlag);
- if((temp & 0x02) == 0x02) return(FM1702_PARITYERR);
- if((temp & 0x04) == 0x04) return(FM1702_FRAMINGERR);
- if((temp & 0x08) == 0x08) return(FM1702_CRCERR);
- temp = SPIRead(FIFO_Length);
- if(temp != 1) return(FM1702_BYTECOUNTERR);
- Read_FIFO(RevBuffer); /* 从FIFO中读取应答信息 */
- temp = *RevBuffer;
- if((temp == 0x18) || (temp == 0x08) || (temp == 0x88) || (temp == 0x53)) /* 判断应答信号是否正确 */
- return(FM1702_OK);
- else
- return(FM1702_SELERR);
- }
- }
- /****************************************************************/
- /*名称: Authentication */
- /*功能: 该函数实现密码认证的过程*/
- /*输入: UID: 卡片序列号地址*/
- /* SecNR: 扇区号*/
- /* mode: 模式*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_OK: 应答正确*/
- /* FM1702_AUTHERR: 权威认证有错*/
- /****************************************************************/
- uchar Authentication(uchar idata *UID, uchar SecNR, uchar mode)
- {
-
- uchar idata i;
- uchar idata temp, temp1;
- uchar temp0;
- if(SecNR >= 0x20)
- {
- temp0 = SecNR -0x20;
- SecNR = 0x20 + temp0 * 4;
- }
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- // SPIWrite(ModConductance,0X3f);
- // temp1 = SPIRead(Control);
- // temp1 = temp1 & 0xf7;
- // SPIWrite(Control,temp1);
- if(mode == RF_CMD_AUTH_LB)
- RevBuffer[0] = RF_CMD_AUTH_LB;
- else
- RevBuffer[0] = RF_CMD_AUTH_LA;
- RevBuffer[1] = SecNR * 4 + 3;
- for(i = 0; i < 4; i++)
- {
- RevBuffer[2 + i] = UID[i];
- }
- SPIWrite(ChannelRedundancy,0x0f);
- temp = Command_Send(6, RevBuffer, Authent1);
- if(temp == FALSE)
- {
-
- return 0x99;
- }
- temp = SPIRead(ErrorFlag); //ErrorFlag address is 0x0A.
- if((temp & 0x02) == 0x02) return FM1702_PARITYERR;
- if((temp & 0x04) == 0x04) return FM1702_FRAMINGERR;
- if((temp & 0x08) == 0x08) return FM1702_CRCERR;
- temp = Command_Send(0, RevBuffer, Authent2);
- if(temp == FALSE)
- {
-
- return 0x88;
- }
- temp = SPIRead(ErrorFlag);
- if((temp & 0x02) == 0x02) return FM1702_PARITYERR;
- if((temp & 0x04) == 0x04) return FM1702_FRAMINGERR;
- if((temp & 0x08) == 0x08) return FM1702_CRCERR;
- temp1 = SPIRead(Control);
- temp1 = temp1 & 0x08;
- if(temp1 == 0x08)
- {
- return FM1702_OK;
- }
- return FM1702_AUTHERR;
- }
- /****************************************************************/
- /*名称: MIF_Read */
- /*功能: 该函数实现读MIFARE卡块的数值*/
- /*输入: buff: 缓冲区首地址*/
- /* Block_Adr: 块地址*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_OK: 应答正确*/
- /****************************************************************/
- uchar MIF_READ(uchar idata *buff, uchar Block_Adr)
- {
-
- uchar idata temp;
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- SPIWrite(ModConductance,0x3f);
- SPIWrite(ChannelRedundancy,0x0f);
- buff[0] = RF_CMD_READ;
- buff[1] = Block_Adr;
- temp = Command_Send(2, buff, Transceive);
- if(temp == 0)
- {
- return FM1702_NOTAGERR;
- }
- temp = SPIRead(ErrorFlag);
- if((temp & 0x02) == 0x02) return FM1702_PARITYERR;
- if((temp & 0x04) == 0x04) return FM1702_FRAMINGERR;
- if((temp & 0x08) == 0x08) return FM1702_CRCERR;
- temp = SPIRead(FIFO_Length);
- if(temp == 0x10)
- {
- Read_FIFO(buff);
- return FM1702_OK;
- }
- else if(temp == 0x04)
- {
- Read_FIFO(buff);
- return FM1702_OK;
- }
- else
- {
- return FM1702_BYTECOUNTERR;
- }
- }
- /****************************************************************/
- /*名称: MIF_Write */
- /*功能: 该函数实现写MIFARE卡块的数值*/
- /*输入: buff: 缓冲区首地址*/
- /* Block_Adr: 块地址*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_NOTAUTHERR: 未经权威认证*/
- /* FM1702_EMPTY: 数据溢出错误*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_WRITEERR: 写卡块数据出错*/
- /* FM1702_OK: 应答正确*/
- /****************************************************************/
- uchar MIF_Write(uchar idata *buff, uchar Block_Adr)
- {
- uchar idata temp;
- uchar idata *F_buff;
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- F_buff = buff + 0x10;
- SPIWrite(ChannelRedundancy,0x07); /* Note: this line is for 1702, different from RC500*/
- *F_buff = RF_CMD_WRITE;
- *(F_buff + 1) = Block_Adr;
- temp = Command_Send(2, F_buff, Transceive);
- if(temp == FALSE)
- {
- return(FM1702_NOTAGERR);
- }
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return(FM1702_BYTECOUNTERR);
- }
- Read_FIFO(F_buff);
- temp = *F_buff;
- switch(temp)
- {
- case 0x00: return(FM1702_NOTAUTHERR);
- case 0x04: return(FM1702_EMPTY);
- case 0x0a: break;
- case 0x01: return(FM1702_CRCERR);
- case 0x05: return(FM1702_PARITYERR);
- default: return(FM1702_WRITEERR);
- }
- temp = Command_Send(16, buff, Transceive);
- if(temp == TRUE)
- {
- return(FM1702_OK);
- }
- else
- {
- temp = SPIRead(ErrorFlag);
- if((temp & 0x02) == 0x02)
- return(FM1702_PARITYERR);
- else if((temp & 0x04) == 0x04)
- return(FM1702_FRAMINGERR);
- else if((temp & 0x08) == 0x08)
- return(FM1702_CRCERR);
- else
- return(FM1702_WRITEERR);
- }
- }
- /****************************************************************/
- /*名称: MIF_Increment */
- /*功能: 该函数实现MIFARE卡自动增值操作*/
- /*输入: buff: 四个字节数值起始地址*/
- /* Block_Adr: 块地址*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_NOTAUTHERR: 未经权威认证*/
- /* FM1702_EMPTY: 数据溢出错误*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_INCRERR: 卡片增款操作失败*/
- /* FM1702_OK: 应答正确*/
- /****************************************************************/
- uchar MIF_Increment(uchar idata *buff, uchar Block_Adr)
- {
-
- uchar temp;
- uchar idata *F_buff;
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- F_buff = buff + 4;
- *F_buff = RF_CMD_INC;
- *(F_buff + 1) = Block_Adr;
- SPIWrite(ChannelRedundancy,0x07);
- temp = Command_Send(2, F_buff, Transceive);
- if(temp == FALSE)
- {
- return FM1702_NOTAGERR;
- }
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return FM1702_BYTECOUNTERR;
- }
- Read_FIFO(F_buff);
- temp = *F_buff;
- switch(temp)
- {
- case 0x00: /* break; */return(FM1702_NOTAUTHERR);
- case 0x04: return(FM1702_EMPTY);
- case 0x0a: break;
- case 0x01: return(FM1702_CRCERR);
- case 0x05: return(FM1702_PARITYERR);
- default: return(FM1702_INCRERR);
- }
-
- temp = Command_Send(4, buff, Transmit);
- if(temp == FALSE)
- {
- return FM1702_INCRERR;
- }
- return FM1702_OK;
- }
- /****************************************************************/
- /*名称: MIF_Decrement */
- /*功能: 该函数实现MIFARE卡自动减值操作*/
- /*输入: buff: 四个字节数值起始地址*/
- /* Block_Adr: 块地址*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_NOTAUTHERR: 未经权威认证*/
- /* FM1702_EMPTY: 数据溢出错误*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_DECRERR: 卡片扣款操作失败*/
- /* FM1702_OK: 应答正确*/
- /****************************************************************/
- uchar MIF_Decrement(uchar idata *buff, uchar Block_Adr)
- {
-
- uchar temp;
- uchar idata *F_buff;
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- F_buff = buff + 4;
- *F_buff = RF_CMD_DEC;
- *(F_buff + 1) = Block_Adr;
- SPIWrite(ChannelRedundancy,0x07);
- temp = Command_Send(2, F_buff, Transceive);
- if(temp == FALSE)
- {
- return FM1702_NOTAGERR;
- }
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return FM1702_BYTECOUNTERR;
- }
- Read_FIFO(F_buff);
- temp = *F_buff;
- switch(temp)
- {
- case 0x00: /* break; */return(FM1702_NOTAUTHERR);
- case 0x04: return(FM1702_EMPTY);
- case 0x0a: break;
- case 0x01: return(FM1702_CRCERR);
- case 0x05: return(FM1702_PARITYERR);
- default: return(FM1702_DECRERR);
- }
- temp = Command_Send(4, buff, Transmit);
- if(temp == FALSE)
- {
- return(FM1702_DECRERR);
- }
- return FM1702_OK;
- }
- /****************************************************************/
- /*名称: MIF_Restore */
- /*功能: 该函数实现MIFARE卡自动恢复,备份操作*/
- /*输入: Block_Adr: 块地址*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_NOTAUTHERR: 未经权威认证*/
- /* FM1702_EMPTY: 数据溢出错误*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_RESTERR: 卡片恢复,备份操作失败*/
- /* FM1702_OK: 应答正确*/
- /****************************************************************/
- uchar MIF_Restore(uchar Block_Adr)
- {
-
- uchar temp, i;
-
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- SPIWrite(ChannelRedundancy,0x07);
- *RevBuffer = RF_CMD_RESTORE;
- *(RevBuffer + 1) = Block_Adr;
- temp = Command_Send(2, RevBuffer, Transceive);
- if(temp == FALSE)
- {
- return FM1702_NOTAGERR;
- }
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return FM1702_BYTECOUNTERR;
- }
- Read_FIFO(RevBuffer);
- temp = *RevBuffer;
- switch(temp)
- {
- case 0x00: /* break; */return(FM1702_NOTAUTHERR);
- case 0x04: return(FM1702_EMPTY);
- case 0x0a: break;
- case 0x01: return(FM1702_CRCERR);
- case 0x05: return(FM1702_PARITYERR);
- default: return(FM1702_RESTERR);
- }
- for(i = 0; i < 4; i++) RevBuffer[i] = 0x00;
- temp = Command_Send(4, RevBuffer, Transmit);
- if(temp == FALSE)
- {
- return FM1702_RESTERR;
- }
- return FM1702_OK;
- }
- /****************************************************************/
- /*名称: MIF_Transfer */
- /*功能: 该函数实现MIFARE卡电子钱包保存操作*/
- /*输入: Block_Adr: 块地址*/
- /*输出: FM1702_NOTAGERR: 无卡*/
- /* FM1702_BYTECOUNTERR: 接收字节错误*/
- /* FM1702_NOTAUTHERR: 未经权威认证*/
- /* FM1702_EMPTY: 数据溢出错误*/
- /* FM1702_CRCERR: CRC校验错*/
- /* FM1702_PARITYERR: 奇偶校验错*/
- /* FM1702_TRANSERR: 卡片恢复,备份操作失败*/
- /* FM1702_OK: 应答正确*/
- /****************************************************************/
- uchar MIF_Transfer(uchar Block_Adr)
- {
-
- uchar temp;
- SPIWrite(CRCPresetLSB,0x63);
- SPIWrite(CWConductance,0x3f);
- SPIWrite(ChannelRedundancy,0x07);
- RevBuffer[0] = RF_CMD_TRANSFER;
- RevBuffer[1] = Block_Adr;
- temp = Command_Send(2, RevBuffer, Transceive);
- if(temp == FALSE)
- {
- return FM1702_NOTAGERR;
- }
- temp = SPIRead(FIFO_Length);
- if(temp == 0)
- {
- return FM1702_BYTECOUNTERR;
- }
- Read_FIFO(RevBuffer);
- temp = *RevBuffer;
- switch(temp)
- {
- case 0x00: /* break; */return(FM1702_NOTAUTHERR);
- case 0x04: return(FM1702_EMPTY);
- case 0x0a: return(FM1702_OK);
- case 0x01: return(FM1702_CRCERR);
- case 0x05: return(FM1702_PARITYERR);
- default: return(FM1702_TRANSERR);
- }
- }
- #if 0
- /****************************************************************/
- /*名称: HL_Active */
- /*功能: 该函数实现高级MIFARE卡激活命令*/
- /*输入: Secnr: 扇区号*/
- /* Block_Adr: 块地址*/
- /*输出: 操作状态码*/
- /* 读出数据存于RevBuffer中*/
- /****************************************************************/
- uchar HL_Active(uchar Block_Adr, uchar Mode)
- {
-
- uchar temp;
-
- Secnr = Block_Adr / 4;
- MIF_Halt(); /* Halt */
- temp = Request(RF_CMD_REQUEST_STD);
- if(temp != FM1702_OK)
- {
- return(FM1702_REQERR);
- }
- temp = AntiColl();
- if(temp != FM1702_OK)
- {
- return(FM1702_ANTICOLLERR);
- }
- temp = Select_Card();
- if(temp != FM1702_OK)
- {
- return(FM1702_SELERR);
- }
- Load_keyE2_CPY(Secnr, Mode); //%40
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1702SL开发板源码.rar
(42.75 KB, 下载次数: 37)
|