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

📄 prd_iso14443a_anticollision.c

📁 读RF卡的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
         // Note : g_bRFPicoReadBitCounter = (g_bPicoReadStatus & STATUS_NB_BITS) >> 4 = nb valid bits + 1
         if (l_bRFPicoReadBitCounter)
         {
            if (l_bRFPicoReadBitCounter==0x01) l_abBuffer[l_bTemp1]&=0x01;
            if (l_bRFPicoReadBitCounter<0x04) l_abBuffer[l_bTemp1]&=0x03;
            if (l_bRFPicoReadBitCounter>0x03) l_abBuffer[l_bTemp1]&=0x07;
            p_abUID[l_bOffsetSerial] |= l_abBuffer[l_bTemp1];
         }

         // INCREMENT OFFSET TO LOCATE END OF VALID SN
         l_bOffsetSerial = (l_bNVB>>0x04) + l_bCurrentSerial ;

         // CONFIGURE NEXT COMMAND (ANTICOLLISION OR SELECT)
         memcpy(&l_abBuffer[2],&p_abUID[l_bCurrentSerial],4);
         l_abBuffer[0] = l_bSEL;

         // CHECK IF COLLISION
         if(l_bStatus==ERR_COLL)
         {
            // DELAY 1MS
			for(l_bDelay=5;l_bDelay>0;l_bDelay--) delay_us(200);
		

            // SEND ANTICOLLISION COMMAND
            l_abBuffer[1] = 0x20 + l_bNVB;
            l_bDataBytesToSend=(l_bNVB>>0x04)+0x02;
            l_bDataBitsToSend=(l_bNVB & 0x0F);
            v_fnSendBuffer(0,l_bDataBytesToSend,l_bDataBitsToSend,&l_abBuffer[0],p_pStructReader);

			

            // NUMBER OF BITS TO RECEIVE
            if(l_bDataBitsToSend!=0x00) l_bBitsToReceive = 0x08-l_bDataBitsToSend;

            l_bStatus = ERR_COLL;
            l_bAnticolRetry++;
         }
      } while((l_bStatus || l_bNVB<0x40) && l_bAnticolRetry<32);
	  
	  l_bBitsToReceive=0;
      // NO MORE THAN 32 LOOPS
      if(l_bAnticolRetry>31) goto lbl_Retry;

      // SEND SELECT COMMAND
      p_abUID[l_bCurrentSerial+4] = 0x00; // Clear LRC from memory
      l_abBuffer[1] = 0x70;
      l_abBuffer[6] = l_abBuffer[2] ^ l_abBuffer[3] ^ l_abBuffer[4] ^ l_abBuffer[5]; // LRC
      v_fnSendBuffer(_SENDCRC,7,0,&l_abBuffer[0],p_pStructReader);
      l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive) ;
	  if (l_bStatus!= ERR_NO_ERROR)
	   {goto lbl_Retry;}
	    
	

      // CHECK IF ONE OTHER STAGE FOR THE SN
      if(!(bit_testChar(&l_abBuffer[0],2)))  break;

      // SHIFT POSITION FOR THE NEXT 4 BYTES SN STAGE
      l_bCurrentSerial =l_bCurrentSerial+4;

      // NEXT STAGE SELECTION 93->95->97
      l_bSEL += 2;

   } while(l_bCurrentSerial<=12);  // loop while SAK.2 = 1 (UID not complete)

    p_pStructReader->s_bRTimeoutUsed=TO_4MS83;

   // NUMBER OF BYTES OF UID
   *p_bUIDLength=l_bOffsetSerial-1;

   // HALT CHIP IF REQUESTED
   if ((p_pStructReader->s_bRAnticolOpt0 & ISOA0_HALT_0) || ((p_pStructReader->s_bRAnticolOpt0 & ISOA0_HALT_1) && !bit_testChar(&l_abBuffer[0],5)))
   {
      // SEND HALT COMMAND
      l_abBuffer[0] = _ISOA_HALT_0;
      l_abBuffer[1] = _ISOA_HALT_1;
      v_fnSendBuffer(_SENDCRC,2,0,&l_abBuffer[0],p_pStructReader);

      // ANTICOLLISION OK EVEN IF HALT DIDN'T WORK
      l_bStatus=ERR_NO_ERROR;
      return TRUE;
   }

   // RATS COMMAND SENT IF REQUESTED
   if (bit_testChar(&l_abBuffer[0],5) && (p_pStructReader->s_bRAnticolOpt0 & ISOA0_RATS))
   {
      // SEND RATS COMMAND AND RECEIVE ATS RESPONSE
      l_abBuffer[0] = _ISOA_RATS;
      l_abBuffer[1] = p_pStructReader->s_bRFrameSizeUsed;
      v_fnSendBuffer(_SENDCRC,2,0,&l_abBuffer[0],p_pStructReader);
      l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
	  if(l_bStatus!=ERR_NO_ERROR)
      {
         v_fnSendBuffer(_SENDCRC,2,0,&l_abBuffer[0],p_pStructReader);
         l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
		 if(l_bStatus!=ERR_NO_ERROR) goto lbl_Retry;
      }

      // CONFIGURE SPEED, FRAME SIZE AND TIMEOUT ACCORDING TO ATS RESPONSE AND READER CONFIG
      if(l_abBuffer[0]>1)
      {
         if(p_pStructReader->s_bRFrameSizeMax & P1_USE_CHIP_FS)
         {
            if(((l_abBuffer[1] & 0x0F)<<0x04) > (p_pStructReader->s_bRFrameSizeMax & 0xF0)) p_pStructReader->s_bRFrameSizeUsed=p_pStructReader->s_bRFrameSizeMax & 0xFE;
            else p_pStructReader->s_bRFrameSizeUsed=((l_abBuffer[1] & 0x0F)<<0x04);
         }
         if (bit_testChar(&l_abBuffer[1],4)) // TA present
         {
            if(p_pStructReader->s_bReaderSupportedSpeed & P0_USE_CHIP_BR)
            {
               p_pStructReader->s_bCommunicationSupportedSpeed=(l_abBuffer[2] & p_pStructReader->s_bReaderSupportedSpeed);
               if (bit_testChar(&l_abBuffer[2],7)) // Same speed during emission and reception
               {
                  p_pStructReader->s_bCommunicationSupportedSpeed &= ((p_pStructReader->s_bCommunicationSupportedSpeed & 0xF0) >> 0x04);
                  p_pStructReader->s_bCommunicationSupportedSpeed |= ((p_pStructReader->s_bCommunicationSupportedSpeed & 0x0F) << 0x04);
               }
            }
         }
         if (bit_testChar(&l_abBuffer[1],5)) // TB present
         {
            l_bSFGT=1;
            v_fnDefineTimeout(l_abBuffer[2+bit_testChar(&l_abBuffer[1],4)] & 0x0F); // begin SFGT delay count
            v_fnTimeOutStart();

            if(p_pStructReader->s_bRTimeoutDefault & USE_CHIP_TO)p_pStructReader->s_bRTimeoutUsed=((l_abBuffer[2+bit_testChar(&l_abBuffer[1],4)]&0xF0)>>4);
            else p_pStructReader->s_bRTimeoutUsed=p_pStructReader->s_bRTimeoutDefault & 0xEF;
         }
         // TC not take into account
      }

      // PPS COMMAND SENT IF SPEED NEEDS TO BE CHANGED
      if ((p_pStructReader->s_bCommunicationSupportedSpeed & 0x77) != (P0_S106K | P0_R106K))
      {
         // SEND RATS COMMAND AND RECEIVE ATS RESPONSE
         l_abBuffer[0] = _ISOA_PPS;
         l_abBuffer[1] = _ISOA_PPS_0;
         l_abBuffer[2] = 0x00;
         if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,2)) l_abBuffer[2]=0x03;
         else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,1)) l_abBuffer[2]=0x02;
         else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,0)) l_abBuffer[2]=0x01;

         if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,6)) l_abBuffer[2]|=0x0C;
         else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,5)) l_abBuffer[2]|=0x08;
         else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,4)) l_abBuffer[2]|=0x04;

         while(l_bSFGT && !bit_testTimer0MR0IF()); // end of SFGT delay

         v_fnSendBuffer(_SENDCRC,3,0,&l_abBuffer[0],p_pStructReader);
         l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
		 if(l_bStatus != ERR_NO_ERROR)
         {
            v_fnSendBuffer(_SENDCRC,3,0,&l_abBuffer[0],p_pStructReader);
            l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
			if(l_bStatus != ERR_NO_ERROR) goto lbl_Retry;
         }

         // CHANGE READER SPEED
         v_fnConfigBitRate(p_pStructReader->s_bCommunicationSupportedSpeed,&l_bRFReceiveEOF, p_pStructReader);
      }
      else while(l_bSFGT && !bit_testTimer0MR0IF()); // end of SFGT delay

      // DESELECT CHIP IF REQUESTED
      if (p_pStructReader->s_bRAnticolOpt0 & ISOA0_DESELECT)
      {
         // SEND DESELECT COMMAND
         l_abBuffer[0] = _ISOA_DESELECT;
         v_fnSendBuffer(_SENDCRC,1,0,&l_abBuffer[0],p_pStructReader);
         l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
		 if(l_bStatus!= ERR_NO_ERROR) goto lbl_Retry;
      }
   }

   return TRUE;

   lbl_Retry:
   if(l_bRetry--)
   {
      if(p_pStructReader->s_bRAnticolOpt1&ISOA1_RESET)
      {
         v_fnCS_reset();
         v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1);
         // DELAY 2MS
         for(l_bDelay=10;l_bDelay>0;l_bDelay--) delay_us(200);
         v_fnCS_reset();
         v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1 | P0_RFON);
         // DELAY 5MS
         for(l_bDelay=25;l_bDelay>0;l_bDelay--) delay_us(200);
      }
      else
      {
         // DELAY 520US
         for(l_bDelay=4;l_bDelay>0;l_bDelay--) delay_us(130);
      }
      goto lbl_Loop;
   }
   return FALSE;
}

⌨️ 快捷键说明

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