⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm1702.c

📁 利用目前最流行的低功耗TI430系列和复旦微电子的射频芯片FM1702sl读写Mifare1射频卡
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -