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

📄 main.#3

📁 12232液晶单片机驱动程序源代码
💻 #3
📖 第 1 页 / 共 5 页
字号:

   }
   return MI_OK;
}

///////////////////////////////////////////////////////////////////////
//认证操作函数
//MCU将运算获得的数据,备存储到卡片上的存储器之前,或MCU希望能读取Mifare 1
//卡片上的数据之前,程序员必须证明他的读/写请求操作是被允许的。
//                  A U T H E N T I C A T I O N   
//             W I T H   P R O V I D E D   K E Y S
//      auth_mode  =0x60 KEYA ,61 KEYB; *snr CARD NOM.;keys key;block 

///////////////////////////////////////////////////////////////////////
char Mf500PiccAuthKey(  unsigned char auth_mode,
                     unsigned char *snr,       
                     unsigned char *keys,      
                     unsigned char block)      
{
    
   unsigned char i = 0;
   status = MI_OK;
   PcdSetTmo(2);
   FlushFIFO();    // empty FIFO
   ResetInfo();
   //memcpy(MSndBuffer,keys,12);                  // write 12 bytes of the key
   for(i=0;i<12;i++)   MSndBuffer[i]=keys[i];
  // for(i=0;i<12;i++)   MSndBuffer[i]=0x0f;
   MInfo.nBytesToSend = 12;
    // write load command
    
   status=PcdSingleResponseCmd(PCD_LOADKEY);

   if (status == MI_OK)
   {      
      // execute authentication
      status = Mf500PiccAuthState(auth_mode,snr,block);     
 
   }  
   return status;
}


///////////////////////////////////////////////////////////////////////
//        S T O R E   K E Y S   I N   E E P R O M
///////////////////////////////////////////////////////////////////////

char Mf500PcdLoadKeyE2(unsigned char key_type,
                       unsigned char sector,
                       unsigned char *uncoded_keys)
{
   // eeprom address calculation
   // 0x80 ... offset
   // key_sector ... sector
   // 0x18 ... 2 * 12 = 24 = 0x18
    
    unsigned short e2addr = 0x80 + sector * 0x18;
//   unsigned short e2addr = 0x30 + sector * 0x18;  ///非密钥存贮区地址偏移
   unsigned char coded_keys[12];
   status = MI_OK;

   if (key_type == PICC_AUTHENT1B)
      e2addr += 12; // key B offset
   status = Mf500HostCodeKey(uncoded_keys,coded_keys);
   if(status == MI_OK)
      status = PcdWriteE2(e2addr,12,coded_keys);  

      return status;
}                                               
///////////////////////////////////////////////////////////////////////
//        A U T H E N T I C A T I O N   S T A T E S
///////////////////////////////////////////////////////////////////////
char Mf500PiccAuthState(   unsigned char auth_mode,
                        unsigned char *snr,
                        unsigned char block)
{
   
   unsigned char i = 0;
   status = MI_OK;

   status = ReadRC(RegErrorFlag) & 0xff;    // read error flags of the previous
                                    // key load
   if(status&0x40){
       // SendData("key erro is found");
   }
   if(status&0x20){
      //SendData("access erro");
   }
 
   if (status != MI_OK)
   {
     // SendData("erro have 1");
      if (status & 0x40)            // key error flag set
         status = MI_KEYERR;
      else
         status = MI_AUTHERR;       // generic authentication error 
   }
   else
   {
      PcdSetTmo(2);
      MSndBuffer[0] = auth_mode;        // write authentication command

      MSndBuffer[1] = block;    // write block number for authentication
    //  memcpy(MSndBuffer + 2,snr,4); // write 4 bytes card serial number 
      for(i=0;i<4;i++)   MSndBuffer[i+2]=snr[i];
      ResetInfo();
      MInfo.nBytesToSend = 6;
      status = PcdSingleResponseCmd(PCD_AUTHENT1);
      if (status == MI_OK)
      {
         if (ReadRC(RegSecondaryStatus) & 0x07) // RxLastBits mu?nbsp;leer sein
         {
            status = MI_BITCOUNTERR;
         }
         else
         {
            ResetInfo();
            MInfo.nBytesToSend = 0;
            if ((status = PcdSingleResponseCmd(PCD_AUTHENT2)) == MI_OK) 
            {
               if ( ReadRC(RegControl) & 0x08 ) // Crypto1 activated
               {
                   status = MI_OK;
               }
               else
               {
                   status = MI_AUTHERR;
               }
            }
         }
      }
   }
   return status;
}

/****************************************************************************
*                                                                           *
* Function:     mifs_read                                                   *
*                                                                           *
* Input:        Adr  //块                                                         *
* Output:       Data  //读出的数据                                                      *
*                                                                           *
****************************************************************************/
char Mf500PiccRead(  unsigned char addr,
                  unsigned char *mdata)
{
   
   char tmp    = 0;
   char i;

   status = MI_OK;

   FlushFIFO();    // empty FIFO

   PcdSetTmo(4);  // long timeout 设置定时器的分频值以及定时器重装载值

   WriteRC(RegChannelRedundancy,0x0F); // RxCRC, TxCRC, Parity enable
   
   ResetInfo();   
   MSndBuffer[0] = PICC_READ;   // read command code
   MSndBuffer[1] = addr;
   MInfo.nBytesToSend   = 2;   
   status = PcdSingleResponseCmd(PCD_TRANSCEIVE);

   if (status != MI_OK)
   {        
      if (status != MI_NOTAGERR )   // no timeout occured //此步好像永不满足
      {
         
         if (MInfo.nBitsReceived == 4)  // NACK
         {
            
             MRcvBuffer[0] &= 0x0f;  // mask out upper nibble
             if ((MRcvBuffer[0] & 0x0a) == 0)
             {
                status = MI_NOTAUTHERR;
                 
             }
             else
             {
                status = MI_CODEERR;
                  
             }
          }
      }                                         
       for(i=0;i<16;i++)   mdata[i]=0;                                             
   }
   else   // Response Processing
   {
         
      if (MInfo.nBytesReceived != 16)
      {
           
           status = MI_BYTECOUNTERR;
           for(i=0;i<16;i++)   mdata[i]=0;
      }
      else
      {
           
          for(i=0;i<16;i++)   mdata[i]=MRcvBuffer[i];
      }
   }
 
   PcdSetTmo(2);               // short timeout   
   return status; 
}

/****************************************************************************
*                                                                           *
* Function:     mifs_write                                                  *
*                                                                           *
* Input:        Adr, Data                                                   *
* Output:       -                                                           *
*                                                                           *
****************************************************************************/
char Mf500PiccWrite( unsigned char addr,
                  unsigned char *mdata)
{
  
   char i;

   status = MI_OK;
   PcdSetTmo(4);     // long timeout 

   WriteRC(RegChannelRedundancy,0x0F); // RxCRC, TxCRC, Parity enable
     
     ResetInfo();   
     MSndBuffer[0] = PICC_WRITE;        // Write command code
     MSndBuffer[1] = addr;
     MInfo.nBytesToSend   = 2;
     status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
/*
     if (status != MI_NOTAGERR)   // no timeout error   
     {
        if (MInfo.nBitsReceived != 4)   // 4 bits are necessary
        {
           status = MI_BITCOUNTERR;
             printf("\n write erro 1 \n");   
        }
        else                     // 4 bit received
        {
           MRcvBuffer[0] &= 0x0f; // mask out upper nibble
           switch(MRcvBuffer[0])
           {
              case 0x00: 
                 status = MI_NOTAUTHERR;
                 break;
              case 0x0a:
                 status = MI_OK;
                 break;
              default:
                 status = MI_CODEERR;
                 break;
           }
        }
       
     }else if(status != MI_OK)   { return  status;   printf("\n write erro mi_notagerr 11 \n");   }
 */       
     if ( status == MI_OK)
     {
        PcdSetTmo(4);     // long timeout 
        ResetInfo();   
        //memcpy(MSndBuffer,mdata,16);
        for(i=0;i<16;i++)   MSndBuffer[i]=mdata[i];
        MInfo.nBytesToSend   = 16;
        status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
   /*     
        if (status != MI_NOTAGERR)    // no timeout occured  
        {
           if (MInfo.nBitsReceived != 4)  // 4 bits are necessary
           {
              status = MI_BITCOUNTERR;
              printf("\n write erro 2 \n");
           }
           else                     // 4 bit received
           {
              MRcvBuffer[0] &= 0x0f; // mask out upper nibble
              switch(MRcvBuffer[0])
              {
                 case 0x00: 
                    status = MI_WRITEERR;
                    break;
                 case 0x0a:
                    status = MI_OK;
                    break;
                 default:
                    status = MI_CODEERR;
                    break;
              }
            }          
        }else { printf("\n write erro mi_notagerr 22 \n");   } 
*/
                       
        PcdSetTmo(2);    // short timeout
      }
         
  return status;
}

///////////////////////////////////////////////////////////////////////
//                V A L U E   M A N I P U L A T I O N 
///////////////////////////////////////////////////////////////////////
char Mf500PiccValue(unsigned char dd_mode, 
                   unsigned char addr, 
                   unsigned char *value,
                   unsigned char trans_addr)
{
   
   char i;
   status = MI_OK;
   PcdSetTmo(2);
   ResetInfo();   
////1//////////////////////////////////////////////////////////////////
   MSndBuffer[0] = dd_mode;        // Inc,Dec command code
   MSndBuffer[1] = addr;
   MInfo.nBytesToSend   = 2;
   status = PcdSingleResponseCmd(PCD_TRANSCEIVE);

   if (status != MI_NOTAGERR)   // no timeout error
   {
        if (MInfo.nBitsReceived != 4)   // 4 bits are necessary
        {
           status = MI_BITCOUNTERR;
        }
        else                     // 4 bit received
        {
           MRcvBuffer[0] &= 0x0f; // mask out upper nibble
           switch(MRcvBuffer[0])
           {
              case 0x00: 
                 status = MI_NOTAUTHERR;
                 break;
              case 0x0a:
                 status = MI_OK;
                 break;
              case 0x01:
                 status = MI_VALERR;
                 break;
              default:
                 status = MI_CODEERR;
                 break;
           }
        }
   }  // else if(status != MI_OK) { return status;}

/////2///////////////////////////////////////////////////
     if ( status == MI_OK)
     {
        PcdSetTmo(4);     // long timeout 
        ResetInfo();   
        //memcpy(MSndBuffer,value,4);
        for(i=0;i<4;i++)   MSndBuffer[i]=value[i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -