📄 fm1702.c
字号:
while(Temp!=0x00) Temp=ReadReg(0x01);
WriteReg(Page,0x00);
}
unsigned char Request(void)
{
WriteReg(TxControl,0x58);
delay(10);
WriteReg(TxControl,0x5b);
WriteReg(CRCPresetLSB,0x63); //
WriteReg(CWConductance,0x3f);
DataBuffer[0]=REQIDL;
WriteReg(BitFraming,0x07); //发送7bit
WriteReg(ChannelRedundancy,0x03); //关闭CRC
WriteReg(TxControl,0x5b); //
WriteReg(Control,0x01); //屏蔽CRYPTOL位
Command_Send(1,Transceive); //通过FM1702和ISO14443卡通讯
Read_FIFO();
if(DataBuffer[0]==4)
return(MI_OK);
else
return(MI_NOTHERE);
}
unsigned char Anticoll(void)
{
unsigned char RetChar=0,i;
WriteReg(CRCPresetLSB,0x63); //
WriteReg(CWConductance,0x3f); //
WriteReg(ModConductance,0x3f); //
WriteReg(ChannelRedundancy,0x03); //关闭CRC,打开奇偶校验
DataBuffer[0] = ANTICOLL;
DataBuffer[1] = 0x20;
Command_Send(2,Transceive);
Read_FIFO();
for (i=0; i<5; i++)//发送防冲撞指令,接收卡片序列号4字节
{
CardSnr[i] = DataBuffer[i];
RetChar = RetChar^CardSnr[i];
}
if(RetChar==0)
return(MI_OK);
else
return(MI_ERR);
}
unsigned char Select(void)
{
unsigned char i;
WriteReg(CRCPresetLSB,0x63); //
WriteReg(CWConductance,0x3f); //
DataBuffer[0] = SELECT;
DataBuffer[1] = 0x70;
for (i=0; i<5; i++)
{
DataBuffer[i+2] = CardSnr[i];
}
WriteReg(ChannelRedundancy,0x0f); //开CRC,打开奇偶校验
Command_Send(7,Transceive);
Read_FIFO();
if(DataBuffer[0]==0x08)
return(MI_OK);
else
return(MI_ERR);
}
/****************************************************************/
/*名称: Authentication */
/*功能: 验证卡片密码 */
/*输入: Auth_mode: */
/* 密码验证模式:0x60 - 验证A密钥;0x61-验证B密钥 */
/* SecNr: 扇区号(0~15) */
/*输出: 成功返回MI_OK */
/****************************************************************/
unsigned char Authentication(unsigned char Auth_mode,unsigned char SecNr)
{
unsigned char i,ln=0,hn=0;
if(!SecNr) //0扇区
{
CardKey[0] = CardSnr[3]^0x4d;
CardKey[1] = CardSnr[2]^0x53;
CardKey[2] = CardSnr[1]^0x53;
CardKey[3] = CardSnr[0]^0x18;
CardKey[4] = 0x00^0x1B;
CardKey[5] = 0xFF^0x1F;
}
else
{
CardKey[0] = Random[0]^0x4d;
CardKey[1] = Random[1]^0x53;
CardKey[2] = Random[2]^0x53;
CardKey[3] = Random[3]^0x18;
CardKey[4] = SecNr^0x1B;
CardKey[5] = (~SecNr)^0x1F;
}
for(i=0;i<6;i++)
{
ln = CardKey[i]&0x0f;
hn = CardKey[i]>>4;
DataBuffer[i*2+1]=(~ln << 4) | ln;
DataBuffer[i*2] =(~hn << 4) | hn;
}
Command_Send(12,LoadKey);
i=ReadReg(ErrorFlag)& 0x40;
if(i!= 0x40)
{
WriteReg(CRCPresetLSB,0x63);
WriteReg(CWConductance,0x3f);
WriteReg(ModConductance,0x3f);
i = ReadReg(Control);
i &=~BIT0;
WriteReg(Control,i);
DataBuffer[0] = Auth_mode;
DataBuffer[1] = SecNr*4+3;
for (i=0; i<4; i++)
DataBuffer[i+2] = CardSnr[i]; //4字节卡片序列号
WriteReg(ChannelRedundancy,0x0f); //开CRC,打开奇偶校验
Command_Send(6,Authent1);
i = ReadReg(ErrorFlag);
if((i&0x02)||(i&0x04)||(i&0x08))
return(MI_ERR);
Command_Send(0, Authent2);
if((i&0x02)||(i&0x04)||(i&0x08))
return(MI_ERR);
i = ReadReg(Control);
i = i & 0x08;
if(i == 0x08)
return(MI_OK);
}
return(MI_ERR);
}
/****************************************************************/
/*名称: ReadBlock */
/*功能: 读取M1卡一块数据 */
/*输入: Block_Addr:块地址 */
/*输出: 成功返回MI_OK */
/*说明:返回数据存放DataBuffer[]中 */
/****************************************************************/
unsigned char ReadBlock(unsigned char Block_Addr,unsigned char K)
{ //K=1,判断数据完整性,K=0不判断数据完整性
unsigned char i,XOR=0;
WriteReg(CRCPresetLSB,0x63);
WriteReg(CWConductance,0x3f);
WriteReg(ModConductance,0x3f);
WriteReg(ChannelRedundancy,0x0f);
DataBuffer[0] = READ; //Command
DataBuffer[1] = Block_Addr; //块地址
Command_Send(2,Transceive); //通讯操作
i = ReadReg(ErrorFlag);
if((i&0x02)||(i&0x04)||(i&0x08))
return(MI_ERR);
Read_FIFO();
if(K==1)
{
for(i=1;i<15;i++)
XOR+=DataBuffer[i];
if((DataBuffer[0]!=0x68)||(DataBuffer[15]!=XOR))
return(MI_ERR);
}
return(MI_OK);
}
/****************************************************************/
/*名称: WriteBlock */
/*功能: 写数据到M1卡一块 */
/*输入: Block_Addr:块地址 */
/*输出: 成功返回MI_OK */
/*说明:写数据DataBuffer[]到指定块 */
/****************************************************************/
unsigned char WriteBlock(unsigned char Block_Addr)
{
unsigned char i,Temp[2];
WriteReg(CRCPresetLSB,0x63);
WriteReg(CWConductance,0x3f);
WriteReg(ChannelRedundancy,0x07);
Temp[0]=DataBuffer[0];
Temp[1]=DataBuffer[1];
DataBuffer[0]=WRITE;
DataBuffer[1]=Block_Addr;
Command_Send(2,Transceive);
DataBuffer[0]=Temp[0];
DataBuffer[1]=Temp[1];
Command_Send(16,Transceive);
i = ReadReg(ErrorFlag);
if((i&0x02)||(i&0x04)||(i&0x08))
return(MI_ERR);
else
return(MI_OK);
}
/****************************************************************/
/*名称: Value */
/*功能: 扣款和充值 */
/*输入: Mode: 0xC0 = 扣款;0xC1 = 充值 */
/* Block_Addr: 块地址 */
/* Data0~Data3: 4字节增(减)值,低位在前 */
/*输出: 成功返回MI_OK */
/****************************************************************/
unsigned char Value(unsigned char Mode,unsigned char Block_Addr,unsigned char Data0,unsigned char Data1,unsigned char Data2,unsigned char Data3)
{
unsigned char Temp;
WriteReg(0x23,0x63);
WriteReg(0x12,0x3f);
DataBuffer[0]=Mode;
DataBuffer[1]=Block_Addr;
WriteReg(0x22,0x07);
Command_Send(2, Transceive);
Temp = ReadReg(FIFOLength);
if(Temp>0)
{
Read_FIFO();
if(DataBuffer[0]==0x0A)
{
DataBuffer[0]=Data0;
DataBuffer[1]=Data1;
DataBuffer[2]=Data2;
DataBuffer[3]=Data3;
Command_Send(4, Transmit);
DataBuffer[0] = TRANSFER;
DataBuffer[1] = Block_Addr;
Command_Send(2, Transceive);
Temp = ReadReg(FIFOLength);
if(Temp>0)
{
Read_FIFO();
if(DataBuffer[0]==0x0A)
return(MI_OK);
}
}
}
return MI_ERR;
}
/****************************************************************/
/*名称: Power_Off */
/*功能: 1702下电 */
/*输入: N/A */
/*输出: N/A */
/****************************************************************/
void Power_Off(void)
{
P1DIR &=~ (BIT0+BIT1+BIT3+BIT4);
P6DIR &=~ BIT2;
P6OUT &=~ BIT2;
}
/****************************************************************/
/*名称: Power_On */
/*功能: 1702上电 */
/*输入: N/A */
/*输出: N/A */
/****************************************************************/
void Power_On(void)
{
P1DIR |= (BIT0+BIT1+BIT3+BIT4);
P6DIR |= BIT2;
P6OUT |= BIT2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -